1 触发器事件关联
概述
基于触发器的事件关联允许关联一个触发器产生的不同问题。
通常,在Zabbix中正常事件会关闭一个触发器生成的所有问题事件,但在某些情况下需要更加详细的方法。例如,当监控日志文件时,你可能想在日志文件中某些问题并将单独关闭,而不是全部关闭。
触发器的问题事件生成模式参数设置为多重的情况,通常用于日志监控、trap处理等。
在Zabbix中可以根据标签关联问题事件。标签用于提取值并创建问题标识。利用这一点,也可以根据匹配标签单独关闭问题。
换言之,相同的触发器可以通过事件标签创建不同事件。因此,可以通过事件标签逐个创建问题事件,并通过事件标签单独关闭事件。
工作原理
在日志监控中,您可能会遇到类似这样的行:
第 1 行:Service 1 stopped
第 2 行:Service 2 stopped
第 3 行:Service 1 was restarted
第 4 行:Service 2 was restarted
事件关联的思路是,能够将第 1 行中的问题事件与第 3 行中的恢复对应起来,将第 2 行中的问题事件与第 4 行中的恢复对应起来,并逐个关闭这些问题:
第 1 行:Service 1 stopped
第 3 行:Service 1 was restarted #第 1 行中的问题已关闭
第 2 行:Service 2 stopped
第 4 行:Service 2 was restarted #第 2 行中的问题已关闭
为此,您需要为这些相关事件添加标签,例如“Service 1”和“Service 2”。这可以通过对日志行应用正则表达式来提取标签值实现。这样,在创建事件时,它们将分别被标记为“Service 1”和“Service 2”,问题也就可以与恢复相匹配。
配置
监控项
首先,你需要设置一个监控日志文件的监控项,例如:
log[/var/log/syslog]

当监控项设置完成时,等待加载配置更改约一分钟,然后去 最新数据中确保监控项开始采集数据。
触发器
在监控项正常工作的情况下,您需要配置触发器。重要的是要决定日志文件中的哪些条目值得关注。例如,下面的触发器表达式会搜索类似于 'Stopping' 的字符串,以指示潜在问题:
find(/My host/log[/var/log/syslog],,"regexp","Stopping")=1
为确保每一行包含字符串 "Stopping" 都被视为问题,还需要在触发器配置中将 Problem event generation mode 设置为 'Multiple'。
然后定义恢复表达式。下面的恢复表达式会在找到包含字符串 "Starting" 的日志行时解决所有问题:
find(/My host/log[/var/log/syslog],,"regexp","Starting")=1
由于我们不希望这样,因此重要的是要以某种方式确保相应的根问题被关闭,而不仅仅是所有问题。这就是标签可以发挥作用的地方。
可以通过在触发器配置中指定一个标签来匹配问题和恢复。需要进行以下设置:
- Problem event generation mode: Multiple
- OK event closes: All problems if tag values match
- 输入用于事件匹配的标签名称

- 配置标签,从日志行中提取标签值

如果配置成功,您将能够在 Monitoring > Problems 中看到按应用程序标记并与其恢复相匹配的问题事件。

由于可能存在配置错误,当类似的事件标签可能会为无关问题创建时,请务必查看下面列出的情况!
-
索引宏始终引用触发器配置中的 Expression 字段,而不是 Recovery expression。 例如,在恢复事件中,{ITEM.VALUE1} 将解析为恢复时问题表达式中第一个监控项的最新值。 如果恢复表达式基于不同的监控项,并且在恢复时问题表达式中监控项的值发生了变化,那么这些事件将具有不同的标签,因而不会被关联。
-
当两个应用程序向同一个日志文件写入错误和恢复消息时,用户可能会决定在同一个触发器中使用两个 service 标签,并通过在标签值中使用单独的正则表达式来提取服务 A 和服务 B 的名称,例如从 {ITEM.VALUE} 宏中提取(例如,当消息格式不同的时候)。但是,如果正则表达式没有匹配,这种方式可能不会按预期工作。 不匹配的正则表达式会产生空的标签值,而问题事件和 OK 事件中只要有一个空的标签值就足以将它们关联起来。 因此,来自服务 A 的恢复消息可能会意外关闭来自服务 B 的错误消息。
-
只有在触发器触发时,实际的标签和标签值才会可见。 如果所使用的正则表达式无效,它会被静默替换为 *UNKNOWN* 字符串。 如果带有 *UNKNOWN* 标签值的初始问题事件被遗漏,后续可能会出现具有相同 *UNKNOWN* 标签值的 OK 事件,从而关闭本不应被关闭的问题事件。
-
如果用户将不带宏函数的 {ITEM.VALUE} 宏用作标签值,则适用 255 个字符的限制。 当日志消息很长且前 255 个字符没有特定信息时,这也可能导致无关问题产生相似的事件标签。