Calcifer Calcifer 2 Calcifer 3 Calcifer 4
Teg

多智能体 V2 全功能详解:从告警分析到全栈智能体平台

2026/06/20 00:59 6 次阅读 王梓
打赏
✸ ✸ ✸

多智能体 V2 全功能详解

从告警分析到全栈智能体平台

Deep Agents 架构 · 八大专家协作 · 四种入口 · Backstage 集成

本文是一篇全景式的技术详解,完整覆盖多智能体 V2 的 16+ 个功能模块。如果你只把它当作"告警分析工具",那你会错过它 90% 的价值。文章较长,建议先收藏,按需查阅。每个模块都包含:能力描述、适用场景、关键设计点,并配以 SVG 架构图。

🛠 SRE 工程师平台工程师AI Infra 关注者 都能从中找到价值。

💡 读完你将了解:如何用一套系统,把告警根因分析、工单管理、CI/CD 排障、集群诊断、容量预测全部自动化。


多智能体 V2 八大专家智能体 · 协同作战 Deep Agent 协调中枢 LogAgent 日志 MetricsAgent 指标 KubernetesAgent OpenSearchAgent TraceAgent 链路 AtlassianAgent 工单 GitLabAgent CI/CD MySqlAgent 数据库 从单兵作战到协同作战 · 从规则匹配到深度推理

多智能体 V2:一个会"查、会想、会写"的 SRE 团队成员

企业微信一条告警打破了平静:
📱 "【告警】某服务 5xx 错误率激增,已持续 3 分钟。"

如果是 V1 时代,你需要:
🔍 打开 Grafana 看指标 → 切到日志平台翻报错 → 去链路系统追 trace → 登录集群查 Pod → 翻 Jira 看有没有相关工单 → 去代码仓库查最近改动 → 写一份分析报告。
⏱ 这一圈下来,30 分钟起步,而且全靠经验。

V2 时代,你只需把告警丢给多智能体:
🤖 它会自动拉日志、追链路、查集群状态、定位代码行、搜索历史工单、匹配根因模式,最后给你一份结构化的 RCA 报告,并建议是否需要创建工单
⏱ 全程 1-3 分钟,结果可回放、可审计。

本文要讲的,就是这个 V2 系统的每一个零件。

🎯 一、系统概述:从多智能体到深度智能体

V2 不只是"多了几个 Agent",而是把协调方式从"路由转发"升级为"深度推理"

1.1 V1 到 V2 的进化

本系统的 V1 采用经典的 Supervisor 多智能体模式:一个 Supervisor 负责接收用户请求,根据意图把任务"路由"给对应的专家 Agent(TraceAgent、MetricsAgent 等),再把结果汇总返回。

这个模式在"单一领域问题"上表现良好,但面临三类痛点:

  • 🧩 跨领域联动弱:一次根因分析往往需要"链路 + 指标 + 日志 + 集群事件"四路并查,Supervisor 很难在一次调度里把多个专家串联起来做深度推理。
  • 🔁 多轮工具调用不可控:复杂任务需要反复调用工具、对比结果、修正假设,V1 的单轮路由无法支撑这种"边查边想"的循环。
  • 📝 缺乏持久化中间状态:V1 的中间结论散落在各 Agent 内部,无法被后续步骤稳定复用,也无法跨会话回放。

V2 引入 Deep Agents 框架,把协调中枢从"转发路由器"升级为"会写笔记、会做计划的深度推理中枢"。核心变化有三:

  • 计划与笔记:Deep Agent 在执行过程中会把假设、中间结论、待办事项写入"虚拟文件系统",后续步骤可以读取,形成可累积的推理链
  • 工具循环:协调中枢可以在一轮对话内多次调用专家工具,根据返回结果调整下一步,直到收集到足够证据再下结论。
  • 技能注入:通过 SkillsMiddleware 按需加载领域知识,让协调中枢在"不懂"某个场景时能临时"学会"。

1.2 八大专家协作架构

V2 的能力由八个专家 Agent 提供,每个专家都有独立的工具集、系统提示和技能挂载。协调中枢(Deep Agent)根据问题类型决定调用哪些专家、以什么顺序调用。

V2 八大专家协作架构 用户 Deep Agent 协调中枢 计划 · 笔记 · 工具循环 · 技能注入 LogAgent 日志 告警分析核心入口 MetricsAgent 指标 Prometheus 监控 KubernetesAgent 集群诊断 OpenSearchAgent 索引与容量预测 TraceAgent 链路 分布式链路分析 AtlassianAgent 工单 Jira / Confluence GitLabAgent CI/CD 研发全链路工具 MySqlAgent 数据库 表结构 / 慢查询 数据层:OpenSearch(日志/链路)· Prometheus · Kubernetes API · MySQL · Jira/Confluence · GitLab 核心入口 链路/指标 基础设施 工单协作 代码/CI 数据存储

1.3 关键设计点

  • 专家即工具:每个专家 Agent 被包装成一个 StructuredTool,协调中枢像调用普通函数一样调用专家,专家内部再调用各自的工具集。这种"工具嵌套工具"的设计让架构可组合、可扩展。
  • 结果截断保护:专家返回结果最长 8000 字符,超过则按换行/句号智能截断,避免协调中枢上下文爆炸。
  • 回调传播:通过 callback_context 在专家和工具之间传播 Langfuse 回调,实现全链路追踪。
  • 技能按需挂载:协调中枢通过 SkillsMiddleware 在运行时加载技能目录下的知识文件,不占用常驻上下文。

🚨 二、告警分析(RCA 流水线)

V2 把告警分析拆成"两批流水线",先查事实再追代码,兼顾速度与深度

