凌晨2点系统崩溃不用慌:用 AI Agent 自动揪出生产环境故障根因

👉 工具网址:https://whatnow.up.railway.app

想象一下这个场景:凌晨 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 查找司机报错导致了重试。每一个结论都有真实的追踪链接供你核实。

数据一直都在那里,现在,你只需要开口问它就行了。

直达网址:https://whatnow.up.railway.app

类似文章