第八章 管理告警
近日完成《深入浅出 zabbix 4.0》视频教程的录制并正式发布,该教程基于 zabbix 4.2 ,对Zabbix进行全面讲解。欢迎大家围观。课程链接:https://edu.youkuaiyun.com/course/detail/24870
在本章中可以了解到Triggers(触发器)的配置和Actions(动作)的配置,详细介绍触发器的规则表达式、告警、告警升级等,
作为一个监控解决方案,告警是不可或缺的功能。当从监控对象上收集的监控项的值满足系统中设定的阈值即产生告警事件,依据告警事件的不同类型,产生相应的告警动作,给用户发送告警信息,或者执行命令等等。Zabbix中的告警流程如下图7-1所示。
图 8-1
8.1 触发器
我们知道在Zabbix中是通过监控项收集监控数据,然后这些数据会保存在数据库中。有时候在某个监控指标出现问题时想让系统能及时通知我们,这就需要告诉系统监控指标的数据在什么情况下是有问题的,也就是常说的阈值。而触发器就是通过逻辑表达式对监控指标的数据进行运算,将其结果与定义的阈值进行比较,从而判断该监控指标的状态是否正常。
在Zabbix中,无论触发器的表达式有多复杂,最终我们得到的结果不是True(真)就是False(假)。这个结果直接关系到触发器的状态,当结果为False时触发器的状态是OK,意味着该数据是正常的。结果为True时触发器的状态是PROBLEM,意味着该数据是有问题的,这个对应关系要记清楚。
如果在触发器中使用了基于时间的函数nodata()、date()、dayofmonth()、dayofweek()、time() 和now()时,Zabbix server会对触发器每隔30秒重新进行运算。如果同时使用了基于时间的函数和其他函数,当接收到一个新值并且每隔30秒将重新进行运算。
8.1.1 理解触发器的表达式
在触发器中使用的表达式非常灵活,通过它们也可以创建复杂的逻辑运算。让我们一起来看个简单的表达式的格式。
{<server>:<key>.<function>(<parameter>)}<operator><constant>
例如:{Testsrv:vfs.fs.size[/var,pused].delta(600)}>3
可以看到一个触发器表达式主要有两部分组成:
-
应用到监控项数据的函数。
-
对函数结果进行算术和逻辑运算。
在上面的例子中指定了完整的监控项key,即 Testsrv:vfs.fs.size[/var,pused]和应用的函数 delta(600),其运算结果使用运算符大于号(>)和常量 3 进行比较。
我们可以在触发器表达式中引用多个监控项,每个监控项应用一个函数。同一个监控项也可以在表达式中使用两次,但是要明确指定完整的监控项,例如:
{test:log[/tmp/operations.log,,,10,skip].nodata(600)}=1 or
{test:log[/tmp/operations.log,,,10,skip].str(error)}=1
如果operations.log至少10分钟没有收到新的行,或者在log文件中发现一个错误,该触发器的状态会变为PROBLEM。
触发器表达式中不仅可以从同一主机引用监控项,也可以从不同的主机或代理服务器(如果你能访问它们)中引用监控项,例如:
{Proxy1:server1:agent.ping.last(0)}=0 and
{Proxy2:server2:agent.ping.last(0)}=0
如果主机server1和server2同时都ping不同时触发器的状态会变为PROBLEM。即便主机是被不同的代理服务器监控也一样工作的很好。
所有在Calculate checks中可以应用的函数都可以在触发器表达式中应用,更详细的可用函数的定义可以参考Zabbix官方网站(https://www.zabbix.com/documentation/3.0/manual/appendix/triggers/functions)。
很多触发器函数可以接收seconds(秒)和 #num参数,这两个参数的含义如下:
-
seconds:指定一个时间期间,单位为秒。触发器将使用指定期间内的监控项值进行函数运算。例如:sum(600)表示对最近600秒内监控项的值求和。600秒也可以写成10m(分钟),86400可以写成1d(天)。
-
#num:指定次数。触发器将使用指定的最近次数收集监控项的值进行函数运算。例如:sum(#5)表示最近5次收集的值进行求和。
需要注意的是使用last函数时#num的含义有所不同,#num表示最近第几次。例如某个监控项最近5次收集的值分别是3(最新的)、7、2、6、5,last(#2)将返回7,last(#5)将返回5。
在触发器中我们使用哪个参数比较好呢?建议在Passive(被动式)监控方式中各种监控项数据都是由Zabbix server定期的收集,在这种情况下使用seconds会比较好,如果你修改了相关监控项的监测时间间隔会对#num参数会有影响,从而影响触发器。而使用seconds参数可能更接近实际的监测,在日后触发器的维护中你能够更容易的理解触发器的定义。对于使用active(主动式)监控方式的监控项,尤其是trapper监控项和log文件,我们不能保证有一个稳定的、可靠的监测时间间隔,所以使用#num通常是最好的选择。
在avg、count、last、min和max函数中还支持使用第二个参数 time_shift,这个参数允许从过去的某个时间期间引用数据。例如:avg(1h,1d)将返回前一天1小时的平均值。在这里我们要注意,触发器只使用历史数据,因此使用time_shift参数时指定期间内的历史数据必须能正常访问。
Zabbix在触发器中支持下面的运算符(优先级由高到低)如表8-1所示。
表 8-1
优先级 |
运算符 |
定义 |
1 |
- |
一元负号运算符(左侧没有操作数的减号) |
2 |
not |
逻辑运算符 NOT |
3 |
* |
乘 |
/ |
除 |
|
4 |
+ |
加 |
- |
减 |
|
5 |
< |
小于 |
<= |
小于等于 |
|
> |
大于 |
|