2.1 为什么需要"两批"流水线

告警根因分析(RCA)的核心矛盾是:速度与深度的取舍。只查日志很快,但可能找不到根因;同时追日志、链路、代码、工单,虽然全面,但耗时长且容易让模型在大量信息中"走神"。

V2 的解法是把 RCA 拆成两批,按"证据充分度"递进:

告警 RCA 两批流水线 告警输入(解析服务/接口/时间) Batch 1:日志先行(快速取证) ① search_logs_by_service 按服务+时间查 ERROR ② 错误聚合(按前150字符分组计数) ③ 若有 traceId → search_logs_by_trace 追全链路 ④ 异常类型识别(超时/空指针/连接拒绝…) ⑤ 业务堆栈提取(过滤框架包,留业务包) 交付:事实摘要 + traceId + 异常定位 Batch 2:代码追溯(深度归因) ① 基于 Batch1 的异常类名/堆栈定位代码仓库 ② gitlab_code_search 精确搜索可疑代码段 ③ 拉取最近 Merge Request,判断是否近期变更引入 ④ KubernetesAgent 查 Pod 事件/资源压力 ⑤ MetricsAgent 确认指标异常是否吻合 交付:根因结论 + 证据链 + 处置建议

2.2 能力描述

Batch 1(日志先行)聚焦"发生了什么":

  • 按服务名 + 时间窗口查询 ERROR 日志,对相似错误做聚合统计,避免被重复日志淹没。
  • 从日志中提取 traceId,若存在则追查完整调用链,定位异常发生在哪个服务、哪个接口。
  • 识别常见异常类型(连接超时、空指针、连接拒绝、数据库异常等),并提取业务代码堆栈,过滤掉框架噪声。

Batch 2(代码追溯)聚焦"为什么发生":

  • 用 Batch 1 的异常类名和堆栈信息,在代码仓库中精确搜索可疑代码段。
  • 拉取该服务最近的 Merge Request,判断问题是否由近期代码变更引入。
  • 并行调用 KubernetesAgent 查 Pod 事件(CrashLoopBackOff/OOMKilled)、MetricsAgent 确认指标异常是否与日志时间吻合。
  • 综合所有证据,给出根因结论、证据链和处置建议。

2.3 TraceAgent 的调用决策规则

TraceAgent 在流水线中扮演关键角色,但它并非每次都调用——V2 为它设计了一套确定性决策规则,而非让 LLM 自行判断:

  • 有 traceId:直接调用 search_logs_by_trace,追全链路。
  • 无 traceId 但有 URL:调用 search_logs_by_keyword,用接口路径作为关键词检索。
  • 只有服务名:调用 search_logs_by_service,按时间窗口批量拉取后人工/规则提取 traceId。
  • 纯关键词线索(如订单号、手机号片段):调用 search_logs_by_keyword 精确命中。

这套规则确保 TraceAgent 不会"瞎调",也避免在缺乏 traceId 时空转。

2.4 交付优先级

两批流水线的输出遵循"先交付、后深化"的原则:

优先级交付物触发条件
P0(即时)告警概要 + 错误聚合 + traceIdBatch 1 完成
P1(随后)完整调用链 + 业务堆栈定位traceId 追查成功
P2(最终)根因结论 + 代码定位 + 处置建议Batch 2 完成

这种分批交付意味着:即使用户在 Batch 2 进行中就急于查看,也能先拿到 P0/P1 的中间结果,不会干等。

📋 三、Jira / Confluence 知识搜索与工单管理

让 Agent 既能"查历史",也能"开工单"——15 个工具 + 1 个事件复合工具

3.1 Jira 九大工具

AtlassianAgent 通过两种方式与 Atlassian 平台交互:Jira 走 ACLI(Atlassian CLI)子进程,Confluence 走 REST API。共提供 9 个 Jira 工具:

工具功能适用场景
jira_get_issue查看单个工单详情用户给出工单号时快速取详情
jira_search_issuesJQL 搜索工单按服务/状态/时间批量查
jira_create_issue创建工单根因分析后开修复单
jira_update_issue更新工单字段补充根因/影响范围
jira_comment_issue添加评论把分析报告追加到工单
jira_transition_issue状态流转把工单从"待处理"流转到"进行中"
jira_link_issues关联工单把告警工单和根因工单关联
jira_list_projects列出所有项目确认工单该建到哪个项目
jira_list_sprints列出 Sprint把工单归入当前迭代

3.2 Confluence 六大工具

工具功能适用场景
confluence_searchCQL 全文搜索搜"某服务部署文档"
confluence_get_page按 ID 获取页面已知页面 ID 时直接取正文
confluence_get_page_by_title按标题查找页面用户说"那个排障手册"
confluence_list_spaces列出所有空间确认知识归属团队
confluence_get_space_content浏览空间内容逛某个团队的知识库
confluence_create_page创建页面把 RCA 报告沉淀为文档

3.3 事件复合工具:一键创建事件工单

除了 15 个原子工具,V2 还封装了一个事件复合工具 jira_create_incident,把"建工单 + 加标签 + 写结构化评论"三步合一:

jira_create_incident 复合流程 1. 告警解析 服务/接口/严重度 2. 标签推荐 incident/服务名/环境 3. 工单格式化 标题+摘要+RCA 评论 交付:一个带标签、带结构化评论的完整事件工单 评论包含:现象 / 根因 / 影响范围 / 处置建议 / traceId

3.4 只读模式与写入模式

