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
  • 输入用于事件匹配的标签名称

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

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

由于可能存在配置错误,尤其是在不相关的问题之间可能生成相似事件标签时,请务必查看下面列出的情况!

  • 带索引的宏始终引用触发器配置中的 Expression 字段,而不是 Recovery expression。 例如,在恢复事件中,{ITEM.VALUE1} 将解析为恢复时刻问题表达式中第一个监控项的最新值。 如果恢复表达式基于不同的监控项,并且问题表达式中的监控项值在恢复时已经发生变化,那么这些事件将获得不同的标签,因此不会被关联。

  • 当两个应用程序将错误和恢复消息写入同一个日志文件时,用户可能会决定在同一个触发器中使用两个 service 标签,并通过在标签值中使用不同的正则表达式,从 {ITEM.VALUE} 宏中提取例如服务 A 和服务 B 的名称(例如,当消息格式不同时)。 但是,如果正则表达式没有匹配成功,这种做法可能无法按预期工作。 未匹配的正则表达式会产生空标签值,而问题事件和 OK 事件中只要都有一个空标签值,就足以将它们关联起来。 因此,来自服务 A 的恢复消息可能会意外关闭服务 B 的错误消息。

  • 实际的标签和值只有在触发器触发后才会显示出来。 如果所使用的正则表达式无效,它会被静默替换为 *UNKNOWN* 字符串。 如果带有 *UNKNOWN* 标签值的初始问题事件被遗漏,之后可能会出现带有相同 *UNKNOWN* 标签值的 OK 事件,并关闭本不应该被关闭的问题事件。

  • 如果用户将 {ITEM.VALUE} 宏直接用作标签值而不使用宏函数,则会受到 255 个字符限制。 当日志消息很长且前 255 个字符缺乏特异性时,也可能导致不相关的问题产生相似的事件标签。