一次 P0 故障复盘:告警泛滥,真正问题被海量信息淹没
为什么根因出现后,没有第一时间被识别?是告警设计问题,还是信息分发问题,或者现场协同问题?
我是全栈若城,曾就职容猫、四维等大厂,涉猎大前端、Python、鸿蒙等领域技术
前阵子凌晨,群里炸锅了,不是那种“有一条告警需要看一下”的小动静,而是几十条、上百条不同系统的红色消息一起往外蹦。
数据库慢查询、接口超时、容器重启、网关抖动、业务失败率升高,谁看都觉得像是全线崩了。
但折腾一圈后,我才发现真正的根因其实只有一个。问题不难,难的是它被一大堆“伴生告警”彻底埋住了。
这也是很多团队嘴上说在做 AIOps,实际还停留在“告警转发机器人”阶段的原因:消息越来越多,人越来越忙,真正该第一时间盯住的东西,反而最容易被错过。
这次事故,问题不是没告警,而是告警太多了
很多人对运维告警有个误解,觉得“有告警总比没告警强”。
说实话,这话只对了一半。没有告警当然危险,但告警太多、太碎、没有优先级,一样危险。因为人不是机器,不可能在一分钟内把几十条不同来源、不同级别、不同表达方式的信息全部吃透。
那次故障里,最早出现的其实是一条核心依赖服务响应时间抖动告警。按道理,这条告警应该被立刻放大,因为它是后续一连串异常的起点。
可现实是,它混在一堆“现象级告警”里,存在感并不高。等大家真正定位到它,已经被后面的告警洪峰拖了二十多分钟。
二十多分钟,在故障处理里已经很贵了。
为什么一到线上,大家就容易掉进“告警信息海”
我后来复盘,发现这个坑不是某一个人没经验,而是监控体系本身就在制造噪音。
很多团队的监控建设路径都差不多:先把能接的监控都接上,再把能配的阈值都配上,最后把消息一股脑发到群里。
刚开始看着很安心,觉得覆盖率很高。可一旦线上真出事,问题也会成倍放大。
告警按资源维度建得太多,按业务链路建得太少
CPU、内存、磁盘、线程数、连接池、QPS、响应时间,这些指标都重要,但它们更像“局部体征”。
真正决定处理效率的,是你能不能快速回答一个问题:到底是哪条业务链路先坏了,影响范围有多大,根因更像上游、下游,还是平台底座。
如果监控只能告诉你“这里红了、那里也红了”,但不能把它们串起来,那一线值班的人只能靠经验硬猜。
大量告警是结果,不是原因
接口超时、线程池打满、重试次数升高、消息堆积,这些经常不是第一现场,而是连锁反应。
最怕的不是没有线索,最怕的是线索太多,而且每条都像真的。大家在群里各自贴图、贴日志、贴监控截图,看起来很努力,实际上很容易把排查节奏打散。
告警文案写得像机器,不像给人看的
这一点特别常见。
很多告警消息堆满了指标名、实例名、阈值和时间戳,但没有一句人话告诉你:这条告警意味着什么,建议先看哪里,它和当前已知故障有没有关系。
告警不是存档文件,它是给值班同学在高压状态下快速决策用的。
如果一条告警消息发出来,大家还要先翻半天 Wiki、再问一轮业务方、再猜一遍依赖关系,那它的价值其实已经打了很大折扣。
那次,我们是怎么把问题捞出来的
说白了,真正起作用的不是“看到了更多数据”,而是把杂乱信息重新排了序。
当时现场能稳定推进,靠的是下面这三步。
第一步,先停掉“无意义同步”
故障群一热闹,最容易发生的事情就是所有人同时发言。
有人看 JVM,有人查网关,有人看数据库,有人翻发布记录。信息量很大,但大部分是平铺的,没有汇总,也没有主线。这个时候如果继续放任消息流滚下去,排查效率只会越来越低。
我们做的第一个动作,不是继续查,而是先把现场收束住:指定一个人统一汇总结论,其他人只报“已确认的信息”和“下一步动作”,不再贴大片原始截图。
这个动作看起来很土,但特别有用。因为它相当于先把人的注意力从噪声里拉出来。
第二步,只盯最早异常时间点
告警一多,大家很容易追着最新红点跑。
但故障定位不能这么干。越往后出现的异常,越可能只是连锁反应。真正有价值的,通常是最早那一批信号。
所以,我们把所有核心告警按时间线重新过了一遍,只看最早 5 分钟内发生了什么。
结果很快发现,某个关键依赖在那个时间窗口里先出现了响应抖动,后面业务超时、线程堆积、重试放大,基本都能顺着这条线解释通。
一旦主线出来,很多“看起来也很严重”的告警就可以先降权。这一步非常关键。不是每条红色都值得同等对待。
第三步,把“症状”跟“根因候选”分开
我们后来在群里临时做了一个很简单的分类:
- 根因候选:最早出现、影响面大、能解释后续异常的告警
- 伴生症状:由上游问题引发的失败率、超时、堆积、重启
- 无关噪音:历史波动、偶发抖动、和本次链路无明显关系的异常
你别小看这个动作。
很多团队之所以复盘老是空转,不是因为没数据,而是因为没有在故障现场做信息分层。大家把三类信息混在一起讨论,自然谁都觉得自己看到的是重点。
一旦分层,处理动作也会跟着清晰很多。根因候选优先拉通负责人验证,伴生症状只做影响面观察,无关噪音先静音或者延后处理。
这件事让我真正理解了 AIOps 该解决什么
以前我也见过一些所谓的 AIOps 方案,演示时很酷:自动聚合、自动关联、自动根因分析、大模型诊断建议,看起来什么都能做。
但如果落不到真实故障处理流程里,再漂亮都只是 PPT 能力。
这次之后,我反而更明确了,AIOps 在一线场景里最有价值的,不是替人“生成很多判断”,而是先帮人把注意力用对地方。
具体来说,我觉得至少要做到下面几件事。
告警降噪,不是简单去重
很多系统说自己做了降噪,实际只是把相同文案合并了一下。
这远远不够。真正有效的降噪,应该能识别同一根因引发的多点异常,把一串症状压缩成一个可操作事件。值班的人看到的,不应该是 36 条红消息,而应该是“某核心依赖异常,已影响 4 条业务链路,当前优先级 P1”。
这才叫能用。
要有时间线和因果链,不只是指标堆叠
故障排查最怕静态看板。
因为静态看板只能告诉你“现在有什么异常”,却很难告诉你“谁先发生、谁后发生、谁更像原因”。如果 AIOps 能把监控、日志、链路、变更记录按时间线自动拼起来,现场判断会轻松很多。
运维同学不是不懂技术,很多时候只是缺一个足够清晰的全局视图。
告警内容必须面向处理动作
一条好的告警,至少应该回答四个问题:
- 现在到底是什么异常
- 影响了哪些业务或用户
- 它更像根因还是伴生现象
- 下一步建议先查什么
如果做不到这四点,告警再快也只是更快地打扰人。
如果你们团队也在被告警折磨,可以先做这 4 个小改动
不用一上来就谈特别重的平台建设。
很多时候,先把几个关键动作做对,效果就已经很明显了。
1. 给核心链路做“首告警”标记
不是所有告警都值得抢占注意力。
把订单、支付、登录、核心接口这类关键链路的首个异常信号单独标出来,优先级直接拉高。哪怕还做不到完整的根因分析,先做到“谁最早出问题,谁先被看见”,已经能省掉不少时间。
2. 给告警加业务语义
别只写实例和指标名。
尽量补上业务名称、上下游依赖、影响范围、推荐排查入口。让看到消息的人不需要二次翻译,直接就能进入处理状态。
3. 建一个故障时间线视图
哪怕一开始只是人工维护,也比没有强。
把“告警出现时间、变更发生时间、流量波动时间、业务恢复时间”串在一起,很多模糊问题会一下子清楚。后面再考虑用平台能力自动化这件事。
4. 复盘时别只盯技术根因,要盯信息流问题
很多复盘文档都喜欢写“根因是某依赖超时”或者“根因是配置错误”。这没错,但还不够。
真正该继续追问的是:为什么根因出现后,没有第一时间被识别?是告警设计问题,还是信息分发问题,还是现场协同问题?
这个问题想明白了,下一次故障处理速度才会真的提高。
写在最后
那次故障结束之后,我最大的感受不是“又处理完一个线上问题”,而是终于看清了一件事:很多团队缺的不是监控工具,也不是模型能力,而是把复杂现场变成清晰判断的能力。
AIOps 真正该做的,不是把告警发得更勤,也不是把术语包装得更高级。
它应该在最混乱的时候,帮一线同学更快抓住主线,更早逼近根因。
如果做不到这一点,再智能,也只是更复杂的“噪音制造器”。