出于安全考虑,AtlassianAgent 支持只读模式写入模式两种运行态:

  • 只读模式(默认):仅启用查询/搜索/浏览类工具(jira_get_issue、jira_search_issues、confluence_search 等),所有创建/更新/流转工具被禁用。适合日常排障、查历史工单。
  • 写入模式:需显式开启,解锁 jira_create_issue、jira_update_issue、jira_transition_issue、jira_create_incident、confluence_create_page 等。适合"分析后自动建单"的闭环场景。

这种分级设计让 Agent 在"只查不写"的窗口期内即使误调用也不会产生副作用。

3.5 工具调用上限保护

与 GitLabAgent 类似,AtlassianAgent 也设置了单次 25 次工具调用上限_ATLASSIAN_TOOL_RUN_LIMIT = 25)。这个数字的考量:

  • 一次完整的事件工单创建(搜项目→搜工单→创建→加标签→写评论→关联)大约需要 6-10 次调用。
  • 批量搜索场景(如按服务查所有相关工单)可能需要 5-8 次调用。
  • 25 次既覆盖了"搜索 + 创建 + 关联"的复合场景,又防止 Agent 在反复搜索中失控。

同时 AtlassianAgent 的递归上限也要求 ≥ 25,启动时校验,避免配置矛盾。

3.6 告警解析 → 标签推荐 → 工单格式化

当告警触发自动建单时,V2 会做三件事:

  1. 告警解析:从告警文本提取服务名、接口、错误率、时间窗口。
  2. 标签推荐:根据服务名和严重度,自动推荐 incident、服务名、环境等标签,便于后续按标签过滤。
  3. 工单格式化:把 RCA 报告结构化为标题、摘要、影响范围、根因、处置建议、traceId 等字段,写入工单评论,让接手人一目了然。

🔧 四、GitLab CI/CD 排障与代码分析

从"发版失败"到"谁改坏了代码"——GitLabAgent 用 28 个自制工具 + 186 个官方 glob 工具覆盖研发全链路

4.1 工具全景

GitLabAgent 通过 HTTP 直连 GitLab API(无需 sidecar),提供 28 个自制工具 + 186 个官方 glob 工具(通过 glab mcp serve 动态加载),覆盖六大类操作:

💡 双层工具体系:
自制工具(28 个):基于 GitLab REST API 封装的 gitlab_* LangChain 工具,针对 SRE 排障场景深度定制——MR 分析、CI 失败启发式诊断、发版回溯、贡献者统计、代码搜索等
Glob 官方工具(~186 个):通过 glab mcp serve 动态加载的 GitLab CLI 原生 MCP 工具,覆盖 API 全部能力域(MR/CI/仓库/Issue/Runner/Release/集群等 30 个域);只读 PAT 模式下约 77 个可暴露,写入类约 109 个按需开启
类别工具能力
项目与代码搜索gitlab_search_projects按名称模糊搜索项目
gitlab_get_project获取项目详情
gitlab_list_namespaces列出命名空间
gitlab_code_search代码内容搜索(定位可疑代码段)
gitlab_lookup_user / gitlab_list_user_projects查用户与其项目
Merge Request 管理gitlab_list_merge_requests列出 MR(按状态/时间过滤)
gitlab_get_merge_requestMR 详情
gitlab_get_merge_request_diffsMR diff 对比
gitlab_merge_request_change_insight参与者分析与变更洞察
仓库文件操作gitlab_get_file_contents读取文件内容
gitlab_list_commits / gitlab_get_commit提交历史
gitlab_author_code_stats作者代码统计
gitlab_contributor_ranking(含 combined/snapshot 变体)贡献者排名
Issue 与 Pipelinegitlab_get_issue / gitlab_search_issuesIssue 查询
gitlab_get_pipeline / gitlab_list_pipelinesPipeline 查询
gitlab_list_pipeline_jobs / gitlab_list_project_jobsJob 列表
gitlab_get_job / gitlab_get_job_traceJob 详情与日志
gitlab_analyze_failed_job失败 Job 启发式分析
分支与发版gitlab_ops_release_fail_diagnosis发版失败一键诊断
gitlab_sweep_author_code作者代码扫描清理

4.2 CI 启发式分析:自动识别失败原因

CI 失败日志动辄上万行,让人眼花。V2 内置一套启发式分析引擎,对 CI 日志做智能打标和关键行提取:

识别的失败类别(标签)

  • npm / yarn_pnpm:前端依赖/构建错误
  • jvm_build:Maven/Gradle 构建失败
  • test_runner:pytest/JUnit/Jest 测试失败
  • static_analysis:Checkstyle/SpotBugs/PMD 静态检查违规
  • container:Docker 镜像构建/拉取失败
  • k8s_deploy:Helm/Kubectl 部署失败
  • permission:权限拒绝(如镜像仓库 403)
  • resource:OOM/Killed/资源不足
  • network:连接拒绝/超时/TLS 握手失败

引擎会用正则匹配 error/exception/failed/fatal 等关键词,并优先提取 Java 堆栈中的 文件名:行号,帮助快速跳转到出错代码。

4.3 发版失败一键诊断

gitlab_ops_release_fail_diagnosis 是一个"大杀器"级工具:用户只需提供发版通知(包含项目、分支、时间),它会自动:

  1. 解析发版通知,提取项目、分支、阻塞阶段。
  2. 定位对应的 Pipeline 和失败的 Job。
  3. 拉取 Job 日志,跑启发式分析,输出失败类别和关键行。
  4. 若失败涉及代码,搜索最近的 Merge Request,判断是否由变更引入。
  5. 综合输出:失败原因 + 关键日志行 + 关联 MR + 处置建议。

4.4 工具调用上限保护

