Sensu升级后:实现检查n次异常后触发处理程序的最佳实践
我完全懂你升级后的困扰——Sensu从0.24到1.x确实大幅调整了告警触发的逻辑,原来check里的occurrences属性不再直接控制触发条件,而是需要通过**过滤器(filter)**来实现这个“连续n次异常才告警”的需求。下面一步步教你配置:
1. 先搞懂核心变化
在Sensu 1.x中,check配置里的occurrences只是事件的元数据(用来记录当前异常连续发生的次数),不再自动过滤事件。真正的过滤逻辑要放到处理程序(handler)的过滤器链里,这样配置更灵活,能给不同的handler设置不同的触发阈值。
2. 创建一个基于异常次数的过滤器
首先创建一个过滤器,比如我们要实现“连续5次异常才允许触发”,可以在Sensu的配置目录(通常是/etc/sensu/conf.d/filters/)下新建一个occurrences_5.json文件,内容如下:
{ "filters": { "occurrences_5": { "attributes": { "occurrences": { "gte": 5 } }, "when": { "status": "!= 0" } } } }
这个过滤器的逻辑很直白:当事件状态不为0(也就是检查失败)时,只有当occurrences(连续异常次数)大于等于5的时候,才允许事件通过这个过滤器,到达后续的处理程序。
3. 给PagerDuty处理程序关联这个过滤器
接下来修改你的PagerDuty处理程序配置,确保它只接收通过上述过滤器的事件。找到你的pagerduty handler配置文件(比如/etc/sensu/conf.d/handlers/pagerduty.json),添加filters字段:
{ "handlers": { "pagerduty": { "type": "pipe", "command": "pagerduty-handler", "filters": ["occurrences_5", "handle_when"] } } }
这里的handle_when是Sensu自带的默认过滤器,它会帮你过滤掉一些不需要处理的情况(比如事件处于flapping状态、或者是恢复事件不需要告警的场景),建议保留。
4. 调整检查配置(可选,但建议保留)
你原来的check配置里的occurrences可以保留,它现在的作用是设置事件初始的occurrences值(默认是1),但核心的过滤逻辑已经由上面的过滤器完成了。你的check配置可以继续用之前的内容:
{ "checks": { "examplecom_http": { "command": "check-http.rb --url https://example.com -s -k -q 'Keyword'", "handlers": ["default","pagerduty"], "subscribers": ["network"], "interval": 60, "occurrences": 5 } } }
5. 验证配置
重启Sensu相关服务(sensu-server、sensu-api),然后模拟这个HTTP检查连续失败5次的情况,你会发现PagerDuty只会在第5次异常时触发告警,完全符合你的预期。
额外提示
- 如果不同的检查需要不同的触发阈值(比如有的要连续3次,有的要5次),可以创建多个过滤器(比如
occurrences_3、occurrences_5),然后给对应的handler关联不同的过滤器即可。 - 当检查恢复(status=0)后,Sensu会重置该事件的
occurrences计数,下次异常会从1重新开始累加,这和你之前0.24版本的逻辑是一致的。
内容的提问来源于stack exchange,提问作者Tim Brandes

