例子 :
https://www.zabbix.com/documentation/3.4/zh/manual/config/triggers/expression #官网
触发器名称:Processor load is too high on host
{host:system.cpu.load[all,avg1].last(0)}>5
触发器说明:
host:host名称
system.cpu.load[all,avg1]:item值,一分内cpu平均负载值
last(0):最新值
>5:最新值大于5
如上所示,www.zabbix.com这个主机的监控项,最新的CPU负载值如果大于5,那么表达式会返回true,这样一来触发器状态就改变为“problem”了
触发器名称:www.zabbix.com is overloaded
{host:system.cpu.load[all,avg1].last(0)}>5|{www.zabbix.com:system.cpu.load[all,avg1].min(10m)}>2
当前cpu负载大于5或者最近10分内的cpu负载大于2,那么表达式将会返回true.
触发器名称:/etc/passwd has been changed 使用函数 diff():
{host:vfs.file.cksum[/etc/passwd].diff(0)}>0
/etc/passwd最新的checksum与上一次获取到的checksum不同,表达式将会返回true. 我们可以使用同样的方法监控系统重要的配置文件,例如/etc/passwd,/etc/inetd.conf等等。这些zabbix一般都会自带,没带的你自己加上吧
触发器名称:Someone is downloading a large file from the Internet 使用函数 min:
{host:net.if.in[eth0,bytes].min(5m)}>100K
当前主机网卡eth0最后5分钟内接收到的流量超过100KB那么触发器表达式将会返回true
触发器名称:Both nodes of clustered SMTP server are down
{smtp1.zabbix.com:net.tcp.service[smtp].last(0)}=0 & {smtp2.zabbix.com:net.tcp.service[smtp].last(0)}=0
当smtp1.zabbix.com和smtp2.zabbix.com两台主机上的SMTP服务器都离线,表达式将会返回true
触发器名称:Zabbix agent needs to be upgraded 使用函数str():
{zabbix.zabbix.com:agent.version.str("beta8")}=1
如果当前zabbix agent版本包含beta8(假设当前版本为1.0beta8),这个表达式会返回true
触发器名称:Server is unreachable
{zabbix.zabbix.com:icmpping.count(30m,0)}>5
如上表达式表示最近30分钟zabbix.zabbix.com这个主机超过5次不可到达
触发器名称:No heartbeats within last 3 minutes 使用函数 nodata():
{zabbix.zabbix.com:tick.nodata(3m)}=1
tick为Zabbix trapper类型,首先我们要定义一个类型为Zabbix trapper,key为tick的item。我们使用zabbix_sender定期发送数据给tick,如果在3分钟内还未收到zabbix_sender发送来的数据,那么表达式返回一个true,与此同时触发器的值变为“PROBLEM”
触发器名称:CPU activity at night time 使用函数 time():
{zabbix:system.cpu.load[all,avg1].min(5m)}>2 & {zabbix:system.cpu.load[all,avg1].time(0)}>000000 & {zabbix:system.cpu.load[all,avg1].time(0)}<060000
只有在凌晨0点到6点整,最近5分钟内cpu负载大于2,表达式返回true,触发器的状态变更为“problem”
触发器名称:Check if client local time is in sync with Zabbix server time 使用函数 fuzzytime():
{MySQL_DB:system.localtime.fuzzytime(10)}=0
主机MySQL_DB当前服务器时间如果与zabbix server之间的时间相差10秒以上,表达式返回true,触发器状态改变为“problem”
触发器名称:Comparing average load today with average load of the same time yesterday (使用 time_shift 时间偏移量参数).
{server:system.cpu.load.avg(1h)} / {server:system.cpu.load.avg(1h,1d)}>2
This expression will fire if the average load of the last hour tops the average load of the same hour yesterday more than two times.
最新一小时的平均负载峰值超过昨天同时段指标两次进行报警
特性之Hysteresis(迟滞,滞后):
简单的说触发器状态转变为problem需要一个条件,从problem转变回来还需要一个条件才行。一般触发器只需要不满足触发器为problem条件即可恢复。明白了么?不明白就看例子吧。 有时候触发器需要使用不同的条件来表示不同的状态,举个官网很有趣的例子:机房温度正常稳定为15-20°,当温度超过20°,触发器值为problem,当前情况下,只有温度处在这个温度之间触发器值才会为FALSE。(慢慢理解,这个表达式有点绕) 为了达到这个效果,我们需要使用如下触发器表达式:
触发器名称:Temperature in server room is too high
({TRIGGER.VALUE}=0&{server:temp.last(0)}>20) | ({TRIGGER.VALUE}=1&{server:temp.last(0)}<15)
注意:宏变量 {TRIGGER.VALUE}将会返回当前触发器的值
触发器名称:Free disk space is too low Problem: 最近5分钟内剩余磁盘空间小于10GB。 Recovery: 最近10分钟内磁盘空间大于40GB
({TRIGGER.VALUE}=0&{server:vfs.fs.size[/,free].max(5m)}<10G) | ({TRIGGER.VALUE}=1&{server:vfs.fs.size[/,free].min(10m)}<40G)
参数 :
https://www.zabbix.com/documentation/3.4/zh/manual/appendix/triggers/functions #官网
Zabbix触发器的语法如下:
{<server>:<key>.<function>(<parameter>)}<operator><constant>
用Template App Zabbix Agent模板中的主机ping监控的触发器来进行说明:
{Template App Zabbix Agent:agent.ping.nodata(5m)}=1
<server> Template App Zabbix Agent #即监控模板
<key> agent.ping #即监控模板里的项目Items
<function> nodata() #及项目所使用的方法
<parameter> 5m #及方法所使用的参数
<operator> #操作人,选填
<constant> #持续性,选填
(#5) #五个最新值的平均值
(1h) #一个小时的平均值
(1h,1d) #一天前一个小时的平均值。
类型 : 浮点数(float), 整数(int), 字符(str), 文本(text), 日志(log)
abschange #最近获取值与之前获取值差的绝对值
支持值的类型: float, int, str, text, log
返回值 : 0 - 两值相等
1 - 两值不等
例子 : (最近获取值;之前获取值=abschange)
3;1=2
0;-2.5=2.5
avg (sec|#num,<time_shift>) #返回一段时间的平均值
参数:秒或#num
支持值的类型: float, int
例如 : ⇒ avg(#5) → 五个最新值的平均值
⇒ avg(1h) → 一个小时的平均值
⇒ avg(1h,1d) → 一天前一个小时的平均值。
band (sec|#num,mask,<time_shift>) #项目值和掩码的按位与值
参数:#num 参数和其它一些函数的作用不通 (参照 last()).
支持值的类型: int
注意此处的 #num 参数和其它一些函数的作用不用 (参照 last()).
尽管以二进制方式进行比较,但是所有的参数和返回值都是十进制数。 例如, 检查第三位是和4做比较而不是100。
例如 : ⇒ band(,12)=8 or band(,12)=4 → 第三位和第四位被设置,但不是同时
⇒ band(,20)=16 → 第三位没有被设置但是第五位被设置了。
change #返回最近获得值与之前获得值的差值,对于字符串0表示相等,1表示不同
支持的值类型: float, int, str, text, log
change(0)>n:忽略参数一般输入0,表示最近得到的值与上一个值的差值大于n
例如: (最近获取值;之前获取值=change)
3;1=-2
0;-2.5=-2.5
count (sec|#num,<pattern>,<operator>,<time_shift>) #返回指定时间间隔内数值的统计
支持值的类型: float, int, str, text, log
参数:秒或#num
举例:
count(600)最近10分钟得到值的个数
count(600,12)最近10分钟得到值的个数等于12
count(600,12,"gt")最近10分钟得到值的个数大于12
count(#10,12,"gt")最近10个值中,值大于12的个数
count(600,12,"gt",86400)24小时之前的10分钟内值大于12的个数
count(600,6/7,"band")-过去10分钟值最低三个有效位是 '110' (十进制)的个数
count(600,,,86400)24小时之前的10分钟数据值的个数
第一个参数:指定时间段
第二个参数:样本数据
第三个参数:操作参数
第四个参数:漂移参数
#支持的操作类型
eq: 相等
ne: 不相等
gt: 大于
ge: 大于等于
lt: 小于
le: 小于等于
like: 内容匹配
last (sec|#num,<time_shift>) #最近的值,如果为秒,则忽略,#num表示最近第N个值,请注意当前的#num和其他一些函数的#num的意思是不同的
参数:秒或#num
支持值类型:float,int,str,text,log
例如:
last(0)等价于last(#1)
last(#3)表示最近**第**3个值(并不是最近的三个值)
本函数也支持第二个参数**time_shift**,例如
last(0,86400)返回一天前的最近的值
如果在history中同一秒中有多个值存在,Zabbix不保证值的精确顺序
logeventid (pattern) #检查最近的日志条目的EventID是否匹配正则表达式.参数为正则表达式,POSIX扩展样式.当返回值为0时表示不匹配,1表示匹配
参数:string
支持值类型:log
max (sec|#num,<time_shift>) #返回指定时间间隔的最大值.时间间隔作为第一个参数可以是秒或收集值的数目(前缀为#)
参数:秒或#num
支持值类型:float,int
min (sec|#num,<time_shift>) #返回指定时间间隔的最小值.时间间隔作为第一个参数可以是秒或收集值的数目(前缀为#)
参数:秒或#num
支持值类型:float,int
nodata (sec) #当返回值为1表示指定的间隔(间隔不应小于30秒)没有接收到数据,0表示其他
参数:秒
支持值类型:any
返回值:
1 - 指定评估期没有接收到数据
0 - 其它
now #返回距离Epoch(1970年1月1日00:00:00UTC)时间的秒数
支持值类型:any
date #返回当前的时间,格式YYYYMMDD
支持值的类型: any
返回值如: 20150731
percentile (sec|#num,<time_shift>,percentage) #一段时间的百分值,(percentage) 做为第三个参数
支持值的类型: float, int
percentage - 0 and 100 (包括)之间的一个浮点数,小数点后最多四位
sec or #num - 评估期以秒值或最新值个数(跟在#号后)表示time_shift (可选) - see avg()
prev #返回之前的值,类似于last(#2)
支持值类型:float,int,str,text,log
regexp (pattern,<sec|#num>) #检查最近的值是否匹配正则表达式,参数的正则表达式为POSIX扩展样式,第二个参数为秒数或收集值的数目,将会处理多个值.本函数区分大小写。当返回值为1时表示找到,0为其他
参数:第一个参数为string,第二个参数为秒或#num
支持值类型:str,log,text
返回值:
1 - 找到
0 - 其它
该函数区分大小写
str (pattern,<sec|#num>) #查找最近值中的字符串。第一个参数指定查找的字符串,大小写敏感。第二个可选的参数指定秒数或收集值的数目,将会处理多个值。当返回值为1时表示找到,0为其他
参数:第一个参数为string,第二个参数为秒或#num
支持值类型:str,log,text
返回值:
1 - 找到
0 - 其它
该函数区分大小写
strlen (sec|#num,<time_shift>) #指定最近值的字符串长度(并非字节),参数值类似于last函数.例如strlen(0)等价于strlen(#1),strlen(#3)表示最近的第三个值,strlen(0,86400)表示一天前的最近的值
参数:秒或#num
支持值类型:str,log,text
例如:
⇒ strlen()(等同于 strlen(#1)) → 最新值的长度
⇒ strlen(#3) → 最新的第三个值的长度
⇒ strlen(,1d) → 一天前最新值的长度。
sum (sec|#num,<time_shift>) #返回指定时间间隔中收集到的值的总和.时间间隔作为第一个参数支持秒或收集值的数目(以#开始).从Zabbix1.8.2开始,本函数支持time_shift作为第二个参数。可以查看avg函数获取它的用法
参数:秒或#num
支持值类型:float,int
time #返回当前时间,格式为HHMMSS,例如123055
支持值类型:any
timeleft (sec|#num,<time_shift>,threshold,<fit>) #达到阀值需要多久时间
例如:
⇒ timeleft(#10,,0) → 根据最新的十个值估计项目值达到0需要的时间
⇒ timeleft(1h,,100) → 根据过去一小时的值估计项目值达到100需要的时间
⇒ timeleft(1h,1d,0) → 根据一天前的一个小时值估计项目值达到0需要的时间
⇒ timeleft(1h,,200,polynomial2) → 根据过去一小时并按照二次多项式方式估计项目值达到200需要的时间
dayofmonth #返回当前是本月的第几天(取值范围从1到31)
支持值的类型: any
dayofweek #返回当前是本周的第几天
支持值的类型: any
delta (sec|#num,<time_shift>) #返回时间间隔内的最大值与最小值的差值
参数:秒或#num
支持类型:float,int
diff #返回值为1表示最近的值与之前的值不同,0为相同
支持值类型:float,int,str,text,log
forecast (sec|#num,<time_shift>,time,<fit>,<mode>) #预算下一个值的最大值,最小值,差值或平均值
支持值的类型: float, int
例如:
⇒ forecast(#10,,1h) → 根据最新的十个值估计一小时后的数值
⇒ forecast(1h,,30m) → 根据过去一小时的值估计三十分钟后的数值
⇒ forecast(1h,1d,12h) → 根据一天前的一个小时值估计十二个小时后的数值
⇒ forecast(1h,,10m,exponential) → 根据过去一小时并按照指数函数方式估计十分钟后的数值
⇒ forecast(1h,,2h,polynomial3,max) → 根据过去一小时并按照三次多项式方式估计两小时的最大数值
⇒ forecast(#2,,-20m) → 根据最新的两个值估计二十分钟前的数值 (比使用last()或prev()函数更加精确, 特别是项目很少更新的时候, 比如说, 一小时一次)
fuzzytime (sec) #返回值为1表示监控项值的时间戳与ZabbixServer的时间多N秒,0为其他.常使用system.localtime来检查本地时间是否与Zabbixserver时间相同
参数:秒
支持值类型:float,int
例如:
⇒ fuzzytime(60)=0 → 如果时间差超过60秒,就会检测到一个问题
⇒ vfs.file.time[/path/file,modify]键值检测文件是否长时间未更新
iregexp (pattern,<sec|#num>) #该函数和 regexp() 类似,只是不区分大小写
支持值的类型: str, log, text
logseverity #
返回最近日志条目的日志等级(logseverity).当返回值为0时表示默认等级,N为具体对应等级(整数,常用于Windowseventlogs).Zabbix日志等级来源于Windowseventlog的Information列
支持值类型:log
返回值:
0 - 默认等级
N - 对应的等级 (整数,常用语Windows event logs: 1 - Information, 2 - Warning, 4 - Error, 7 - Failure Audit, 8 - Success Audit, 9 - Critical, 10 - Verbose).
Zabbix从Windows event log Information域获取日志等级
logsource (pattern) #检查最近的日志条目是否匹配参数的日志来源.当返回值为0时表示不匹配,1表示匹配。通场用于Windowseventlogs监控.例如logsource["VMWareServer"]
参数:string
支持值类型:log
返回值:
0 - 不匹配
1 - 匹配
通常用于Windows event logs. 例如, logsource("VMware Server")
<parameter>参数
常用的时间参数有以下几种:
s - seconds (when used, works the same as the raw value)
m - minutes
h - hours
d - days
w - weeks
也支持使用容量参数:
K - kilo
M - mega
G - giga
T - tera
举例参数的等效转换,参数1中的参数可以等效使用参数2中的进行替换:
参数1:
{host:zabbix[proxy,zabbix_proxy,lastaccess]}>120
{host:system.uptime[].last(0)}<86400
{host:system.cpu.load.avg(600)}<10
参数2:
{host:zabbix[proxy,zabbix_proxy,lastaccess]}>2m
{host:system.uptime.last(0)}<1d
{host:system.cpu.load.avg(10m)}<10
优先级 |
操作符 |
定义 |
1 |
/ |
除 |
2 |
* |
乘 |
3. |
- - - - - - |
减 |
4 |
+ |
加 |
5 |
< |
小于 , 用法 : A < B ⇔ (A <= B - 0.000001) |
6 |
> |
大于 , 用法 : A > B ⇔ (A>= B + 0.000001) |
7 |
# |
不等于 , 用法 : A # B⇔(A<= B - 0.000001) | (A >= B + 0.000001) |
8 |
= |
等于 , 用法 : A = B ⇔ (A > B - 0.000001) & (A < B + 0.000001) |
9 |
& |
逻辑与 |
10 |
| |
逻辑或 |
在表达式中#可以有更多的作用:
sum(600):表示在600秒之内接收到所有值的和
sum(#5):表示最后5个值的和
如果最近的获取的5个值为3, 7, 2, 6, 5
last(#2) would return 7
last(#5) would return 5