触发器的定义: 当监控项的值发生变化后,对应的值不符合预期,则应该通过触发器来通知管理员介入或执行相应的操作。
1.触发器的严重性
zabbix支持下列触发器的严重程度:
严重性 | 定义 | 颜色 |
---|---|---|
未分类 | 未知严重性 | 灰色 |
信息 | 提示 | 浅蓝色 |
警告 | 警告 | 黄色 |
一般严重 | 一般问题 | 橙色 |
严重 | 发生重要的事情 | 浅红色 |
灾难 | 灾难,财务损失等 | 红色 |
- 通过不同的颜色代表不同的严重程度
- 报警音频,不一样的音频代表不同的严重程度
- 用户媒介,不同的用户媒介(通知渠道) 代表不同的严重程度。例如一般报警email 高严重性sms报警
- 通过触发器执行对应的条件动作
2.触发器表达式函数
函数名称 | 作用 |
---|---|
avg() | 监控项的平均值: =>avg(#5) -> 最新5个值的平均值 => avg(1h) -> 最近一小时的平均值 =>avg(1h,1d) -> 一天前的一小时内的平均值 |
min() | 监控项的最小值: 示例:cpu使用率最近5分钟的最小值大于5 system.cpu.load.min(5m)>5 示例:cpu最近5次最小的值大于2 system.cpu.load.min(#5)>2 |
max() | 监控项的最大值: =>max(#5) ->最新5个值的最大值 =>max(1h)->最近一小时的最大值 |
last() | 注意last的 #num 参数和在其它函数中的作用不一样,例如:返回值 3,7,2,6,9 last() 通常等同于last(#1) last(#5) 第五个最新值 last(#2)将返回值为7 last(#5)返回值为9 |
diff() | 比对上一次文件的内容 |
nodata() | 监控一段时间内是否返回数据:时间不少于30秒,因为timer处理器每30s调用一次 返回1 - 指定评估期没有接收数据 返回0 - 其它 |
官方示例:
示例一:
触发器名称: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”了。
示例二:
触发器名称: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.
示例三:
触发器名称:/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一般都会自带,没带的你自己加上吧。
示例四:
触发器名称: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
示例五:
触发器名称: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.
最新一小时的平均负载峰值超过昨天同时段指标两次进行报警
3.特性之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)}
自定义触发器场景
2.1 配置单条件触发器
- 自定义单条件触发器: 设置内存低于30% 进行告警,点击对应主机 -> 触发器
设定一个触发表达式 设定一个恢复表达式 两个表达式的条件不同 可以滞后恢复 勾选可以手动关闭 可以在面板直接关闭