GitLabAgent 设置了 单次 36 次工具调用上限_GITLAB_TOOL_RUN_LIMIT = 36)。这个数字的由来:

  • 一次完整的发版诊断大约需要 10-15 次调用(查项目→查 pipeline→查 job→拉日志→查 MR→查 diff)。
  • 贡献者排名类操作可能需要遍历多个仓库,每次 5-8 次调用。
  • 36 次既覆盖了复杂场景,又防止 Agent 在"无限翻页"或"循环搜索"中失控。

配置中还要求 thread 级上限 ≥ 36,启动时会校验,避免配置矛盾。

🕸️ 五、业务依赖与架构梳理

告警来了,先搞清楚"它是谁、它依赖谁、谁依赖它"

5.1 能力描述

一次根因分析能否准确,很大程度上取决于你是否清楚"故障服务在架构中的位置"。V2 提供一套业务依赖梳理能力:

  • 服务依赖盘点:分析服务代码中的 Feign/RestTemplate/WebClient 配置,自动识别它的下游依赖。
  • 服务拓扑映射:基于依赖盘点结果,构建服务间调用拓扑图,可视化"谁调谁"。
  • 服务状态检查:对拓扑中的每个服务,快速检查其健康状态(Pod 是否就绪、接口是否可达)。
  • 架构知识库:维护团队归属、namespace 映射、服务负责人等元信息,让 Agent 知道"这个服务归谁管"。
  • 告警归因:把告警标题精确映射到服务名——告警里写的可能是缩写或别名,需要归一到标准服务名才能继续查。

5.2 适用场景

  • 告警归因:告警标题"gateway 超时" → 归一为标准服务名 → 才能查日志和链路。
  • 影响面评估:服务 A 故障 → 盘点谁依赖 A → 判断影响哪些上层业务。
  • 排障导航:拿到告警后,先看拓扑定位故障服务在调用链中的位置,再决定查上游还是下游。
  • 新人 onboarding:新成员问"某服务是干什么的",Agent 可以基于架构知识库回答。

5.3 关键设计点

告警归因与拓扑构建流程 告警标题 可能含缩写/别名 告警归因 映射到标准服务名 依赖盘点 Feign/RestTemplate 拓扑图 上下游可视 架构知识库 团队归属 · namespace 映射 · 服务负责人 · 告警别名表 归因、拓扑、状态检查都依赖这套元信息
  • 归因优先:任何告警分析的第一步都是归因,映射失败则后续查询全部落空,所以归因表需要持续维护。
  • 静态分析为主:依赖盘点基于代码配置静态分析,不依赖运行时流量,避免在故障期间加重系统负担。
  • 知识库可人工补录:自动盘点可能漏掉动态调用,知识库支持人工补录"隐藏依赖"。

☸️ 六、Kubernetes 集群诊断

从"Pod 挂了"到"为什么挂"——KubernetesAgent + 原生 kubectl 双层诊断

6.1 集群清单:一眼看全

KubernetesAgent 提供集群资源的完整清单查询,覆盖五个维度:

维度查询能力典型用途
namespace列出所有命名空间确认服务归属
workloadDeployment/StatefulSet/DaemonSet查副本数、镜像版本
podPod 列表与详情查重启次数、状态
node节点资源概况查节点是否压力
serviceService/Endpoint查流量是否就绪

6.2 事件与健康分析

集群事件是诊断的金矿。KubernetesAgent 自动解析 K8s 事件,识别常见故障模式:

  • CrashLoopBackOff:容器反复崩溃重启,通常是启动失败(配置错误/依赖缺失)。
  • OOMKilled:内存超 limit 被杀,需要调大 limit 或排查内存泄漏。
  • 探针失败:liveness/readiness 失败,可能是启动慢或依赖不可达。
  • 调度问题:Pending 状态,可能是资源不足或节点亲和性/污点导致无法调度。
  • 镜像拉取失败:ImagePullBackOff,镜像名错误或仓库权限问题。

6.3 资源诊断

除了事件,KubernetesAgent 还做资源层面的深度诊断:

  • CPU/内存/磁盘压力:查节点资源使用率,判断是否过载。
  • Top 消费者:列出资源占用 Top N 的 Pod,快速定位"谁在抢资源"。
  • request/limit 不匹配:检测 request 远低于 limit 的配置,这类配置容易在突发流量下被 throttling。

6.4 安全检查

V2 还内置了安全巡检能力,检测高危配置:

  • 特权 Podprivileged: true 的容器,拥有宿主机级权限。
  • hostPath 挂载:直接挂载宿主机目录,可能突破隔离。
  • 危险能力:如 SYS_ADMINNET_ADMIN 等 capability。

6.5 RCA 辅助与原生 kubectl 直连

KubernetesAgent 的真正价值在于联合分析:把 K8s 事件、Prometheus 指标、应用日志三者交叉印证。例如:

Pod 在 14:03 被 OOMKilled → MetricsAgent 确认该 Pod 内存曲线在 14:02 飙升 → LogAgent 查到 14:01 开始有"大查询"日志 → 三者吻合,根因是"大查询导致内存飙升触发 OOM"。

此外,V2 还提供原生 kubectl 工具(pods_list、pods_get、events_list、resources_get、resources_list、pods_log、pods_top),这些工具通过 subprocess 直接调用 kubectl CLI(不走 MCP),让 Agent 在需要时获得更底层的集群访问能力,灵活性更高。

🗄️ 七、数据库与性能分析

MySqlAgent + 慢查询关联 + HTTP 延迟分析

7.1 MySQL 表结构与索引分析

MySqlAgent 能连接 MySQL,提供:

  • 表结构查看:列出指定库表的字段、类型、注释。
  • 索引分析:查看表的索引情况,判断查询是否走索引。
  • 执行计划:对可疑 SQL 跑 EXPLAIN,看扫描行数、是否全表扫描。

