Zabbix触发器的语法如下:

{:.()}<operator>

用Template App Zabbix Agent模板中的主机ping监控的触发器来进行说明:

{Template App Zabbix Agent:agent.ping.nodata(5m)}=1

Template App Zabbix Agent 即监控模板 agent.ping 即监控模板里的项目Items <function> nodata() 及项目所使用的方法 5m 及方法所使用的参数
  操作人,选填
  持续性,选填

对于Zabbix支持的function,参考官网:https://www.zabbix.com/documentation/2.2/manual/appendix/triggers/functions

1.abschange
参数:忽略
支持类型:float,int,str,text,log
作用:返回最近获得的值与之前获得值差的绝对值,对于字符串类型:0表示相等,1表示不同 
2.avg
参数:秒或#num
支持类型:float,int 作用:返回一段时间的平均值
举例:
avg(5):最后5秒的平均值
avg(#5):表示最近5次得到值的平均值
avg(3600,86400):表示一天前的一个小时的平均值
如果仅有一个参数,表示指定时间的平均值,从现在开始算起,如果有第二个参数,表示漂移,从第二个参数前开始算时间,
#n表示最近n次的值
3.change
参数:忽略
支持类型:float,int,str,text,log
作用:返回最近获得值与之前获得值的差值,对于字符串0表示相等,1表示不同
举例:
change(0)>n:忽略参数一般输入0,表示最近得到的值与上一个值的差值大于n 
4.count
参数:秒或#num
支持类型:float,int,str,text,log
作用:返回指定时间间隔内数值的统计,
举例:
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")-thenumberofvaluesforlast10minuteshaving'110'(inbinary)inthe3leastsignificantbits.
count(600,,,86400)24小时之前的10分钟数据值的个数
第一个参数:指定时间段
第二个参数:样本数据
第三个参数:操作参数
第四个参数:漂移参数
#支持的操作类型
eq: 相等
ne: 不相等
gt: 大于
ge: 大于等于
lt: 小于
le: 小于等于
like: 内容匹配
5.date 参数:忽略
支持类型:any
作用:返回当前的时间,格式YYYYMMDD
6.dayofmonth
返回当前是本月的第几天
7.dayofweek
返回当前是本周的第几天
8.delta
参数:秒或#num
支持类型:floatint 作用:返回时间间隔内的最大值与最小值的差值
9.diff 参数:忽略
支持值类型:float,int,str,text,log
作用:返回值为1表示最近的值与之前的值不同,0为其他情况
10.fuzzytime
参数:秒
支持值类型:float,int 作用:返回值为1表示监控项值的时间戳与ZabbixServer的时间多N秒,0为其他.常使用system.localtime来检查本地时间是否与Zabbixserver时间相同.
11.last 参数:秒或#num
支持值类型:float,int,str,text,log
作用:最近的值,如果为秒,则忽略,#num表示最近第N个值,请注意当前的#num和其他一些函数的#num的意思是不同的 last(0)等价于last(#1)last(#3)表示最近**第**3个值(并不是最近的三个值)
本函数也支持第二个参数**time_shift**,例如 last(0,86400)返回一天前的最近的值
如果在history中同一秒中有多个值存在,Zabbix不保证值的精确顺序
#num从Zabbix1.6.2起开始支持,timeshift从1.8.2其开始支持,可以查询avg()函数获取它的使用方法
12.logeventid
参数:string 支持值类型:log
描述:检查最近的日志条目的EventID是否匹配正则表达式.参数为正则表达式,POSIX扩展样式.当返回值为0时表示不匹配,1表示匹配。该函数从Zabbix1.8.5起开始支持.
13.logseverity
参数:忽略
支持值类型:log
描述:返回最近日志条目的日志等级(logseverity).当返回值为0时表示默认等级,N为具体对应等级(整数,常用于Windowseventlogs).Zabbix日志等级来源于Windowseventlog的Information列.
14.logsource
参数:string 支持值类型:log
描述:检查最近的日志条目是否匹配参数的日志来源.当返回值为0时表示不匹配,1表示匹配。通场用于Windowseventlogs监控.例如logsource["VMWareServer"]
14.max
参数:秒或#num
支持值类型:float,int 描述:返回指定时间间隔的最大值.时间间隔作为第一个参数可以是秒或收集值的数目(前缀为#).从Zabbix1.8.2开始,函数支持第二个可选参数time_shift,可以查看avg()函数获取它的使用方法.
15.min
参数:秒或#num
支持值类型:float,int 描述:返回指定时间间隔的最小值.时间间隔作为第一个参数可以是秒或收集值的数目(前缀为#).从Zabbix1.8.2开始,函数支持第二个可选参数time_shift,可以查看avg()函数获取它的使用方法.
16.nodata
参数:秒
支持值类型:any
描述:当返回值为1表示指定的间隔(间隔不应小于30秒)没有接收到数据,0表示其他.
17.now
参数:忽略
支持值类型:any
描述:返回距离Epoch(1970年1月1日00:00:00UTC)时间的秒数
18.prev
参数:忽略
支持值类型:float,int,str,text,log
描述:返回之前的值,类似于last(#2)
19.regexp
参数:第一个参数为string,第二个参数为秒或#num
支持值类型:str,log,text
描述:检查最近的值是否匹配正则表达式,参数的正则表达式为POSIX扩展样式,第二个参数为秒数或收集值的数目,将会处理多个值.本函数区分大小写。当返回值为1时表示找到,0为其他.
20.str
参数:第一个参数为string,第二个参数为秒或#num
支持值类型:str,log,text
描述:查找最近值中的字符串。第一个参数指定查找的字符串,大小写敏感。第二个可选的参数指定秒数或收集值的数目,将会处理多个值。当返回值为1时表示找到,0为其他.
21.strlen
参数:秒或#num
支持值类型:str,log,text
描述:指定最近值的字符串长度(并非字节),参数值类似于last函数.例如strlen(0)等价于strlen(#1),strlen(#3)表示最近的第三个值,strlen(0,86400)表示一天前的最近的值.该函数从Zabbix1.8.4起开始支持
22.sum 参数:秒或#num
支持值类型:float,int 描述:返回指定时间间隔中收集到的值的总和.时间间隔作为第一个参数支持秒或收集值的数目(以#开始).从Zabbix1.8.2开始,本函数支持time_shift作为第二个参数。可以查看avg函数获取它的用法
23.time 参数:忽略
支持值类型:any
描述:返回当前时间,格式为HHMMSS,例如123055

对于参数,参考官网:https://www.zabbix.com/documentation/2.2/manual/config/triggers/suffixes

常用的时间参数有以下几种:

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

对于Zabbix触发器的逻辑语法,参考官网:https://www.zabbix.com/documentation/2.2/manual/config/triggers/expression

官网对于运算符的说明:

在表达式中#可以有更多的作用:

sum(600):表示在600秒之内接收到所有值的和

sum(#5):表示最后5个值的和

如果最近的获取的5个值为3, 7, 2, 6, 5

last(#2) would return 7

last(#5) would return 5.

1、A parameter must be given even for those functions which ignore it. Example: last(0)

官网的这句话没理解,大概意思是那些可以忽略参数的functions必须给指定偶数?

2、avg, count, last, min and max functions support an additional, second time_shift parameter. This parameter allows to reference data from a period of time in the past. For example, avg(1h,1d) will return the average value for an hour one day ago.

avg, count, last, min and max functions支持一个额外的,第二个time_shift参数。该参数允许是一个时间周期,将过去的数据作为参照。例如,avg(1h,1d) 将前一天同一个小时的平均值返回。 

3、Triggers only evaluate history information. If history is not available (especially relevant for time shift), trend information is not used, thus history must be kept for at least the period trigger functions expect it.

官网实例的表达式举例:

示例1:

触发器名称:Processor load is too high on www.zabbix.com
{www.zabbix.com:system.cpu.load[all,avg1].last(0)}>5 触发器说明:
www.zabbix.com:host名称
system.cpu.load[all,avg1]:item值,一分内cpu平均负载值 last(0):最新值 >5:最新值大于5
如上所示,www.zabbix.com这个主机的监控项,最新的CPU负载值如果大于5,那么表达式会返回true,这样一来触发器状态就改变为“problem”了。

示例2:

触发器名称:www.zabbix.com is overloaded
{www.zabbix.com: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.

示例3:

触发器名称:/etc/passwd has been changed 使用函数 diff():
{www.zabbix.com:vfs.file.cksum[/etc/passwd].diff(0)}>0 
/etc/passwd最新的checksum与上一次获取到的checksum不同,表达式将会返回true. 我们可以使用同样的方法监控系统重要的配置文件,例如/etc/passwd,/etc/inetd.conf等等。这些zabbix一般都会自带,没带的你自己加上吧。

示例4:

触发器名称:Someone is downloading a large file from the Internet 使用函数 min:
{www.zabbix.com:net.if.in[eth0,bytes].min(5m)}>100K 
当前主机网卡eth0最后5分钟内接收到的流量超过100KB那么触发器表达式将会返回true

示例5:

触发器名称: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.

示例6:

触发器名称:Zabbix agent needs to be upgraded 使用函数str():
{zabbix.zabbix.com:agent.version.str("beta8")}=1 
如果当前zabbix agent版本包含beta8(假设当前版本为1.0beta8),这个表达式会返回true.

示例7:

触发器名称:Server is unreachable
{zabbix.zabbix.com:icmpping.count(30m,0)}>5 
如上表达式表示最近30分钟zabbix.zabbix.com这个主机超过5次不可到达。

示例8:

触发器名称: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”。

示例9:

触发器名称: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”

示例10:

触发器名称: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”

示例11:

触发器名称: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。(慢慢理解,这个表达式有点绕) 为了达到这个效果,我们需要使用如下触发器表达式:

示例1:

触发器名称: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}将会返回当前触发器的值

实例2:

触发器名称: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)