告警太多等于没有告警。本文拆解炬鲸 OBSERVE 告警引擎的规则定义、降噪聚合、分级分派三层设计,并给出可直接套用的告警规则配置示例。
先说一个真实场景。某支付团队把「错误率大于 1%」「响应时间超过 200ms」「磁盘使用率大于 80%」全部配成告警,结果一次服务抖动,一分钟内能刷出几十条通知。值班的人很快养成习惯——先把告警群静音,再慢慢看。告警一旦失去信任,真正的事故反而没人点开。
炬鲸 OBSERVE 的告警引擎核心思路只有一条:让每一条告警都值得被点开。围绕这个目标,它分三层实现——规则定义、降噪聚合、分级分派。
规则支持三类触发条件,可以自由组合:
cpu_usage > 80 且持续 5 分钟error_rate > 0.5%OutOfMemoryError 或 connection reset一条规则可以同时挂多个条件,命中任意一个即触发。建议给规则加 for 参数,让异常持续一段时间才告警,避免瞬时抖动误报:
alert: 订单服务错误率
expr: sum(rate(http_requests_total{status=~"5.."}[5m])) / sum(rate(http_requests_total[5m])) > 0.005
for: 3m
for: 3m 的意思是:错误率连续 3 分钟超过 0.5% 才触发。这一行能挡掉绝大多数由发布、扩缩容引起的瞬时毛刺。
降噪靠三招。
第一招是按维度聚合。同一服务、同一错误类型只发一条,而不是每个实例、每台机器各发一条。第二招是静默窗口。凌晨发版、计划内维护这类例行变更,可以手动或按计划静默,避免操作本身刷屏。第三招是告警分组。把同一根因的告警归到一个组,一次只通知一次,后续新增的相同告警只是往这个组里追加,不再重复打扰。
配合恢复通知,只有「触发到恢复」这个完整生命周期才值得关注,中间的重复提醒一律省略。
分派按严重级别走不同通道:
每条通道都支持重试与超时升级,解决「消息发出去了但没人看见」的问题。
上线第一周建议只开 P0 和 P1,把 P2 当成观察项静默记录。等团队对告警的信噪比满意了,再逐步放开。告警的价值从来不在数量,而在每一次响起都有人行动。