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