一个监控群里每天滚动上百条告警,没有人点开看——这不是监控做得不够,而是监控已经失效。告警的价值不取决于发了多少条,而取决于收到的人是否还愿意看。当告警多到被当成背景噪音,真正致命的那一条就会淹没在里面。这种状态有个名字:告警疲劳。它不是人的问题,是设计的问题。这篇文章讲怎么把告警系统的信噪比救回来。
疲劳是怎么形成的
告警疲劳的形成路径几乎千篇一律。系统上线初期,团队本着"宁可多报不可漏报"的心态,给每个指标都挂上阈值:CPU超过70%报警,磁盘超过80%报警,接口错误率超过1%报警。初期告警不多,每条都有人看。
然后系统规模变大,告警开始变多。大部分告警指向的是不需要立即处理的状态——CPU冲高两分钟又回落、某个边缘接口偶发超时、夜间批处理任务照例把磁盘IO打满。处理这些告警的收益是零,但每一条都在消耗注意力。人对重复无效刺激的适应速度非常快:第一周还会点开看,第二周扫一眼标题,第三周直接静音群聊。
静音之后,告警系统在形式上仍在运转,实质上已经死亡。更隐蔽的代价是新成员的学习环境被污染:他们从入职第一天就看到满屏告警无人处理,于是"告警可以忽略"成为团队默认文化。真正的故障发生时,告警确实发出来了,但没有人看见——事后复盘会发现"监控其实报了",这句话在无数事故报告里出现过。
第一原则:告警必须指向行动
区分两个概念:告警(alert)和指标(metric)。指标是系统状态的记录,用来看趋势、做分析、事后排查;告警是对人的中断,要求立即放下手头的事来处理。混淆这两者是疲劳的根源——把应该躺在仪表盘里的东西推送到了人的面前。
判断一条告警该不该存在,只需要一个问题:**收到它的人需要立即做什么?**如果答案是"看一眼,一般不用管",它就不该是告警,应该降级为仪表盘上的一条曲线。CPU 70% 本身不需要行动;"服务响应时间超过SLO且持续五分钟"才需要。前者是原因的猜测,后者是后果的确认。
由此推出告警设计的方向性转变:少盯资源指标,多盯用户可感知的症状。用户感知不到的抖动不值得叫醒任何人;用户已经受影响的问题,一条都不能漏。症状导向的告警天然数量少、准确率高,因为它绑定的是真实损害而不是可能性。
分级:不是所有问题都配叫醒你
把所有告警塞进同一个通道、用同一种方式推送,等于宣布所有问题同等重要——而"全都重要"和"全都不重要"是同一句话。
告警至少要分三级。第一级是需要立即处理的:核心功能不可用、数据正在丢失,这一级走电话或强提醒,深夜也要叫醒人,同时它的准入标准必须极其严格。第二级是需要今天处理的:冗余损失、容量逼近上限,走工作时间的群消息或工单,不打扰休息。第三级是需要知道的:趋势异常、非核心组件退化,进日报或周报,批量消化。
分级之后,推送通道也要随之分开:最高级走独立的强提醒通道,绝不和普通消息混在同一个群里——否则分级只存在于标签上,不存在于体验中。
分级的关键不在于定义了几档,而在于纪律:每一条新告警在创建时就必须declare级别,并回答"为什么它配这个级别"。没有分级纪律的系统会自然滑向所有告警都用最高优先级——因为每个模块的负责人都觉得自己的模块最重要。
降噪的技术手段:聚合、抑制、静默
设计层面立好规矩之后,还有三个技术手段能直接压缩噪音总量。
第一是聚合。一台交换机故障导致三十台机器同时失联,收到的应该是一条"机房A网络异常,影响30台主机",而不是三十条独立告警。按时间窗口、按拓扑关系、按故障域做聚合,是把告警量从事件数压缩到事故数的关键——人处理的单位是事故,不是事件。
第二是抑制。告警之间存在因果关系:数据库挂了,依赖它的十个服务必然全部报错。如果告警系统理解这层依赖,就应该只推送根因告警,把下游的衍生告警折叠为附注。没有依赖信息时,简单的规则也有效:同一服务在短窗口内的重复告警只报第一条,恢复之前不再重复推送。
第三是静默窗口。计划内的发布、迁移、演练期间,相关告警应该预先静音——让工程师在变更时被自己制造的预期内告警轰炸,是对注意力的无谓消耗。关键是静默必须带到期时间,到期自动恢复,否则"临时静音"会变成永久失明。
治理:告警也需要生命周期
告警规则不是写完就完了的配置,它和代码一样会腐烂。业务下线了告警还在、阈值是三年前的容量水位、触发条件对应的架构早已重构——这些僵尸规则是噪音的稳定来源。
有效的治理靠三个机制。第一,定期复盘告警量:每月统计触发次数最多的前十条规则,逐条追问"它带来行动了吗",没有带来行动的要么调阈值要么降级要么删除。第二,记录响应率:一条告警如果连续几十次触发都没有人处理,系统应该自动把它标记出来,交还给规则的owner重新评估。第三,每条规则必须有owner和到期时间,到期不续期就自动禁用——用默认消亡对抗默认堆积。
删告警在心理上很难,没有人想为"删掉的那条规则恰好漏掉故障"负责。所以治理必须制度化,让删除成为例行操作而不是个人决断。保留一条无效告警的成本是隐性的,但它每天都在支付:支付的货币是团队对整个监控系统的信任。
信噪比是监控系统的生命线
回到开头的场景:告警群无人查看,不是因为大家不负责任,而是系统用持续的噪音训练出了忽略行为。修复它的路径很清晰——每条告警指向明确行动、按紧急程度分级推送、用生命周期治理清除僵尸规则。做完这三件事,告警量通常能降一个数量级,而漏报率反而下降,因为剩下的每一条都会被认真对待。
监控系统的终极产出不是数据,是及时且正确的人类行动。一条被认真对待的告警,抵得上一百条被划走的推送。信噪比每降低一分,距离"监控报了但没人看见"的事故就近一分;而每删掉一条无效告警、每合并一次重复推送,都是在为真正重要的那一条赎回注意力。告警系统值得像对待产品一样持续打磨——它的用户是深夜被叫醒的工程师,它的核心指标只有一个:被叫醒的那次,值不值得。