Zabbix配置邮件通知规则前已触发告警的邮件补发问题咨询
看起来你遇到的是Zabbix里挺常见的“旧告警补通知”场景——在配置邮件告警规则之前,触发器已经触发并处于告警状态,现在想让系统补发这个告警的邮件通知对吧?
先给你解释下为什么之前的操作没效果:Zabbix的告警通知触发逻辑是基于事件的状态变化的,比如触发器从正常切换到告警(这是一个触发通知的事件节点),或者从告警恢复到正常(另一个节点)。你之前禁用再启用触发器/主机,只是重启了监控采集流程,并没有让这个已存在的告警事件产生“需要发送通知”的新触发点,所以邮件自然发不出来。
下面给你几个可行的解决办法,按操作复杂度从低到高排序:
方法1:手动制造一次触发器状态变更
你可以通过临时调整触发器阈值,让它先回到正常状态,再改回原阈值,迫使触发器产生状态变化,触发新的告警事件:
- 找到对应低磁盘空间的触发器(比如类似
vfs.fs.size[/,free] < 10G的规则),临时把阈值调得极低(比如改成vfs.fs.size[/,free] < 1G,确保当前磁盘空间能满足这个条件,让触发器从告警变回正常) - 等待1-2个Zabbix采集周期(默认60秒),确认触发器状态已经恢复正常
- 再把触发器阈值改回原来的设置,此时触发器会再次触发告警事件,这时候因为你的邮件通知规则已经生效,就能收到对应的告警邮件了
这个方法操作简单,不用碰数据库,适合快速解决单个告警的补发需求。
方法2:通过Zabbix API手动触发通知
如果你熟悉Zabbix API的话,可以直接调用API针对已有的告警事件发送通知:
- 先用
event.get方法,根据主机名、触发器名称过滤,查询到这个低磁盘告警对应的eventid - 再调用
alert.send方法,指定对应的eventid、目标用户/用户组ID,以及通知类型(邮件),强制系统发送一次通知
这个方法更灵活,不需要改动触发器配置,适合有一定技术基础的用户。
方法3:直接操作Zabbix数据库(谨慎使用!)
如果上面两种方法都不适用,你可以直接修改Zabbix数据库里的事件记录,但一定要先备份数据库,操作前最好在测试环境验证:
- 找到
events表,根据主机ID和触发器ID定位到对应的告警事件记录 - 查看
alerts表,确认这个事件没有对应的通知记录 - 手动插入一条通知记录到
alerts表,或者更新事件的状态标记,让Zabbix的通知进程重新识别到它
不过这个方法风险较高,操作失误可能影响整个Zabbix的事件记录体系,非必要不建议使用。
最后再补一句:Zabbix默认确实不会对“已存在的告警事件”补发通知,因为它的通知逻辑是跟着事件的状态变更走的,所以核心思路就是要么让系统认为产生了新的告警事件,要么手动触发通知动作。你之前尝试的禁用启用操作,本质上没改变事件状态,所以才没触发邮件。
备注:内容来源于stack exchange,提问作者david sierra fernandez

