凌晨2点系统崩溃不用慌:用 AI Agent 自动揪出生产环境故障根因
想象一下这个场景:凌晨 2 点,你的生产环境突然崩溃了。其实系统里所有的请求记录、数据库调用、超时和重试信息,都安安静静地躺在你的监控和日志平台里。但问题是,你要看懂这些数据,需要熟练使用查询工具、在脑子里画出系统架构图,还要花上 40 分钟去排查——而半夜值班的人根本没有这个时间和精力。
为了解决这个痛点,在 SigNoz 黑客松上,开发者打造了一款名为 Why Did It Break(为什么它坏了)的 AI 调查助手。它建立在开源可观测性平台 SigNoz 之上。你只需要像问同事一样问它:“为什么结账页面这么卡?”这个 AI 助手就会自己去实时查询数据,像老练的工程师一样顺藤摸瓜,最后把根本原因、证据链接、修复建议以及它的确定程度一并交给你。而且,它给出的每一个结论,都会附带一个精确的追踪链接,让你点进去看个究竟。
核心原则:绝不造假
在写第一行代码前,作者定下了一个死规矩:绝不使用假数据。没有预设的演示数据,也没有写死的标准答案。如果 AI 助手无法从真实的监控数据中找到证据,它就必须回答“我不知道”并降低自己的置信度。
为了让测试足够真实,项目使用了一个名为 HotROD 的多服务打车调度应用。这个应用在持续的真实 HTTP 流量下运行,它的“慢”是真实的(一个 MySQL 查询在并发时耗时超过 1 秒),它的“报错”也是真实的(Redis 查找司机时偶尔会超时)。
它是如何工作的?
这个 AI 助手并没有被硬编码去按固定顺序查询。相反,它拥有 6 个“工具”,由 AI 模型自己决定每一步该用什么。通常,它会先看各个服务的整体统计,然后钻取最慢的追踪片段,拉取具体的链路来确认父子节点的耗时,收集到足够的信息后就会停止。
除了被动回答你的问题,它还能做到“主动出击”:当监控系统发出告警时,它会自动开始调查,并在你打开监控面板前,就把调查结果推送到事件面板中。
下面是它的核心工作流程图:
你的提问 SigNoz 告警 (webhook回调)
| |
v v
+-----------------------------------------------+
| RCA (根因分析) Agent |
| 循环执行,每一步自主选择以下工具: |
| get_service_stats 获取各服务p99延迟/错误率|
| compare_windows 对比当前与历史数据 |
| get_slow_spans 获取最慢的原始追踪片段 |
| get_error_spans 获取最近的失败记录 |
| search_spans 自由下钻搜索追踪数据 |
| get_logs 根据追踪ID获取错误日志 |
+-----------------------------------------------+
| 每次调用 = 实时请求 POST /api/v5/query_range
v
{ 根因, 证据[] -> 追踪链接, 修复建议, 置信度 }
界面上会打印出它调用工具的完整轨迹,让你清楚地看到它查了哪些数据。这种“展示思考过程”的机制,正是建立信任的关键。
开发过程中踩过的坑(新手避坑指南)
在开发这个 AI 助手的过程中,作者遇到了几个非常典型的坑,非常值得刚接触 AI Agent 和后端开发的朋友学习:
- AI 助手“暴走”狂刷 API:早期测试时,由于监控后端连不上,AI 助手为了执行“适应工具失败”的提示词,连续调用了 50 次 API,白白烧掉了真实的 API 额度。
- 解决办法:设置了严格的请求预算、连续两次相同失败后的停止规则,以及一个不花钱的预检健康检查。
- 空日志导致无限重试:当查询日志返回空结果时,AI 助手会不断扩大时间窗口重试,甚至查到了 10 万分钟前的数据。
- 解决办法:在工具层面直接拦截,让工具返回“该系统不产生日志,请勿再次调用”,而不是单纯靠提示词去约束 AI。
- OTLP 端口配错导致数据丢失:测试应用通过 HTTP 协议将数据发送到 4317 端口,但 4317 其实是 gRPC 协议的默认端口,导致数据全部丢失。
- 经验教训:4317 是 gRPC,4318 才是 HTTP。报错信息其实已经告诉你协议错了,看日志一定要仔细。
- API 额度耗尽:在黑客松截止日,付费 API 额度用光了。
- 解决办法:换成了一个免费的 550B 参数大模型。虽然它喜欢把追踪 ID 写在文本里而不是结构化数组里,但作者写了一个后处理脚本,自动把文本里的 ID 提取出来变成可点击的证据卡片。
总结
现在,整个系统已经完全在云端运行。当你问它“为什么打车调度这么慢?”时,它能通过几次自主查询准确回答:调度请求慢是因为客户服务背后的 MySQL 查询太慢,加上 Redis 查找司机报错导致了重试。每一个结论都有真实的追踪链接供你核实。
数据一直都在那里,现在,你只需要开口问它就行了。