7.2 慢查询关联定位

数据库慢查询往往和业务延迟强相关。V2 的做法是把链路中的 SQL 提取出来,与慢查询日志关联:

慢查询关联定位流程 链路中提取 SQL 从 span 数据提取 慢查询日志匹配 按 SQL 指纹关联 EXPLAIN 验证 扫描行数/索引命中 根因结论 缺索引/全表扫描 HTTP 延迟分析 P99 延迟分解:网关 → 服务 → DB → 下游调用 定位"慢在哪一段",而非笼统的"接口慢"

7.3 HTTP 延迟分析

接口慢不一定是 DB 慢。V2 的 HTTP 延迟分析把一次请求的耗时分段分解:网关耗时、服务处理耗时、DB 查询耗时、下游调用耗时。这样能精确定位"慢在哪一段",而不是笼统地说"接口慢"。

7.4 链路中 SQL 提取

TraceAgent 在追链路时,会把每个 span 中的 SQL 语句提取出来,传递给 MySqlAgent 做进一步分析。这种"链路 → SQL → EXPLAIN"的串联,是数据库性能问题的标准排查路径。

📊 八、OpenSearch 容量预测

不只是查日志——OpenSearchAgent 还能预测"磁盘什么时候满"

8.1 索引健康度分析

OpenSearchAgent 分析索引层面的健康度:

  • 索引大小与文档数:每个索引的存储占用和文档量。
  • ISM 策略:索引是否配置了生命周期管理,retention 是多少。
  • 日期后缀识别:自动识别按天滚动的索引(如 某索引-YYYYMMDD),只对这类索引做容量预测。

8.2 Top 统计

从 span 数据中统计 Top N:

  • Top 服务:产生 span 最多的服务。
  • Top 接口:调用最频繁的接口。
  • Top 属性:出现最多的 span 属性(如 error.type)。

8.3 存储概况与历史趋势

OpenSearchAgent 会汇总集群的存储概况,并基于历史数据绘制增长趋势:

容量预测示意(存储增长趋势) TB 时间 预测:45 天后达 80% 80% 警戒线 基于"按天滚动索引 + retention"模型,预测索引族与集群两级容量

8.4 容量预测:索引族级别 + 集群级别

V2 的容量预测分两级:

  • 索引族级别:对每个索引族(如 otel-span、app-log),基于历史每日增量预测未来增长,估算何时达到 retention 上限或磁盘警戒线。
  • 集群级别:汇总所有索引族,预测集群整体磁盘使用率,给出"预计 X 天后达到 80%"的结论。

这套预测依赖"按天滚动索引 + retention"前提,因此只纳入带日期后缀的索引,排除系统索引和别名索引。

🔄 九、发版前后对比

发版后出问题?先对比"发版前 30 分钟"和"发版后 30 分钟"

9.1 能力描述

compare_release_before_after 工具接受一个人工指定的发布时刻 T,自动对比 T 前后各 30 分钟(固定窗口)的关键指标:

数据源对比维度
OpenSearchERROR/WARN 条数、错误率、发版后新增的 ERROR 样例
Prometheus(内置 PromQL)Pod CPU/内存、OTEL 接口延迟 P99、请求量、5xx 速率
CloudWatch(可选)RDS 实例 CPU/内存/连接数、ElastiCache 集群指标

9.2 关键设计点

  • 固定 30 分钟窗口:不通过环境变量配置,避免随意调整导致对比口径不一致。
  • Pod 名正则容错:Pod 名一般是 {service}-{rs-hash}-{suffix},正则只转义真正的元字符,避免连字符被过度转义导致匹配失败。
  • exported_job 双写兼容:OTEL 的 exported_job 可能是"服务名"或"服务名-prod",正则同时匹配两种写法。
  • Prometheus 闸门:一旦 Prometheus 超时/连接失败,后续内置 PromQL 自动跳过,避免 N×条数×2 窗口的重复失败调用。

🎓 十、技能系统:30 个技能目录,按需加载

给 Agent 一本"随时翻阅的操作手册"

10.1 什么是技能

技能(Skill)是一段 Markdown 格式的领域知识,告诉 Agent"在什么场景下、该用什么工具、按什么步骤做"。与系统提示不同,技能不是常驻的,而是由 SkillsMiddleware 在运行时按需加载,避免上下文膨胀。

10.2 30 个技能目录分类

类别技能目录
告警与排障alarm-to-code-workflow、alarm-types、alarm-workflow、error-fragment-investigation、troubleshooting-patterns、investigation-toolkit
架构与依赖service-dependencies、service-topology、service-status-check、company-context、account-system
Kubernetesk8s-pod-resources、pod-health-analysis、hosts-resources
数据库与性能slow-query-analysis、http-latency-analysis
CI/CDci-cd-troubleshooting、deployment-rollout、merge-request-triage
工单与知识jira-triage、confluence-knowledge-base、incident-workflow、atlassian-tool-reference
GitLabglab-hybrid-tools、glab-mcp-tool-catalog、glab-mcp-tool-selection、author-contribution-workflows
容量与成本capacity-forecasting、aws-cost-calculator
工具参考tool-usage-reference

10.3 按需加载机制

