一个系统出了问题,没有告警,当然危险。
但另一种情况也值得警惕:告警一直在响,真正的故障却需要业务方反馈,团队才开始处理。
监控覆盖了,规则触发了,消息也送达了。为什么仍然没能及时发现问题?
因为从"异常被报告"到"有人采取行动",中间还有一段距离。告警越多,这段距离有时反而越长。
下面用一个简化场景,讨论告警如何失去作用,以及怎样把它重新变成有效的响应入口。
一、一个问题,为什么产生几十条通知?
某业务服务的下游持续变慢,请求占用资源的时间增加,逐渐形成积压。
text
下游响应变慢
↓
并发请求堆积
↓
线程池、连接池压力增加
↓
入口请求超时
↓
业务成功率下降
每个环节都可能触发告警:
| 告警 | 反映的信息 |
|---|---|
| 下游 P99 延迟升高 | 依赖响应异常 |
| 活跃线程数升高 | 并发资源压力增加 |
| 连接池等待时间增加 | 获取连接变慢 |
| 入口超时率升高 | 请求无法及时完成 |
| 业务失败率升高 | 用户目标受到影响 |
这些信号都有价值,但如果每条规则按实例触发、分别发送、重复提醒,一个问题就可能产生几十条通知。
值班人员需要先判断:它们是不是同一件事?哪条最重要?影响了哪些业务?应该找谁?
通知增加了,判断工作也被转移到了人身上。
更麻烦的是,同一批规则平时也会触发:短暂抖动、自动恢复、无须介入。
经历多次之后,值班人员会学会先等一等。
这时,一次持续恶化的故障,可能与日常噪声有着相似的开场。
二、告警不仅消耗时间,也消耗信任
我们常把告警当成一道防线:有规则,就有人知道;有人知道,就会处理。
实际上,一条告警需要走完这样的链路:
text
收到 → 看懂 → 判断影响 → 找到责任人 → 开始处理
消息送达,只完成了第一步。
如果一条告警反复触发,却长期不需要行动,人就会降低对它的重视程度。如果多条规则都如此,整个通知渠道都会失去可信度。
无效告警消耗的,不只是处理它的几分钟,还有下一条重要告警被及时关注的机会。
Google SRE 强调,打断值班人员的告警应该具有可操作性:收到后,需要有人及时采取明确行动。
因此,创建规则时,应该先问:
这条消息触发后,我们希望收到它的人做什么?
如果答案长期是"先看看",就需要重新评估它的通知等级。
信息可以进入看板,可以形成待办,也可以用于排查。它们不必都成为紧急通知。
三、黄金信号是观察框架,不是全部报警的清单
Google SRE 提出的四个黄金信号是:延迟、流量、错误和饱和度。
落到业务上,它们对应四个问题:
| 黄金信号 | 业务问题 |
|---|---|
| 延迟 | 用户需要等多久才能得到结果? |
| 流量 | 工作是否正常进入并完成? |
| 错误 | 用户希望完成的事情是否成功? |
| 饱和度 | 剩余处理能力是否还能承接需求? |
这比只看 CPU、内存或 HTTP 状态码,更接近用户受到的影响。
例如,接口返回 HTTP 200,但订单创建失败;提交任务很快,但任务几个小时没有完成。技术调用看起来正常,业务已经异常。
不过,业务指标补齐之后,也不能把每个变化都设成紧急告警。
流量下降可能是低峰,耗时短暂升高可能是抖动,积压增加也可能仍在交付时限内。
指标负责提供信息,告警负责提出行动要求。两者需要分别设计。
紧急告警应优先关注明确的业务影响,或需要立即处理的风险。资源、依赖和日志信号则帮助定位原因,也可以在风险明确时提前预警。
四、治理告警,先把通知组织好
1. 聚合相关信号
面对前面的下游变慢场景,值班人员首先需要看到的是:
某业务成功率下降,相关异常包括下游延迟升高、连接等待增加。
而不是先阅读几十条孤立消息。
在 Grafana Alerting 中,可以通过稳定的服务、环境、区域等标签,结合 Notification policies 进行路由和分组。
分组过细,仍然形成通知风暴;分组过宽,又可能把独立故障混在一起。边界应结合责任范围和处置方式设计。
2. 去重并控制重复提醒
持续存在的同一问题,不应每次评估都成为新事件。
时间戳、业务单号、动态错误文本等内容,不宜放入告警身份标签,否则可能不断生成新的告警实例。它们更适合放在注释或查询链接里。
重复通知间隔也需要匹配响应流程。没人确认、影响继续扩大时,应有升级机制;已经进入处置的事件,不必继续用相同消息刷屏。
3. 降低噪声,保留证据
短暂异常可以通过适当的持续时间条件过滤,但等待时间过长也会延误响应。
同一故障的次级通知可以减少,相关指标仍应保留在看板中,供响应人员下钻。
调整之后,要用历史故障和日常数据验证:
- 原来的噪声是否减少?
- 真实问题是否仍能及时触发?
- 故障恢复后是否及时解除?
通知少了,并不自动意味着治理成功。
五、告警需要行动入口,也需要退出机制
"服务异常,请关注",把后续工作全部留给了值班人员。
一条紧急告警至少应提供:
- 影响业务和范围;
- 负责团队;
- 业务看板与排查链接;
- 建议检查项或处置手册。
例如先确认业务影响,再查看近期变更和异常依赖。具体动作需要说明条件,避免把"重启服务"变成默认答案。
规则上线以后,还需要维护。
业务会迁移,流量会变化,阈值会过时。曾经有效的规则,可能逐渐只剩噪声。
可以定期审查触发最多的几条:
| 问题 | 目的 |
|---|---|
| 最近触发中,多少次需要介入? | 判断行动价值 |
| 收到后是否知道怎么处理? | 检查处置能力 |
| 是否与其他规则重复? | 减少重复打断 |
| 哪些真实故障没有及时发现? | 检查覆盖缺口 |
| 负责人和业务范围是否仍然有效? | 清理过期规则 |
删告警需要依据,保留告警同样需要依据。
六、告警过多,也是管理问题
做研发管理时,很容易从规则数量里获得安全感。
事故之后"再加一条告警",具体、容易交付,也容易被当作整改完成。
但谁接收、收到后做什么、旧规则是否仍然有效,未必一起被安排。
最后,值班人员需要在深夜替整个系统判断:这一百条消息里,哪一条值得处理?
Google SRE 重视减少重复、可被自动化替代的运维劳动。每天人工确认"这条不用管,那条再等等",就是一个值得治理的信号。
注意力是有限的可靠性资源。
规则数量可以增加,但无效打断不应随之增加。管理者需要为告警的行动价值、责任边界和维护成本负责。
下一次添加规则前,先问清楚:
谁需要收到?为什么需要现在收到?收到后做什么?
告警体系的质量,最终体现在危险发生时,人能否及时看见、正确判断并开始行动。