3 触发器

概述

触发器是“评估”由项目采集的数据并表示当前系统状况的逻辑表达式。

当监控项用于采集系统的数据时,始终遵循这些数据是非常不切合实际的,因为这些数据始终在等待一个令人担忧或者值得关注的状态。然而这个“评估”数据的工作可以留给触发器表达式。

触发器表达式允许定义一个什么状况的数据是“可接受”的阈值。因此,如果接收的数据超过了可接受的状态,则触发器会被触发 - 或将状态更改为PROBLEM.

一个触发器可以拥有下面几种状态:

zabbix 触发器 恢复不起作用 zabbix触发器函数_ViewUI

每当Zabbix server接收到作为表达式一部分的新值时,都会重新计算触发器状态(表达式)。

如果在表达式中使用基于时间的函数(nodata(), date(), dayofmonth(), dayofweek(), time(), now()),触发器就会由Zabbix timer进程每30秒重新计算一次。如果在表达式中同时使用基于时间和非基于时间的函数,当接收到一个新值和每隔30秒都会重新计算触发器的状态。

你可以构建不同复杂程度的触发器表达式

1 配置一个触发器

概述

配置一个触发器,请执行以下操作:

点击Zabbix上方菜单栏的Configuration → Hosts
在Host那一行点击Triggers
在右上角点击Create Trigger(或者在触发器名称上编辑一个现有的触发器)
在打开的页面输入触发器的参数
配置

Trigger标签页包含了所有必需的触发器属性。

zabbix 触发器 恢复不起作用 zabbix触发器函数_后端_02

zabbix 触发器 恢复不起作用 zabbix触发器函数_ViewUI_03

zabbix 触发器 恢复不起作用 zabbix触发器函数_运维_04

zabbix 触发器 恢复不起作用 zabbix触发器函数_后端_05

Dependencies标签页包含触发器的所有dependencies。

点击Add来添加一个新的依赖关系。

你也可以打开一个现有的触发器,点击Clone按钮,以一个不同的名称保存为新的触发器。

2 触发器表达式

概述

触发器中使用的表达式是非常灵活的。你可以使用他们去创建关于监控统计的复杂逻辑测试。

一个简单有效的表达式看起来像:

{:.()}

12 函数

触发器函数允许引用收集的值,当前时间和其他因素。

可以使用的被支持函数的完整列表。

13 函数参数

大多数数字型的函数接受秒数来作为参数。

你可以使用前缀#来指定参数具有不同的含义:

zabbix 触发器 恢复不起作用 zabbix触发器函数_zabbix 触发器 恢复不起作用_06

函数last当以#作为前缀使用时,值具有不同的含义,它会让她会选择第N个的上一个值,所以给定值3、7、2、6、5(按照时间顺序,第一个值3为最新值),last(#2) 将返回值为7 ,last(#5) 将返回值为5。

avg, count, last, min and max 函数支持额外的第二个参数time_shift(时间偏移量)。这个参数允许从过去一段时间内引用数据。例如,avg(1h,1d)将会返回一天前1小时的平均值。

你可以在触发器表达式中使用支持的单位符号,例如“5m”(分钟)可以被“300”秒代替,“1d”(天)可以被“86400”秒代替。“1k”代表“1024”bytes。

14 运算符

触发器支持的运算符(在执行中优先级递减)

zabbix 触发器 恢复不起作用 zabbix触发器函数_后端_07

not, and and or 运算符区分大小写,而且必须为小写。它们也必须被空格或括号包围。

所有运算符中,除了unary - and not,都有从左到右的关联性。Unary - and not All operators, except unary - and not, have left-to-right associativity. Unary - and not are non-associative (meaning -(-1) and not (not 1) should be used instead of --1 and not not 1).

计算结果:

<, <=, >, >=, =, <> 如果指定的关系为真(ture),则运算符将会在触发器表达式中产生“1”;如果指定的关系为假(false),则返回“0”。如果一个运算对象为“Unknown”,那么结果为Unknown;
and 对于已知的运算对象,如果两个运算对象的比较不等于“0”,则运算符将会在触发器表达式中产生“1”,否则,它产生“0”;对于未知的运算对象,如果两个运算对象的比较等于“0”,则会产生“0”,否则,则会产生“Unknown”;
or 对于已知的运算对象,如果其中任意一个运算对象的比较不等于“0”,则运算符会在触发器表达式中产生“1”,否则,它产生“0”;对于未知的运算对象进行“or”运算,则只有当一个运算对象的比较不等于“0”,才会产生“1”,否则,它会产生“Unknown”;
如果运算单位的值不等于“0”,那么逻辑否定运算符not对于已知运算对象的结果为“0”;
The result of the logical negation operator not for a known operand is '0' if the value of its operand compares unequal to '0'; '1' if the value of its operand compares equal to '0'. For unknown operand not yields 'Unknown'.