技能加载有两种结构:

  • 新结构skills/skill-name/SKILL.md,每个技能一个目录,便于附带示例文件。
  • 旧结构skills/*.md,扁平文件,兼容历史。

SkillsMiddleware 扫描 skills/ 目录,把所有 SKILL.md 加载为虚拟文件,Deep Agent 在推理时按需读取。技能内容不会全部塞进系统提示,而是作为"可检索的知识库"存在。

10.4 各 Agent 的技能挂载

不同专家 Agent 挂载不同的技能子集,避免"日志专家被 Kubernetes 技能干扰":

  • TraceAgent / LogAgent:alarm-types、error-fragment-investigation、troubleshooting-patterns
  • KubernetesAgent:k8s-pod-resources、pod-health-analysis、hosts-resources
  • MySqlAgent:slow-query-analysis、http-latency-analysis
  • GitLabAgent:ci-cd-troubleshooting、merge-request-triage、author-contribution-workflows
  • AtlassianAgent:jira-triage、confluence-knowledge-base、incident-workflow

⚙️ 十一、服务端工程实践

生产级 Agent 的"看不见的功夫"

11.1 SSE 心跳防断连

Agent 推理可能耗时数十秒,期间如果没有数据流过,反向代理(如 Nginx)会因超时断开连接。V2 的解法是SSE 心跳

  • 30 秒HEARTBEAT_INTERVAL)若无事件产生,发送 : heartbeat\n\n 注释帧。
  • SSE 注释帧被所有客户端忽略,不影响业务数据。
  • 30 秒远低于代理的 2-3 分钟超时,确保连接不被掐断。
  • 心跳与真实事件通过 asyncio.wait 竞争,一旦有真实事件立即发送,不等心跳。

11.2 并发 Run 取消

用户在流式输出过程中刷新页面或重新提问,会产生新的 Run。如果不取消旧 Run,会导致:

  • 资源浪费:旧 Run 继续消耗 LLM tokens 和工具调用。
  • 状态污染:两个 Run 同时写同一 thread 的 checkpointer。

V2 维护 _active_runs 字典(thread_id → run 信息),新 Run 启动时检查同 thread 是否有活跃 Run,有则通过 cancel_event.set() 取消旧 Run,并清理 graph/checkpointer 资源。

11.3 消息后处理管道

模型输出有时会"啰嗦"——在给出完整报告后又追加一句"还有什么需要帮助的吗?"这类低价值续问。V2 的后处理管道做几件事:

  • 检测低价值续问:识别报告后的"还有问题吗"类填充消息并丢弃。
  • 清理残留标记:移除部分 ``` 代码块标记残留。
  • 提取用户可见文本pick_user_facing_assistant_text 从消息列表中挑出最终展示给用户的文本。
  • 多轮对话保护:只在最后一条 HumanMessage 之后做清理,不影响历史消息。

11.4 PostgreSQL 持久化

V2 用 PostgreSQL 做两层持久化:

  • Checkpointer:LangGraph 的状态检查点,支持断点续跑、时间旅行。
  • Session Store:会话管理(会话列表、标题、消息计数、预览),通过 /api/sessions 暴露。

两者在 lifespan 中初始化,应用关闭时按逆序清理(先 session store,再 checkpointer),确保资源释放有序。

服务端工程实践全景 SSE 心跳 30s 心跳帧 防代理超时 并发 Run 取消 同 thread 新 Run 取消旧 Run 消息后处理 去啰嗦/清残留 提取可见文本 PG 持久化 Checkpointer + Session Store 生命周期管理 lifespan 顺序初始化:FastMCP → PG Checkpointer → Session Store 关闭时逆序清理:Session Store → Checkpointer → FastMCP 取消的 Run 主动释放 graph/DB 连接池资源

🎫 十二、Backstage 集成:把 SRE Agent 嵌入开发者门户

让开发者在"自己的地盘"无缝使用 SRE 能力

12.1 为什么集成 Backstage

Backstage 是业界流行的开发者门户,团队用它统一管理服务目录、文档、CI/CD 入口。如果 SRE Agent 只能通过独立 Web UI 访问,开发者需要"跳出"日常工作流,体验割裂。

V2 的方案是把 SRE Agent 作为 Backstage 的一个插件嵌入,开发者在门户内即可调用告警分析、查工单、查链路等能力,无需切换系统。

12.2 集成方式:iframe 嵌入 + postMessage 身份传递

技术上,V2 的前端(Next.js + CopilotKit)被整体嵌入 Backstage 的一个 iframe 中。但嵌入带来一个关键问题:身份如何传递?Backstage 有自己的登录态,iframe 里的 SRE Agent 不知道当前是谁在用。

Backstage + SRE Agent 身份传递 Backstage(父页面) 侧边栏:多智能体入口 首页渐变色卡片入口 iframe 容器 SRE Agent(iframe) PostMessageListener 监听 收到 userId → localStorage → reload → 携带身份请求 postMessage 身份传递 1. Backstage 获取登录用户 userId 2. postMessage({type:'SET_USER_ID', userId}) 3. iframe 监听(capture phase)→ 存 localStorage 4. window.location.reload() 刷新 5. 后续请求携带 X-User-ID 头 6. 后端按 userId 隔离会话/数据

12.3 身份传递的重试机制

postMessage 是异步的,iframe 加载时机和父页面发送时机可能错开。V2 设计了多重试策略,确保身份一定能传到:

iframe 侧主动请求PostMessageListener):

  • 加载后 500ms 发送 REQUEST_USER_ID 给父页面
  • 1500ms 再次发送(重试)

父页面侧主动推送

  • 父页面在多个时机尝试发送 SET_USER_ID
  • 重试间隔:0ms / 100ms / 500ms / 1000ms / 2000ms,共 5 次

双重保险:iframe 主动要 + 父页面主动给,即使某一方时序异常,最终也能对上。收到 userId 后存入 localStorage,并 reload 让后续请求携带身份。若 userId 未变化则跳过 reload,避免无谓刷新。

12.4 侧边栏导航 + 首页卡片入口

在 Backstage 中,SRE Agent 有两个入口:

  • 侧边栏导航项:常驻左侧导航,点击进入 SRE Agent 全屏 iframe。
  • 首页渐变色卡片:在 Backstage 首页以一张醒目的渐变色卡片呈现,作为"快捷入口",降低发现成本。

12.5 CSP 配置

iframe 嵌入需要 Content Security Policy 放行。V2 要求在 Backstage 的 CSP 中配置 frame-src 允许 SRE Agent 的来源:

Content-Security-Policy: ... frame-src 'self' https://sre-agent.example.com; ...

若未配置,浏览器会拒绝加载 iframe,表现为页面空白。这是集成时最常见的"看不见的坑"。

12.6 用户体验:无缝使用

对开发者而言,体验是无缝的:

  • 登录 Backstage 后,点击多智能体卡片,直接进入对话界面,无需二次登录。
  • 所有查询自动携带当前用户身份,后端按用户隔离会话历史。
  • 会话持久化在 PostgreSQL,下次进入仍能看到历史对话。
  • 分析结果可以直接在 iframe 内查看,也可以通过 AtlassianAgent 一键创建工单。

开发者无需学习新系统,在"自己的门户"里就拥有了 SRE 级别的排障能力。

12.5 钉钉 & 企业微信:把 SRE Agent 嵌入日常办公

sre-agent-im-adapter 是一个轻量级 IM 适配层,让多智能体的能力直接接入企业内部即时通讯平台。运维人员无需打开任何 Web 页面,在钉钉群或企业微信中 @机器人 就能完成告警分析、根因排查、工单创建等操作。

📱 核心价值:
  • 零切换成本——SRE 告警本来就在群里发,@机器人 直接分析,不用再切系统
  • 多轮上下文——钉钉侧自动拼接被回复消息内容,支持连续追问("这个服务最近的变更是什么?")
  • 即时反馈——收到消息立即回复"正在处理",避免用户重复发送
  • Markdown 输出——Agent 返回的结构化结果以 Markdown 格式渲染,表格、列表、加粗都能正常显示

12.5.1 架构模式

IM 适配器消息流 📱 钉钉群聊 @机器人 发消息 💬 企业微信 私聊机器人发消息 sre-agent-im-adapter Python · 异步长连接 · 即时确认 SRE Copilot Agent 后端服务 Deep Agent 协调中枢 · 八大专家协作 Stream 长连接 HTTP POST
维度钉钉企业微信
连接方式dingtalk-stream SDK(长连接 Stream 协议)企业微信官方长连接(回调 URL 模式)
认证K8s Secret 注入 AppKey / AppSecretK8s Secret 注入 BotID / 密钥
回复格式reply_text() 即时确认 → reply_markdown() 最终结果reply_stream(finish=False) 中转 → reply_stream(finish=True) 终态
上下文支持✅ 自动提取被回复消息内容拼接⚠️ 当前仅传当前文本
消息去重✅ msgId 缓存(上限 1000 条)✅ msgid 检查
超时控制默认超时约 570 秒(流式窗口余量)

12.5.2 部署形态

K8s 中实际运行 多个 adapter 容器(共享 Pod 网络),通过集群内部域名访问后端服务:

  • dingtalk-adapter —— 钉钉机器人实例
  • wecom-adapter —— 企业微信机器人(主环境)
  • wecom-adapter-standby —— 企业微信机器人(备用环境)

凭证统一从 K8s Secret 注入为环境变量,CI/CD 通过 Pipeline 自动构建镜像、推送容器仓库、执行滚动发布。

🚪 十三、五种入口方式

CLI / Web UI / HTTP API / MCP Server / IM 机器人——总有一款适合你

四种入口方式 CLI 单次查询/交互模式 适合调试 python main.py "分析" 脚本集成 最快上手 Web UI Next.js + CopilotKit AG-UI 流式 会话持久化 Backstage 嵌入 最佳体验 HTTP API FastAPI 端点 /health /docs 会话管理 API 第三方集成 最易集成 MCP Server FastMCP streamable-http VSCode/Cursor Claude Code 最 AI 原生

13.1 MCP Server 的特殊之处

V2 通过 FastMCP 暴露一个 ask_sre_copilot 工具,让 VSCode、Cursor、Claude Code 等 MCP 客户端直接调用 SRE 能力。关键设计:

  • 无状态 HTTPstateless_http=True):每个 POST 独立,不依赖 MCP 层会话状态。多轮状态由后端 PostgreSQL 管理,不在 MCP 层暴露。
  • lifespan 合并:FastMCP 子应用的 lifespan 必须与主应用一起进入,否则首次请求会报 "task group is not initialized"。

13.2 IM 机器人:钉钉 & 企业微信(⭐ 生产高频入口)

对于运维团队来说,IM 机器人可能是最高频的使用方式——告警本来就在群里发,@机器人 就能分析,零切换成本。详见 十二章·五节:IM 适配器详解

快速上手:
  • 钉钉群 → @机器人 → 发送告警文本 → 等待 Markdown 结果返回
  • 企业微信 → 打开与机器人的对话 → 发送问题文本 → 等待结果返回
  • 支持多轮对话(钉钉自动拼接被回复消息内容)

🔭 十四、可观测性:Langfuse 全链路追踪

确定性可回放——每一次分析都能复盘

14.1 为什么 Agent 需要可观测性

Agent 系统的"黑盒"问题比传统服务更严重:一次分析可能调用十几个工具、经过多轮 LLM 推理,如果结果不对,你很难知道是"哪一步想错了"。Langfuse 提供全链路追踪,把每一步都记录下来。

14.2 追踪的内容

  • LLM 调用:每次模型调用的输入、输出、token 数、耗时。
  • 工具调用:每个工具的名称、参数、返回值、耗时。
  • 专家 Agent 调用:哪个专家被调用、传了什么参数、返回了什么。
  • 回调传播:通过 callback_context 在专家和工具间传播回调,确保追踪不断链。

14.3 确定性可回放

V2 的一个设计目标是"可回放":给定相同的输入和工具返回,分析过程应当可复现。为此:

  • 工具调用是确定性的(同样的参数同样的结果,因为是直查数据库/API)。
  • LLM 调用的输入/输出被 Langfuse 完整记录,可以回放。
  • PostgreSQL Checkpointer 保存每步状态,支持"时间旅行"到任意中间点。

这意味着:当一次分析结果存疑时,可以在 Langfuse 里回放整个推理链,定位"哪一步的 LLM 输出偏离了预期"。

🧭 十五、设计与演进

五大设计原则 · 五项优雅降级 · V1→V2→V3 路线

15.1 五大设计原则

原则含义
最小上下文工具返回聚合摘要而非原始数据,避免上下文爆炸
分层递进summary → samples → details,先给概览再按需深入
单一职责每个工具有且仅有一个明确目的
优雅降级外部依赖不可用时自动退化,而非整体崩溃
确定性优先能用规则确定的不用 LLM 决策(如 TraceAgent 调用规则)

15.2 五项优雅降级

  • OpenSearch 不可用:日志/链路工具返回错误提示,Agent 转而依赖 Kubernetes 事件和指标推理。
  • Prometheus MCP 超时:MetricsAgent 设置闸门,一次失败后跳过后续 PromQL,避免连锁超时。
  • MCP Server 未启动:MCP 相关工具标记不可用,Agent 用 Native Tools 替代。
  • PostgreSQL 不可用:Checkpointer 降级为内存模式,会话持久化暂停(重启后丢失)。
  • Langfuse 未配置:追踪静默关闭,不影响业务功能。

每一项降级都确保"核心功能仍可用",而非全盘失败。

15.3 V1 → V2 → V3 演进路线

演进路线 V1:多智能体 Supervisor 路由模式 单轮调度 专家间独立 痛点:跨领域联动弱 多轮工具不可控 无中间状态持久化 单领域问题 OK 复杂 RCA 力不从心 V2:深度智能体(当前) Deep Agents 框架 计划 + 笔记 + 工具循环 技能按需加载 两批 RCA 流水线 Backstage 集成 MCP Server 四入口 跨领域深度推理 生产可用 V3:规划中 向量检索知识库 告警收敛(同因合并) 自动知识更新 traceId 全链路追踪 Java 异常链提取 更智能 · 更自主 从辅助到自治

✅ 十六、总结

回到最初的问题:V2 到底带来了什么?

16.1 核心价值

  • 从单兵到团队:八个专家 Agent 协同,一次分析覆盖链路/指标/日志/集群/代码/工单全维度。
  • 从查到写:不只是查日志,还能创建工单、沉淀文档、关联事件,形成闭环。
  • 从割裂到无缝:Backstage 集成让开发者在门户内直接使用 SRE 能力,无需切换系统。
  • 从黑盒到可回放:Langfuse 全链路追踪 + PG 持久化,每次分析可复盘、可审计。
  • 从脆弱到韧性:五项优雅降级,外部依赖故障时核心功能仍可用。

16.2 V1 / V2 对比

维度V1 多智能体V2 深度智能体
协调方式Supervisor 路由Deep Agent 深度推理
工具调用单轮多轮循环 + 笔记累积
专家数量6 个8 个(+GitLab/Atlassian)
技能系统常驻系统提示30 个技能按需加载
RCA 流水线单批两批(日志先行 + 代码追溯)
入口CLI / WebCLI / Web / HTTP API / MCP
Backstageiframe + postMessage 集成
持久化内存PostgreSQL(Checkpointer + Session)
可观测性基础日志Langfuse 全链路 + 可回放
降级能力有限五项优雅降级

16.3 上线建议

  1. 先只读,后写入:初期只开启查询/搜索类工具,验证准确性后再解锁工单创建。
  2. 先 CLI,后 Web:内部先用 CLI 跑通 RCA 流水线,再开放 Web UI 给更大范围。
  3. 先单领域,后跨领域:先让单个专家(如 LogAgent)稳定运行,再启用 Deep Agent 的跨专家协同。
  4. 技能分批挂载:先挂核心排障技能(alarm-types、troubleshooting-patterns),再逐步加架构、CI/CD 类技能。
  5. 可观测性先行:上线前先配好 Langfuse,确保每次分析可回放、可审计。
  6. Backstage 集成最后做:在独立 Web UI 验证稳定后,再嵌入 Backstage,降低集成阶段的调试复杂度。

恭喜你看完了这篇长文!

💡 这篇文章覆盖了多智能体 V216+ 个功能模块,从架构到工程实践,从告警分析到 Backstage 集成、IM 机器人。

👍 如果对你有启发,别忘了 点赞 + 在看 + 转发 三连!

🔔 关注获取后续更新:V3 规划、向量知识库、告警收敛等进阶内容。

📂 收藏本文,下次遇到排障场景时翻出来对照,事半功倍。


✸ ✸ ✸

📜 版权声明

本文作者:王梓 | 原文链接:https://www.bthlt.com/note/369994461-Teg多智能体 V2 全功能详解:从告警分析到全栈智能体平台

出处:葫芦的运维日志 | 转载请注明出处并保留原文链接

📜 留言板

留言提交后需管理员审核通过才会显示