- A+
这篇文章将会介绍zabbix触发器的语法结构。
在本博客中,"zabbix"是一个系列文章,如果你还不明白zabbix的相关概念,强烈建议从zabbix系列文章中的第一篇开始阅读,否则你可能无法理解这篇文章中涉及到的部分名词。
zabbix系列文章列表直达链接:zabbix入门系列
在上一篇文章中,我们已经用了 "非bu常zhuan通ye俗" 的方法给大家解释了什么是触发器,那么这次,我们从专业的角度,总结一下什么是触发器,但是这次的总结可能需要建立在之前文章的基础上,所以兄弟们可以先回顾一下之前的文章。
先来看看我们上一次创建的触发器。
我们也说过,触发器的本质其实就是一个表达式。上次创建的触发器对应的表达式如下图,下图中的表达式的含义为,如果testzbx1.zsythink.net这台主机上的根分区使用率倒数第二次被监控到的值大于13,则触发器将会被触发。
那么,我们把上图中的表达式放大一下,并且将其分解成5个部分,从而方便我们去理解。
其实,上面的5个部分我们可以通过如下语法表示,如下语法描述了一个触发器的条件表达式的基本结构。
{<server>:<key>.<function>(<parameter>)}<operator><constant>
此处,我们只总结其专业术语,如果想要通俗的理解,请查阅前一篇文章
1、上图中的第一部分对应了上述语法中的<server>,表示主机名称,上图中对应的主机为testzbx1.zsythink.net。
2、上图中的第二部分对应了上述语法中的<key>,表示对应主机上某个监控项对应的key,上图中对应的key取得的值为对应主机的根分区的使用率。
3、上图中的第三部分对应了上述语法中的<function>(<parameter>),所以说,last(#2)应该被称作一个带有参数的函数,last()被我们称之为函数,#2被我们称之为函数的参数,last(#2)就表示监控项对应的key最近2次中倒数第2次取得的值,那么聪明如你一定想到了,除了last()函数,还有别的函数吗,必须有啊,不同的函数实现的功能则不同,触发器所支持的函数有很多,常用的有 avg、count、change、sum、max、min、date等等,看这些函数的名字你也能猜出其大概的作用,无非就是获取监控项的值的最大值,最小值,值的总和,或者平均值等,如果你想要了解它们,可以登录zabbix的官网查看在线手册,地址如下:
https://www.zabbix.com/documentation/3.0/manual/appendix/triggers/functions
而函数的参数格式变化则比较少,如果参数值前面带有"#"作为前缀,则表示次数,比如avg(#10),则表示最近10次监控项的值的平均值,如果参数值前面没有"#"作为前缀,则表示时间,比如sum(300),表示300秒内监控项的值的总和,max(#20)则表示最近20次监控项的值的最大值,min(600)则表示最近10分钟内监控项的值的最小值,但是需要注意,last(0)的含义与last(#1)的含义相同,都表示最近一次。有的函数还支持使用第二个参数,比如avg(1h,1d) ,表示一天前的一小时内的监控项的值的平均值,假设现在的时间是5点,avg(1h)可以理解为4点到5点之间的监控项的值的平均值,而avg(1h,1d) 中的1d表示时间偏移量,那么avg(1h,1d)可以理解为昨天4点到5点的监控项的值的平均值。
4、上图中的第四部分对应了上述语法中的<operator>,其实就是常用的比较操作符或者运算操作符,由于zabbix版本的不同,操作符可能有所变化,zabbix3.0支持的操作符可以参考在线手册,地址如下,如下地址中除了包含表达式支持的操作符,还有一些触发器表达式的实例,都是我们学习的好素材:
https://www.zabbix.com/documentation/3.0/manual/config/triggers/expression
5、上图中的第五部分对应了上述语法中的<constant>,用于设定监控项对应的阈值。
如果你看过上一篇文章,那么你一定知道,触发器的表达式是可以通过图形化界面中的配置,自动生成的,既然能够自动生成,我们还需要理解上述表达式的结构吗?虽然话是这样说,但是知其然,知其所以然,不是更好吗,嘿嘿嘿~~~。

2019年1月7日 下午2:39 沙发
就是和最新版本的有点不一样,不过仔细看还可以看懂
2019年1月7日 下午2:38 板凳
文章不错,很清晰,思路很明确,有帮助,谢了.
2018年12月6日 下午4:40 地板
真的可以出书了
2018年12月3日 下午8:51 4楼
讲真的,您把这些精华拿去出书,绝对是一本入门的好书。通俗易懂,比外面买的书好太多了!大佬,接受在下膜拜吧。
2018年12月4日 上午8:04 1层
@Alex 客气了兄弟,你能靠这些文章能入门,能对你有帮助,就是好的,加油,共勉~
2018年8月23日 下午11:23 5楼
加班加点的学
2018年4月18日 下午9:05 6楼
嗯,que shi hen niu bi
2018年3月16日 下午1:24 7楼
受益良多,希望博主一直更新下去,
2017年10月31日 上午10:30 8楼
{*.last(#2)}>13被您解读为连续两次被监控到的值都大于13,这明显是不对的。
#num这个参数表示最新的第N个值,如果最近6个值分别是1,2,3,4,5,6 ,那么#2就是5。希望版主早日更正不要耽误其他人了~
2017年11月1日 上午9:47 1层
@yancy 是我理解错了,看了下手册,已经修改,感谢指正,谢谢~~
2017年7月16日 上午12:18 9楼
大佬,我在mail.rc里添加了smtp等。用命令行 echo “hi” |mail -s “hi” xxxxx@163.com 是能够发送到我的xxxxx@163.com邮箱的。
但是服务器的触发器触发了条件,显示成功发送,但我没有收到
这个触发器,我昨天用还是好用的,不知道今天晚上是什么毛病。
2017年7月16日 上午12:51 1层
@m睡意zzz 也有可能不是触发器的问题,有时候可以使用命令发送邮件,但是使用脚本就不行。
2017年5月9日 下午5:12 10楼
是的
2017年5月9日 下午9:09 1层
@大兔子 客官你这是在回应文章的最后一句吗?
2017年5月10日 上午9:08 2层
@朱双印 是的呢