一 概述
当监控项用于采集系统的数据时,始终遵循这些数据时不切实际的,因为这些数据始终在等待一个令人担忧或者值得关注的状态。然而这个“评估”数据的工作可以留给触发器表达式。
触发器表达式允许定义一个什么状况的数据是“可接受”的阈值。因此,如果接收的数据超过了可接受的状态,则触发器会被触发-或将状态更改为PROBLEM.
一个触发器可以拥有下面两种状态:
值 | 描述 |
OK | 这是一个正常的触发器状态,在旧版本的zabbix中为 FALSE |
PROBLEM | 通常意味着触发了某些事情。例如,处理器的负载较高。在旧版本的zabbix中称为 TRUE |
每当zabbix server接收到作为表达式一部分的新值时,都会重新计算触发器状态(表达式)。
如果在表达式中使用基于时间的函数(nodata(),date(),dayofmonth(),dayofweek(),time(),now()),触发器就会由 zabbix timer进程每30秒重新计算一次。如果在表达式中同时使用基于时间和非基于时间的函数,当接收到一个新值和每隔30秒都会重新计算触发器的状态。
二 触发器表达式
触发器中使用的表达式是非常灵活的。你可以使用他们去创建关于监控统计的复杂逻辑测试。
触发器表达式形式如下:
{<server>:<key>.<function>(<parameter>)}<operator><constant>
{主机:key.函数(参数)} + 表达式运算符 + 常数
比如:
2.1 触发器函数function:
触发器function函数可以引用检索到的值,当前时间或其他元素。
2.2 函数参数
大多数数字型的函数接受秒数来作为参数。
你可以使用前缀#来指定参数具有不同的含义:
函数内容 | 含义 |
sum(600) | 600秒内所有值的总和 |
sum(#5) | 最后5个值得总和 |
last函数使用不同的参数将会得到不同的值,#2表示倒数第二新的数据。例入从老到最新值为1,2,3,4,5,6,7,8,9,10,last(#2)得到的值为9,last(#9)得到的值为2。
avg,count,last,min和max函数还支持额外的第二个参数,以秒为单位的参数time_shift(时间偏移量),这个参数允许从过去一段时间内引用数据。例如avg(1h,1d),将会获取到昨天的1小时内的平均数据。
注意:
触发器需要使用 history 历史数据来计算。如果历史数据不可用(特别是关于 time_shift时间偏移量),则无法使用趋势信息,因此必须至少保持触发器函数所预期这段时间的历史信息。
你可以在触发器表达式中使用支持的单位符号。例如 "5m" (分钟)可以被 "300" 秒 代替,“1d”(天)可以被"86400" 秒代替。"1k" 代表 "1024" bytes。
2.3 运算符
触发器支持的运算符(在执行中优先级递减)
优先级 | 运算符 | 定义 |
1 | not | 逻辑非 |
2 | * | 乘 |
/ | 相除 | |
3 | + | 相加 |
- | 相减 | |
4 | < | 小于。该运算符定义: A<B <=> (A<=B-0.000001) |
<= | 小于等于 | |
> | 大于。该运算符定义: A>B <=> (A>=B+0.000001) | |
>= | 大于等于 | |
5 | = | 相等。该算符定义: A=B <=> (A>B-0.000001) and (A<B+0.000001) |
<> | 不等于 | |
6 | and | 逻辑与 |
7 | or | 逻辑或 |
注意:
not,and 和 or 运算符区分大小写,而且必须为小写。
not举例:
如果3306端口侦听值小于等于0,则触发报警:数据库服务挂了
and 举例:
如果3306端口和8080端口侦听值都等于0,则触发报警:数据库和jenkins服务都挂了
or 举例:
如果3306端口侦听值和8080端口侦听值至少有一个等于0,就触发报警:数据库和jenkins有服务挂了
三 触发器函数示例
3.1 count 函数
参数:秒或#num
支持类型:float,int,str,text,log
作用:返回指定时间间隔内数值的统计,
举例:
count(600) 最近10分钟得到的值的个数
count(600,12,eq) 最近10分钟得到的值等于12的个数
count(10m,12,ne) 最近10分钟得到的值不等于12的个数
count(600,12,gt) 最近10分钟得到的值大于12的个数
count(#10,12,gt) 最近10个值中,值大于12的个数
count(600,12,gt,86400) 24小时之前的10分钟内值大于12的个数
count(10m,,,86400) 24小时之前的10分钟数据值的个数
第一个参数:指定时间段
第二个参数:样本数据
第三个参数:操作参数
第四个参数:漂移参数
count函数中支持的操作类型:
eg: 相等
ne:不相等
gt:大于
ge: 大于等于
lt: 小于
le: 小于等于
like: 内容匹配
日常使用举例:
上行流量最近两次都大于50M则告警
{zabbix:net.if.out[em1].count(#2,50M,gt)}=2
最近30分钟zabbix这个主机超过5次不可到达,则告警
{zabbix:icmpping.count(30m,0)}>5
#192.168.0.101上监控项 department-status[beijing] 在最近3次当中监控项的值>1 超过两次,则处触发告警
触发器表达式:{192.168.0.101:department-status[beijing].count(#3,1,gt)}>2