告警是债,不是资产
我去年的工作内容之一,是把一套日均触发2万条告警的监控系统改造成日均不到200条。不是老板要求的,是我实在受不了了。凌晨三点被短信炸醒,打开手机一看——磁盘使用率超过80%,而那个磁盘是临时目录,里面只有几个日志文件。我回复了“知道了”然后继续睡,但第二天同样的告警又来一遍。这就是典型的“告警债”:每一次设置阈值都很随意,但从没人想过删掉它。
后来我做了个统计,过去30天里,告警排名前10的规则贡献了87%的告警量,而其中只有不到2%最终被确认为真实故障。换句话说,我们在用98%的噪音去包裹2%的真话。更可笑的是,由于告警太多,大家已经形成条件反射:先静音,再慢慢看。有一次真正的核心数据库连接池耗尽,告警混在几百条“慢查询超时”里,整整40分钟后才被值班的人翻出来。那次事故之后,我决定动手清理。
我关掉的不是告警,是团队的注意力
我做的第一件事,是拉出所有告警规则的触发记录,按“最近7天触发次数+历史确认故障次数”做一个二维矩阵。把那些触发次数极高但确认故障率极低的规则全部降级为日志记录,或者直接删除。比如某个老系统的GC暂停时间超过500ms,触发了1.4万次,但查了三个月工单,没有一次与之相关。为什么?因为那台机器用的是G1收集器,暂停500ms对它来说是正常操作,当初这个阈值是从网上抄来的,根本没人校准过。
另一个例子更典型——某接口响应时间超过1秒。这个接口本身就有个批处理任务在跑,偶尔超过1秒完全正常。但监控设计者没有区分“业务异常”和“业务常态”,只用了固定阈值。我把它改成基于百分位数的动态基线:只有响应时间超过P99的5倍才告警。结果一个月内,这个规则只触发了一次,而那一次确实是出了Bug。
还有一类是我直接删掉的:所有没有任何owner的告警。我发了一个公告,要求每一条告警规则必须指定责任人,并且责任人要写清楚“收到告警后做什么”。结果有一半的规则没人认领——因为他们都说“这个东西不是我负责的,是某某遗留的”。于是这些无人认领的告警全部被我关掉了。神奇的事情发生了,系统并没有因此变得不稳定。因为真正重要的故障,总会有人跑来问“为什么没告警?”,而那些无人关心的问题,本身就不该占用我们的睡眠。
告警应该描述“需要人决定的事”
清理完噪音之后,我开始重新审视告警的本质。我得出一个偏激的结论:告警的唯一价值,是触发人类做出一个原本不会做的决策。如果一个告警到达值班人员手里时,对方只需要点击“确认”然后继续睡觉,那这个告警就是多余的设计。我自己遇到过一条告警,内容是“订单服务实例数下降为2”,然后值班的人做了什么?他看了看,发现原本就是2,然后关掉。这种告警有什么意义?它只是把K8s的Deployment状态同步给了人,而人没有做出任何决策。
真正合理的告警,应该像这样:支付成功率低于99.9%,持续5分钟,已自动扩容,需要确认是否需要回滚到旧版本。这条告警本身就包含了上下文、影响、建议动作。但现实中,大多数监控工具只能告诉你“什么指标超了”,却不会告诉你“这意味着什么”。所以我在设计新的告警规则时,强制要求每条告警附带“人工处理指引”字段。如果写不出来,说明你根本不知道该告警要人做什么,那就不应该设置。
当然,这需要监控平台支持,或者自己开发一套简单的告警语义层。我们用的是Prometheus + Alertmanager,告警规则里有个summary字段,我要求所有规则必须把业务影响写进去,不能只写指标值。一开始同事觉得我闲得慌,后来某个凌晨群里的告警终于变成了这样:用户登录接口失败率突增到30%,可能的原因:Redis主从切换或网络抖动,请先检查连接池状态,再决定是否屏蔽登录入口——那天值班的人花了三分钟搞定了问题,而不是对着一个指标发呆。
告警数量与系统稳定性的关系是反的
很多人以为告警越灵敏,系统越安全。但我用实际数据说明了:当告警数量被压到原来的1%时,平均故障恢复时间反而从67分钟降到了21分钟。原因很简单,团队不再无视告警了。以前因为告警太多,大家默认大部分都是假的,所以连看都不看,导致真告警被淹没。现在只要有人收到一条告警,下意识就会认为这是一件需要处理的事。信任感重构了监控的价值。
但这并不意味着我推荐所有人都去关告警。我见过一个团队,把监控指标全部改成“无告警”,然后靠用户投诉来发现故障,这显然又是另一个极端。我的做法是:保留那些能明确指向“需要决策”的告警,即使是缓告警、低优先级,也绝不删除——比如“证书将在7天后过期”,这种告警一个月就一次,但错过就是事故。
现在我的手机里依然装着监控App,但一周可能只响一两声。我开始觉得,监控系统的最高境界不是“有告警就通知”,而是“几乎沉默,但一旦说话就让人不得不听”。这不是什么高级技术,只是一种对注意力的尊重。下次你要加一条告警时,先问问自己:这条告警值得把一个成年人从梦里叫醒吗?如果答案是不确定,那你就还没设计清楚它。
最后说一句:监控告警是整个运维体系中最像“人味”的部分,因为它逼着你承认——机器无法自己解决一切。如果你只是想让机器变得更吵,那不如把告警直接发送给垃圾桶。