运维监控篇(6)_Zabbix Trigger表示式(Expression)浅析

Zabbix触发器Trigger的作用是对收集的Item(监控项)数据做进一步判断,然后产生一个状态值,该状态值只有两个不同的取值”OK”或”Problem”(该状态值可以作为Action的输入,Action根据不同的状态组合条件作出不同的动作如发送报警邮件、重启服务等)。一个Trigger可以对应一个Item,当然了一个Trigger也可能对应了多个Item,配置Trigger的关键就是写好Trigger expression。

1、Trigger基本的表示式是这样的

{<server>:<key>.<function>(<parameter>)}<operator><constant>

各个字段解释如下:
<server>       主机名(或者模板名,最终是显示的主机名,说明一个trigger最终一定是挂在一台Host上面的)
<key>          item配置的时候可以选则已存在的item
<function>     函数如last,avg等
<parameter>    函数的参数
<operator>     判断符(简单的运算符)
<constant>     常量

举个例子可能更清晰,监控系统文件/etc/passwd是否发生变化的Trigger

{Zabbix-Server:vfs.file.cksum[/etc/passwd].diff(0)}>0

各个字段与基本表达式对应如下:
<server>       Zabbix-Server
<key>          vfs.file.cksum[/etc/passwd]
<function>     diff()
<parameter>    0
<operator>     >
<constant>     0

我想这样看就可以很容易理解Trigger的基本表达式了。

2、Function详解
对于大多数的function来说,它接受的数字单位是“秒”,如果数字前面有“#”,则表示的是次数。比如sum(600)表示的是过去600秒的数据总和,而sum(#5)表示的是最近5次数据的和。凡是都有例外“#”在last函数的特许含义,它后面的数字表示的是“第几个”数据的意思。对于不需要parameter的function,也要加上parameter,一般置0不能省略如diff(0)。
Expression中的Function总共有这些

[float|int|str|text|log].abschange()               表示前两次的值的绝对值是否相同。0表示相同,1表示不同。支持flaot、int、str、test、log类型的Item

[float|int|str|text|log].change()                  最近两次的值是否相同。0表示相同,1表示不同

[float|int|str|text|log].diff()                    判断上一次的值是否和上上次的值是不是相同,0表示相同,1表示不同

[float|int].avg(sec|#num,time_shift)               一段时间或几次内值的平均值,参数可以是时间秒也可以是次数。

[float|int|str|text|log].last(#num,time_shift)     最近第#num次数据。这里的#num和其他的function中的#num不同,别的function表示“几次”,这里的表示”第几次“,一般用last(0)取最新值。time_shift,它表示这个函数计数器的数据需要往前推移的时间(下同)。

[float|int].max(sec|#num,time_shift)               最近sec秒或#num次监控的最大值

[float|int].min(sec|#num,time_shift)               最近sec秒或#num次监控的最小值

[float|int].sum(sec|#num,time_shift)               最近sec秒或#num次监控值的和

[float|int|str|text|log].prev()                    返回上一次获得的监控值,等同于last(#2)

any.data()                                         返回当前的日期,格式为YYYYMMDD,如“20131025”

any.dayofmonth()                                   返回日期,返回值的范围是1~31

any.dayofweek()                                    返回星期几,放回值的范围是1~7

any.now()                                          返回unix时间戳

any.time()                                         返回现在的时间,格式为HHMMSS,如“123505”

any.nodata(sec)                                    在sec秒内Zabbix Server 没有收到监控信息返回1,反之返回0

[str|text|log].regexp(string,sec#num)              检查最近一次的返回值是不是正则匹配string,第二个参数定义的时间或次数中所有的数据都会进行检查,成功匹配返回1,反之返回0

[str|text|log].iregexp(string,sec#num)              与regexp功能相同,只是string不区分字母大小写。

[str|log|text].str(string,sec|#num)                 检查最近一次的返回值是否包含string,第二个参数定义的时间或次数中所有的数据都会进行检查,成功匹配返回1,反之返回0

[str|log|text].strlen(sec|#num,time_shift)          最近一次获取到的监控值的长度

[float|int].delta(sec|#num,time_shift)              在sec秒内或#num次数内获取最大值和最小值的差

[float|int].fuzzytime(sec)                          返回返回值和Zabbix Server的时间差有没有超过sec秒,如果超过返回1,没有超过返回0.一般对于system.localtime这个key,加上这个function来判断Agent的Linux时间和Zabbix Server的时间是否相同。

[log].logeventid(string)                            最近一次的日志的Event ID是否匹配string,不匹配返回0,匹配返回1

[log].logseverity()                                 返回最近一次日志的等级,返回0表示默认,其它数字表示对应的等级,这是Windows event log 所独有的。

[log].logsource(string)                             log的来源是否匹配,返回0表示不匹配,返回1表示匹配,对Windows Agent 比较常用

int.band(sec|#num,mask,time_shit)                   和mask中定义的数字做二进制与操作

[float|int|str|text|log].count(sec|#num, pattern, operator, time_shift)     在一段时间内或几次收集到的数据中符合条件的个数。举几个例子
count(60)     过去60秒内数据的总个数
count(60m,12)     过去60分钟内,监控值为12的个数
count(1h,12,"gt")     过去1个小时内,监控值大于12的个数
count(#10,12,"gt")     过去10次内数据大于12的个数
count(60,12,"gt",1d)     过去1天的这个时间点的过去60秒内,大于12的监控值的个数
count(60,,,1w)     过去1周的的这个时间点的过去60秒内,监控值的个数
eq       ne         gt      ge          lt       le          like      band
相等     不相等     大于     大于等于     小于     小于等于     包含     (一般用不上)
这个和shell脚本里面的判断符的相同。

3、operator

zabbix支持的operator,优先级依次递减如下:

/     *   -     +     <    >   #      =     &     |
除   乘   减    加    小于  大于 不等于 等于 逻辑与 逻辑或

转载请注明出处:http://www.xiaomastack.com/2014/10/11/zabbix06/ 谢谢!

发表评论:

你的电子邮件地址将不会被公开.

− 3 = 1