Zabbix搭建笔记[7]--触发器
这一讲我们来配置监控的触发器。
触发器的作用是拿到监控项的数据后,会对数据进行一个判断,每一个触发器都必须要关联一个监控项,但是一个监控项可以对应多个触发器,触发器可以与模板或者主机进行关联。
触发器有两个状态:OK和Problem。
我们可以针对前面创建过的监控项来创建触发器,我们找到前面创建的聚合监控项LinuxHost.cpu.avg所在的主机AggregateCollector,为其创建一个触发器(Trigger):
我们详细解释一下上面的一些重点项目:
Severity:定义了触发器对应的事件级别,不同的事件产生不同颜色的警告信息。
Problem expression:定义了触发器的触发条件,即报警条件
OK event expression:定义了触发器的警报解除条件,这里区分一下几个选项:如果选择了Expression,那么触发器警报解除的条件就是Problem expression的取反条件;如果选择Recovery expression,就像我们上面配置的这种,那么可以单独指定一个额外的Recovery expression;如果选择None,那么这个警报就永远也解除不了。
PROBLEM event generation mode:如果选择Single模式,那么仅当触发器进入Problem时会产生事件,即如果一直在Problem状态没有恢复,选择Single模式只会产生一个事件;如果选择Multiple模式,那么每次触发器条件达成时,都会出发一个事件,即使当时的状态仍然是Problem。
Allow manual close:是否允许人工决定是否关闭这个触发器产生的事件。
对于expression我们可以点击右侧的Add按钮来创建:
这里Item是要计算的监控项,Function是触发器触发条件的计算公式(后面会详细介绍),Last of是时间或者次数设置,Time shift是时间偏移量,N替代的是Function公式中的N。
下面关于expression的部分可以参考zabbix官网文档:
https://www.zabbix.com/documentation/3.2/manual/config/triggers/expression
expression的格式:
{<server>:<key>.<function>(<parameter>)}<operator><constant>
operator的可选项:
优先级 |
operator |
定义 |
对于未知的值的处理 |
1 |
- |
一元运算符,负号 |
不会对未知的值改变,例如-Unknown=Unknown |
2 |
not |
逻辑取反 |
不会对未知的值改变,例如not Unknown=Unknown |
3 |
* |
乘法 |
0 * Unknown = Unknown [any number] * Unknow = Unknown` |
|
/ |
除法 |
Unknown / 0 => Error [any number] / Unknown = Unknown Unknown / [any number except 0] = Unknown |
4 |
+ |
加法 |
[any number] + Unknown = Unknown |
|
- |
减法 |
[any number] - Unknown = Unknown |
5 |
< |
小于 |
[any number] < Unknown = Unknown |
|
<= |
小于等于 |
[any number] <= Unknown = Unknown |
|
> |
大于 |
同上 |
|
>= |
大于等于 |
同上 |
6 |
= |
等于,误差定义在0.000001 |
|
|
<> |
不等于,误差定义在0.000001 |
|
7 |
and |
逻辑与 |
0 and Unknown = 0 1 and Unknown = Unknown Unknown and Unknown = Unknown |
8 |
or |
逻辑或 |
1 or Unknown = 1 0 or Unknown = Unknown Unknown or Unknown = Unknown |
注意:
not/and/or这几个操作符对于大小写敏感。
对于-和not运算符,注意--1或者not not 1这种写法是不正确的,要使用-(-1)或者not(not1)这种写法。
expression表达式中的时间单位:
S(秒) m(分钟) h(小时) d(天) w(周)
内存大小单位:
K(KB) M(MB) G(GB) T(TB) P(PB) E(EB) Z(ZB) Y(YB)
函数的参数说明:
- 没有单位的数字默认单位是秒,例如last(,1m) = last(,60)。
- #在不同的函数中具有不同的意义,例如sum(#5)表示最后5个值求和,last(#5)表示倒数第5个值。
- last()函数的第一个参数如果是时间的话,会被忽略。
触发器的函数说明:
参见官网连接:https://www.zabbix.com/documentation/3.2/manual/appendix/triggers/functions
注意:参数中time_shift的含义:时间偏移量,如果指定time_shift,则表示统计的基准时间向前推time_shift指定的秒数;可选参数使用“<Param>”表示;对于浮点数,误差在0.000001内认为是相等的。
方法名称 |
描述 |
参数说明 |
示例 |
abschange |
返回上一次取值和上上次取值的差值的绝对值 |
无 |
支持的值类型有float, int, str, text, log |
avg(sec|#num,<time_shift>) |
返回指定时间间隔的平均值 |
sec:秒数 #num:最近#num次的值 |
支持的值类型有float, int |
band(sec|#num,mask,<time_shift>) |
将监控值和掩码进行“按位与”操作 |
sec:秒数 #num:倒数第#num个取值 |
支持的值类型有int 尽管按位与的操作是二进制的操作,但是传参和返回值都是十进制的,例如: band(,12)=8 or band(,12)=4表示第三位为1或第四位为1,但是不能同时为1(12 => 1100,8 => 1000,4 => 0100) |
change |
返回上一次取值和上上次取值的差值,字符串的话,相等返回0,不相等返回1 |
无 |
支持的值类型有float, int, str, text, log
|
count(sec|#num,<pattern>,<operator>,<time_shift>) |
返回指定时间间隔内统计得到的数值 |
sec:秒数 #num:最近#num次的值 pattern:给定的匹配值 operators: eq——相等 ne——不相等 gt——大于 ge——大于等于 lt——小于 le:小于等于 like——包含 band——按位与 regexp——(区分大小写)匹配正则式 iregexp——不区分大小写的regexp |
支持的值类型有float, int, str, text, log 如果operator指定为band,则pattern可以通过“/”指定两个数: number_to_compare/mask,当前值与mask按位与后与number_to_compare比较,如果结果相等,则计数+1
使用实例: count(10m)——最近10分钟的统计值的数量 count(10m,12)——最近10分钟值等于12的次数 count(10m,12,"gt")——最近10分钟内值大于12的次数 count(#10,12,"gt")——最近12个取值内大于12的次数 countn(10m,12,"gt",1d)——24小时之前的10分钟内取值大于12的次数 count(10m,6/7,"band)——最近10分钟内取值转换成2进制后后三位等于"110"的次数 count(10m,,,1d)——24小时之前的10分钟内统计到的值的数量 |
date |
返回当前日期,格式YYYYMMDD |
无 |
支持的值类型有any |
dayofmonth |
返回当前日期是本月第几天 |
无 |
支持的值类型有any 返回值1-31 |
dayofweek |
返回当前日期是本周的星期几 |
无 |
支持的值类型有any 返回值1-7(1对应周一,7对应周日) |
delta(sec|#num,<time_shift>) |
返回指定时间间隔内最大值与最小值的差值 |
sec:秒数 #num:最近#num次的值 |
支持的值类型有float, int |
diff |
检测上次和上上次取值是否相等 |
无 |
支持的值类型有float, int, str, text, log 返回值1表示不同,0表示其他情况(相同或无法比较) |
forecast(sec|#num,<time_shift>,time,<fit>,<mode>) |
根据现有取值预测得到未来可能检测到的值,最大值,最小值,delta,平均值 |
pattern:指定字符串 sec:秒数 #num:最近#num次的值 time:时间基准点 fit:预测函数模型(算法) liner——线性模型(默认) polynomialN——N次多项式(N不能超过6)模型 exponential——指数模型 logarithmic——对数模型 power——幂运算模型 mode:输出结果选项 value/max/min/delta(max-min)/avg 注意:value表示预测now+time时间点的值 max/min/delta/avg预测now和now+time时间范围内的值 |
支持的值类型有float, int
如果返回结果大于999999999999.9999或者小于-999999999999.9999,则会被裁剪成999999999999.9999或-999999999999.9999 如果参数传错了的话,返回not supported,如果其他错误,则返回-1
使用实例: forecase(#10,,1h)——基于最后取到的10个值预测1小时之后的值 forecast(1h,,30m)——基于前一小时的数据预测30分钟后的值 forecast(1h,1d,12h)——基于前1天零1小时的数据预测12小时之后的数据 forecast(1h,,10m,exponential)——使用指数模型利用前一小时的数据预测10分钟之后的数据 forecast(1h,,2h,polynomial3,max)——基于三次多项式模型以及前一小时的数据预测未来两小时内可能的最大值 forecast(#2,,-20m)——基于前两次的值预测02分钟前的取值(如果一个值的更新周期超过20分钟或者极少更新,则这个预测值可以帮助进行一些判断) |
fuzzytime(sec) |
检查监控项的Timestamp与zabbix server的时间差 |
sec(秒) |
支持的值类型有float, int
如果时间差超过sec指定的描述,则返回0,否则返回1 |
iregexp(pattern,<sec|#num>) |
regexp()不区分大小写的版本 |
见regexp |
支持的值类型有str, log, text |
last(sec|#num,<time_shift>) |
最近一次的监控值 |
pattern:指定字符串 sec:秒数 #num:倒数第#num个取值 |
支持的值类型有float, int, str, text, log 不指定参数默认返回上一次的值 |
logeventid(pattern) |
检测最后一条日志的event ID是否匹配正则表达式 |
pattern:用于匹配的正则式 |
支持的值类型有log
不匹配返回0 匹配返回1 |
logseverity |
返回最后一条日志的日志等级 |
无 |
支持的值类型有log
默认等级返回0,否则返回对应数字(1-Information/2-Warning/4-Error/7-Failure Audit/8-Success Audit/9-Critical/10-Verbose) |
logsource(pattern) |
检查最后一条日志的来源是否匹配正则表达式 |
pattern:要匹配的字符串 |
支持的值类型有log
不匹配返回0 匹配返回1 |
max(sec|#num,<time_shift>) |
返回指定时间间隔内的最大值 |
pattern:指定字符串 sec:秒数 #num:最近#num次的值 |
支持的值类型有float, int |
min(sec|#num,<time_shift>) |
返回指定时间间隔内的最小值 |
pattern:指定字符串 sec:秒数 #num:最近#num次的值 |
支持的值类型有float, int |
nodata(sec) |
检查指定时间间隔内是否有数据产生 |
sec:秒数,不能小于30 |
支持的值类型有any
如果指定时间内没有任何取值则返回1,否则返回0 |
now |
返回距离1970年1月1日 00:00:00 UTC到现在经过的描述 |
无 |
支持的值类型有any |
percentile(sec|#num,<time_shift>,percentage) |
返回在指定时间间隔内百分率小于等于percentage参数的次数,关于percentile可以参考wiki:https://en.wikipedia.org/wiki/Percentile |
sec:秒数 #num:最近#num次的值 percentage:百分数,浮点型,包含整数位不超过4个数字 |
支持的值类型有float, int |
prev |
返回前一次取值 |
无 |
支持的值类型有float, int, str, text, log |
regexp(pattern,<sec|#num>) |
检查最近一次取值是否匹配给定的正则式 |
pattern:用于匹配的正则式 sec:秒数 #num:最近#num次的值 |
支持的值类型有float, int, str, text, log
找到匹配返回1,否则返回0 |
str(pattern,<sec|#num>) |
从最近一次取值中找到指定的字符串 |
pattern:指定字符串 sec:秒数 #num:最近#num次的值 |
支持的值类型有str, text, log
找到匹配返回1,否则返回0 |
strlen(<sec|#num>,<time_shift>) |
最近一次取值的字符串长度(非比特数) |
sec:秒数 #num:倒数第#num个取值 |
支持的值类型有str, text, log
使用实例: strlen()——返回最近一次值的字符串长度 strlen(#3)——返回倒数第三个值的字符串长度 strlen(,1d)——返回1天前最后一次取值的字符串长度 |
sum(sec|#num,<time_shift>) |
针对给定时间内收集到的值求和 |
sec:秒数 #num:最近#num次的值 |
支持的值类型有float, int |
time |
返回当前时间,格式HHMMSS |
无 |
支持的值类型有any |
timeleft(sec|#num,<time_shift>,threshold,<fit>) |
根据现有取值预测某个监控项达到某个值还需要经过的秒数 |
sec:秒数 #num:最近#num次的值 threshold:阈值 fit:见forecast |
支持的值类型有float, int
如果返回结果大于999999999999.9999或者小于-999999999999.9999,则会被裁剪成999999999999.9999或-999999999999.9999 如果参数传错了的话,返回not supported,如果其他错误,则返回-1
timeleft(#10,,0)——根据最后10次的取值预测取值达到0的时间 timeleft(1h,,100)——根据前一小时的数据预测取值达到100的时间 timeleft(1h,1d,0)——根据前一天零一小时的数据预测取值达到0的时间 Timeleft(1h,,200,polynomial2)——根据2次多项式以及前一小时的数据预测取值达到200的时间 |