Geneos ITRS规则脚本死循环超量发送告警邮件问题咨询
问题1:邮件告警死循环的根因
- Geneos 规则引擎的默认触发逻辑不只是sampler执行时才触发:任何会影响规则评估结果的属性变更(包括规则自身修改的
severity、userdata等属性)都会触发规则重新执行。 - 你的规则中每次满足条件后都会修改
severity值,这个修改动作会立刻触发规则重新评估,而端口状态在sampler两次采集间隔内不会变化,所以每次重新评估都会再次满足发邮件的条件、再次修改severity,形成无限循环。
问题2:每分钟发送数千封邮件的原因
- 这个循环是网关进程内部的内存级循环,完全不依赖sampler的60秒执行间隔:只要规则修改了属性就会立刻触发重跑,网关性能足够的情况下每秒可以执行几十到上百次规则评估,因此1分钟内会产生数千次调用
SendEmail的动作。 - 初期运行正常是因为首次触发时状态变更只发生一次,还没进入自触发的循环逻辑,后续只要出现一次状态变更触发了
severity修改,就会立刻进入循环。
问题3:多端点监控单条告警的实现方案
你可以按以下步骤修改配置即可满足需求:
- 修改规则触发条件:将规则的触发模式从默认的
On Change改为On Data Update,这样规则只会在sampler执行完、采集到新数据的时候才运行,不会响应规则自身修改属性产生的变更。 - 优化规则逻辑:增加上一次状态的持久化判断,仅在整体状态真正发生变更时才发邮件,示例逻辑如下:
# 初始化当前状态 set $(currentStatus) "OK" if path "port100" value <> "OK" then set $(currentStatus) value endif if path "port101" value <> "OK" then set $(currentStatus) value endif # 仅当整体状态和上一次采样的状态不一致时才执行动作 if $(currentStatus) <> "OK" and previous severity = ok then severity warning userdata "Subject" "something is wrong" run "SendEmail" elseif $(currentStatus) = "OK" and previous severity <> ok then severity ok userdata "Subject" "Everything is ok" run "SendEmail" endif
- (可选)配置网关告警抑制规则,对同一个规则产生的同主题邮件设置1分钟的最小发送间隔,避免极端场景下的重复告警。
关于是否是ITRS Bug的说明
这不是ITRS的Bug,是Geneos规则引擎的预期设计:规则引擎默认会监听所有关联属性的变更,目的是支持跨数据项的联动计算,只是你的配置没有限制触发范围,导致了自循环的问题。
内容的提问来源于stack exchange,提问作者Saboteur
相关产品推荐
相关产品推荐