15 触发器示例

示例 1

触发器名称:Processor load is too high on www.zabbix.com。触发器表达式如下:

{www.zabbix.com:system.cpu.load[all,avg1].last()}>5

“www.zabbix.com:system.cpu.load[all,avg1]” 给出了被监控对象参数的简短名称。它指定了服务器是“www.zabbix.com”,监控项的键值是“system.cpu.load[all,avg1]”。通过使用函数“last()”获取最近一次获取的值。最后,“>5”表示来自主机www.zabbix.com的最后一次获取的负载值大于5时触发器就会进入PROBLEM状态。

示例 2

触发器名称:www.zabbix.com is overloaded。触发器表达式如下:

{www.zabbix.com:system.cpu.load[all,avg1].last()}>5 or {www.zabbix.com:system.cpu.load[all,avg1].min(10m)}>2

当负载大于5或者最近10分钟内负载大于2,表达式为“TURE”,就会使触发器进入PROBLEM状态。

示例 3

触发器名称:/etc/passwd has been changed。触发器表达式如下:

使用了函数“diff“:

{www.zabbix.com:vfs.file.cksum[/etc/passwd].diff()}=1

当文件/etc/passwd检查的checksum值与最近的值不同时,表达式为“TURE”,就会使触发器进入PROBLEM状态。 同样的表达式还可以用于监控重要的文件,比如文件/etc/passwd、/etc/inetd.conf、/kernel等等。

示例 4

触发器名称:Someone is downloading a large file from the Internet。触发器表达式如下:

使用函数“min”:

{www.zabbix.com:net.if.in[eth0,bytes].min(5m)}>100K

当网络适配器“eth0”在5分钟内接收的字节大于100KB,表达式为“TURE”,就会使触发器进入PROBLEM状态。

示例 5

触发器名称:Both nodes of clustered SMTP server are down。触发器表达式如下:

注意:在同一个表达式中使用了两个不同的主机

{smtp1.zabbix.com:net.tcp.service[smtp].last()}=0 and {smtp2.zabbix.com:net.tcp.service[smtp].last()}=0

当SMTP服务器“smtp1.zabbix.com”和“smtp2.zabbix.com”都停止,表达式为“TURE”,就会使触发器进入PROBLEM状态。

示例 6

触发器名称:Zabbix agent needs to be upgraded。触发器表达式如下:

使用函数“str()”:

{zabbix.zabbix.com:agent.version.str("beta8")}=1

如果Zabbix agent有beta8版本(大概为1.0beta8),表达式为“TURE”,就会使触发器进入PROBLEM状态。

示例 7

触发器名称:Server is unreachable。触发器表达式如下:

{zabbix.zabbix.com:icmpping.count(30m,0)}>5

当主机“zabbix.zabbix.com”在30分钟内超过5次不可达,表达式为“TURE”,就会使触发器进入PROBLEM状态。

示例 8

触发器名称:No heartbeats within last 3 minutes。触发器表达式如下:

使用函数“nodata()”:

{zabbix.zabbix.com:tick.nodata(3m)}=1

'tick'必须为'Zabbix trapper'类型。为了使这个触发器工作,监控项'tick'必须要定义,这个主机应使用zabbix_sender定期发送此参数的数据,如果在180秒内还未收到zabbix_sender发送的数据,那么触发器的状态就会变成PROBLEM。

示例9

CPU activity at night time 触发器的名称为:CPU activity at night time

使用了函数time():

{zabbix:system.cpu.load[all,avg1].min(5m)}>2 and {zabbix:system.cpu.load[all,avg1].time()}>000000 and {zabbix:system.cpu.load[all,avg1].time()}<060000

只有在凌晨0点到6点整,最后5分钟内cpu load大于2,触发器的状态才会变更为PROBLEM。

示例 10

触发器名称: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秒以上,就会使触发的状态变更为PROBLEM。

示例 11

触发器名称为:Comparing average load today with average load of the same time yesterday (using a second time_shift parameter).

