1. 告警风暴把我逼成了“人肉路由器”
1.1 原始告警链路的真实痛点
我在运维一线待了不少年头,最早接触的“告警分析”基本是这么个状态:监控平台每秒钟扫一遍指标,超过阈值就哐哐往外发告警,然后告警通知群就开始刷屏。白天还好,到了夜里大促或者版本变更窗口,那个消息滚动速度快得吓人。值班的人根本来不及逐条看,只能靠经验在脑子里快速分类:哪些是核心链路、哪些是老问题、哪些大概率是抖动、哪些需要立刻叫醒研发。
这套模式听起来没什么问题,毕竟有经验的人确实能处理。但问题在于“有经验的人”不够用。一个稍大一点的团队,核心服务几十个,依赖的中间件、数据库、缓存、消息队列加起来上百个,一个故障往往带出一片告警。像经典的数据库连接池被打满,下游所有服务都会报超时,瞬间几十条到上百条告警涌进来。值班同学第一反应不是分析,而是先“止血”——把服务重启、回滚、扩容,先把用户侧的影响压下去,再去翻日志找根因。
这个过程里,绝大部分时间花在了重复劳动上:在多个监控页面之间来回切换,人肉把不同资源的告警串成一条因果链路。做得多了我就想,这活儿其实没那么玄乎,很多步骤是固定的。既然步骤固定,能不能让AI来跑?
1.2 三个反直觉的观察
在真正动手之前,我先观察了一段时间的告警数据,然后发现了三个反直觉的现象。
第一个现象:告警数量多,不等于故障多。很多告警是同一个根因引发的“连锁反应”,比如一台物理机宕机,上面虚拟机的所有监控项都会告警,再加上依赖这台机器的下游服务,一次性可以生成几十条告警。但真正的根因就一个。
第二个现象:大量告警是“已知问题”的重复上报。基础设施层常有这种情况,某个磁盘降级了,运维已经知道要等硬件厂商来换盘,但监控是持续触发的,每隔五分钟来一条,纯纯的噪音。
第三个现象:根因分析高度依赖“关联关系”。单纯看一条告警根本看不出问题,你需要知道这个服务依赖了哪个数据库、调用了哪个下游接口、最近有没有变更记录。这些信息分散在CMDB、监控平台、日志平台、发布系统里,人肉去查非常耗时。
这三个观察直接决定了后面这个告警分析Agent的设计方向:它不能只做“告警摘要”,也不能只做“根因猜测”,它需要具备串联信息、交叉验证、输出结论的能力。而且它越熟悉历史故障案例,分析质量就会越高——这一点正好用上了RAG(检索增强生成)那套思路。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 这个告警分析Agent,本质上是“会查资料的实习生”
2.1 定位:不是全自动排障,是分析外脑
做这个东西之前,我给自己定了一个边界:它不是一个“全自动排障机器人”,而是一个“会查资料、会整理线索、会给出初步判断的分析外脑”。
为什么这么定位?因为全自动排障的风险太高了。故障场景下,任何基于错误判断的自动操作都可能放大影响。比如它把正在处理的故障节点误判为“负载过高”然后触发重启,如果这个节点其实是正常节点,重启它反而造成二次故障。所以在第一阶段,我只要求它做到“分析”,把结论和建议动作列出来,由值班人决定要不要执行。这个定位很重要,直接影响后面工具权限的设计。
2.2 五大核心模块分别管什么
按照告警分析这件事的实际流程,我把Agent拆成了五个模块。这里我把每个模块的职责和关键实现思路列出来,给想动手的同学一个参考。
信息接入模块(感知层)。负责接收告警平台推过来的webhook事件,把不同来源的事件数据统一成结构化格式。不同告警源的字段差别很大,Prometheus Alertmanager的字段、Zabbix的字段、云厂商监控的字段,全都长不一样。这个模块要做的第一件事就是标准化字段,至少包含:告警名、严重级别、资源标识、时间戳、标签列表、原始描述。
状态管理模块(记忆层)。Agent需要记住“当前在处理哪个故障”、“已经查过哪些信息”、“候选根因有哪些”,不能每查一步都从头再来。这里我参考了Agent框架里的State模式,用一个事件对象保存整个分析过程的上下文。这个模块在复杂故障场景下尤其重要,因为一次分析往往要跨很多步。
工具调用模块(执行层)。查指标、查日志、查CMDB、查变更记录,都是一个个独立工具。Agent通过函数调用的方式按需使用它们。这是整个Agent最核心的部分,后面我会专门展开。
分析推理模块(大脑层)。大模型承担主要的推理任务,但我会在提示词里强制要求“先列证据,再下结论”。同时接入了知识库RAG,把历史故障复盘文档、告警处理手册、架构说明文档切成片段灌进向量库,分析时检索相关内容作为参考。
输出与反馈模块(表达层)。分析结论不能是一大段纯文本,那样下游没法处理。我要求模型按固定的JSON结构输出,包含:结论摘要、关键证据、可疑根因列表(带置信度)、建议动作、风险提示。推送渠道可以是企微、钉钉或者工单系统。
2.3 为什么是Agent而不是普通的大模型问答
可能有人会说:我把告警丢给ChatGPT问一句“这是什么原因”不就行了?我最初也这么试过,效果非常拉胯。
原因很简单:告警分析是一个多步骤、强依赖信息的任务。你问模型“这个告警怎么回事”,
