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

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

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

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

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

1
2
3
4
5
6
7
8
{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总共有这些

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
[float|int|str|text|log].abschange()  表示前两次的值的绝对值是否相同。0表示相同,1表示不同。
支持flaot、int、str、testlog类型的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,优先级依次递减如下:

1
2
/   *   -   +   <   >   #     =    &     | 
除 乘 减 加 小于 大于 不等于 等于 逻辑与 逻辑或
----------------本文结束 感谢阅读----------------