{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. 如果最后一小时的平均cpu load超过前一天的同一小时两倍,就会使触发器的状态变更为PROBLEM。

示例 12

使用了另一个监控项来获得触发器的阈值:

{Template PfSense:hrStorageFree[{#SNMPVALUE}].last()}<{Template PfSense:hrStorageSize[{#SNMPVALUE}].last()}*0.1

如果hrStorageFree低于10%,就会使触发器的状态变更为PROBLEM。

示例 13

使用 evaluation result 来获取触发器的数量超过阈值。

({server1:system.cpu.load[all,avg1].last()}>5) + ({server2:system.cpu.load[all,avg1].last()}>5) + ({server3:system.cpu.load[all,avg1].last()}>5)>=2

如果表达式中的两个触发器表达式的结果大于5,就会使触发器的状态变更为PROBLEM。

16 滞后(Hysteresis)

Sometimes we need an interval between an OK and Problem states, rather than a simple threshold. For example, we would like to define a trigger which becomes Problem when server room temperature goes above 20C and we want it to stay in that state until the temperature drops below 15C. 有时候我们需要一个触发器状态OK和PROBLEM之间的间隔,而不是简单的阈值。例如,我们想定义一个触发器,当机房的室温超过20摄氏度时,我们希望它保持这个状态,直至温度低于15摄氏度,触发器的状态才会变更为OK。

In order to do this, we first define the trigger expression for the problem event. Then select 'Recovery expression' for OK event generation and enter another expression for the OK event. 为了做到这一点,我们首先定义一个PROBLEM事件的触发器表达式,然后为OK event generation选择'Recovery expression',并为OK事件输入不同的表达式。

示例 1

触发器名称:Temperature in server room is too high.

Problem expression:

{server:temp.last()}>20
Recovery expression:

{server:temp.last()}<=15
示例 2

触发器名称:Free disk space is too low.

Problem expression: 在最近5分钟内文件系统/的空闲空间小于10GB。

{server:vfs.fs.size[/,free].max(5m)}<10G
Recovery expression: 在最近10分钟内文件系统/的空闲空间大于40GB。

{server:vfs.fs.size[/,free].min(10m)}>40G

17 具有不受支持的监控项和未知值的表达式

Versions before Zabbix 3.2 are very strict about unsupported items in a trigger expression. Any unsupported item in the expression immediately renders trigger value to Unknown. Zabbix3.2之前的版本对关于触发器表达式中的不受支持的监控项非常严格。表达式中任何不受支持的监控项都将触发器值立即显示为Unknown。

Since Zabbix 3.2 there is a more flexible approach to unsupported items by admitting unknown values into expression evaluation: 从Zabbix3.2开始对于不受支持的监控项,通过将它们引入到表达式评估中,产生了一种更加灵活的表达方式:

For some functions their values are not affected by whether an item is supported or unsupported. Such functions are now evaluated even if they refer to unsupported items. See the list in functions and unsupported items.
对于一些函数,它们的值不受监控项是否支持与不支持的影响,即使她们引用了不支持的监控项,也会对这些函数进行评估。关于这些函数,请参阅functions and unsupported items。
Logical expressions with OR and AND can be evaluated to known values in two cases regardless of unknown operands:
具有OR和AND的逻辑表达式可以在两种情况下评估为已知值,不用管未知的运算对象:
“1 or Unsuported_item1.some_function() or Unsuported_item2.some_function() or …” can be evaluated to '1' (True),
“1 or Unsuported_item1.some_function() or Unsuported_item2.some_function() or …“可以被评估为'1' (True),
“0 and Unsuported_item1.some_function() and Unsuported_item2.some_function() and …” can be evaluated to '0' (False).
Zabbix tries to evaluate logical expressions taking unsupported items as Unknown values. In the two cases mentioned above a known value will be produced; in other cases trigger value will be Unknown.
“0 and Unsuported_item1.some_function() and Unsuported_item2.some_function() and …“可以被评估为'0' (False).\Zabbix尝试评估将将不受支持的监控项作为Unknown值的逻辑表达式。在上述两种情况下,将产生一个Known值;在其他情况下,触发器将产生Unknown值。
If a function evaluation for supported item results in error, the function value is Unknown and it takes part in further expression evaluation.
如果对受支持的监控项的一个函数评估结果为错误,那么这个函数的值为Unknown ,并且它将参与进一步的表达式评估。
Note that unknown values may “disappear” only in logical expressions as described above. In arithmetic expressions unknown values always lead to result Unknown (except division by 0). 备注:未知值只会在上述逻辑表达式中“消失”。在算数表达式中未知值总会导致结果为Unknown(除以0除外)。

If a trigger expression with several unsupported items evaluates to Unknown the error message in the frontend refers to the last unsupported item evaluated. 如果具有多个不受支持的监控项的触发器表达式评估为Unknown,那么在前端中的错误消息值的是最后一个不受支持的项目。

3 触发器依赖

有时候,一台主机的可用性取决于另一台主机。例如,如果一台路由设备宕机,则路由设备后端的服务器全部会变得无法访问。如果这两者都设置了触发器,你可能会收到关于这两者宕机的报警,而事实上只有路由设备是真正存在故障的。

这就是主机之间某些依赖关系可能有用的地方,依赖关系设置的通知可能会被抑制,而只发送根本问题的通知。

虽然Zabbix不支持主机之间的直接依赖关系,但是它们可以定义另外一种更加灵活的方式——触发器依赖关系。一个触发器可能有多个依赖于它的触发器。

几个依赖关系的示例

例如, 主机的前面有Router1,Router2的前面有Router1。

Zabbix - Router1 - Router2 - Host
如果Router1宕掉,那么很明细那Host和Router2就不可达了,但我们并不想收到关于Host、Router1和Router2宕掉的这三个通知。

于是我们定义了如下两个依赖关系:

'Host is down' trigger depends on 'Router2 is down' trigger
'Router2 is down' trigger depends on 'Router1 is down' trigger
在改变“Host is down”触发器的状态之前,Zabbix将会检查相应触发器的依赖关系,如果找到,并且一个触发器处于“Problem”状态,则触发器状态将不会发生改变,因此不会执行actions动作,也不会发出相应的通知。

Zabbix递归执行此检查,如果Router1或Router2是不可达的状态,那么Host触发器则不会更新。

4 触发器严重性

触发器严重性定义了触发器的重要程度,Zabbix支持以下触发器的严重程度:

zabbix 触发器 恢复不起作用 zabbix触发器函数_zabbix 触发器 恢复不起作用_08

zabbix 触发器 恢复不起作用 zabbix触发器函数_后端_09

严重程度的用途为:

触发器的可视化表现,不同的颜色代表不同的严重程度。
全局报警音频。不同的音频代表不同的严重程度。
用户媒介,不同的用户媒介(通知渠道)代表不同的严重程度。例如,SMS表示高严重性,email表示其他严重性。
根据触发严重程度的情况来限定不同的actions动作。

5 自定义触发器的严重性

可以在Administration → General → Trigger severities选项中配置于严重性相关GUI元素的触发器严重性的名称和颜色。 配置的颜色可以在所有的GUI主题中共享。 === 翻译自定义触发器严重性的名称 === 如果使用Zabbix的前端Web页面进行自定义触发器严重性的名称,默认情况下,翻译的自定义触发器严重性的名称将覆盖Zabbix原有的翻译名称。 默认的触发器严重性名称可适用于所有语言环境的都有翻译。如果改变了触发器严重性的名称,则会在所有的语言环境中都使用此名称,因此在其他的语言环境中需要进行额外的手动翻译。 自定义严重性名称的翻译步骤: * 设置所需的自定义严重性名称,例如“Important” * 编辑/locale//LC_MESSAGES/frontend.po * 添加如下两行: msgid “Important” msgstr “” and save file. * 创建.mo文件为/locale/README的描述 这里的msgid应该对应新的自定义严重性名称,并且msgstr应该是特定语言的翻译。例如,如果是zh_CN环境,那么应该修改zh_CN下的frontengd.po文件。 应该在修改每个严重性名称后执行此过程。

6 单位符号

概述

在Zabbix,不得不使用一些较大的数字,例如“86400”秒代表一天,这些数字既然不便又容易出错。所以可以使用一些适当的单位符号(或后缀)来简化Zabbix触发器和监控项的键值。

上例中,你可以输入“1d”来代替“85400”即可。后缀为乘法函数。

触发器表达式

触发器expression常量和函数参数支持时间和内存大小的后缀

你可以使用如下时间单位后缀:

s - 秒 (通常情况下,不带任何时间单位后缀就表示s)
m - 分钟
h - 小时
d - 天
w - 周
时间单位后缀也受zabbix[queue,,]的internal item的参数和aggregate checks最后一个参数的支持。

对于内存大小你可以使用如下单位后缀:

K - kilobyte
M - megabyte
G - gigabyte
T - terabyte

可以使用的其他单位后缀

单位符号也用在前端数据的可读表述。

在Zabbix Server和前端都支持这些符号:

K - kilo
M - mega
G - giga
T - tera
当前端展示的item值为B、Bps时,那么使用base 2(1K=1024)。反之使用base 10(1K=1000) 另外前端也支持如下符号展示:

P - peta
E - exa
Z - zetta
Y - yotta

使用案例

通过使用一些适当的后缀,你可以编写易懂和易维护的触发器表达式,例如下面这些表达式:

{host:zabbix[proxy,zabbix_proxy,lastaccess]}>120
 {host:system.uptime[].last()}<86400
 {host:system.cpu.load.avg(600)}<10
 {host:vm.memory.size[available].last()}<20971520
 可以被修改为:{host:zabbix[proxy,zabbix_proxy,lastaccess]}>2m
 {host:system.uptime.last()}<1d
 {host:system.cpu.load.avg(10m)}<10
 {host:vm.memory.size[available].last()}<20M

7 批量更新

概述

使用批量更新,可以一次更改一些触发器的某些属性,从而节省了打开每个触发器进行单独编辑的需要。

使用批量更新

进行批量更新某些触发器,请执行以下操作:

在触发器列表中选中要更新触发器的复选框;
点击下面批量更新Mass update的按钮;
标记要更新的属性的复选框;
标记要更新属性的新值,点击下面的更新Update按钮。