首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >基于全链路数据驱动大模型Agent故障根因分析思考与总结

基于全链路数据驱动大模型Agent故障根因分析思考与总结

作者头像
Wangzy
发布2026-06-22 19:09:45
发布2026-06-22 19:09:45
160
举报

前记:笔者所在的公司目前正在推进全链路可观测性项目,而全链路数据落地后的第一个核心应用场景就是故障根因分析。基于这个背景,笔者花了比较多的时间去了解全链路可观测的相关概念——Traces、Logs、Metrics 三类信号各自是什么、怎么关联、怎么融合,以及在这些数据基础之上,如何结合大模型来设计 RCA 智能体。这篇文章是这段调研过程的一个系统性整理。

01

全链路可观测性介绍

1、可观测性三支柱

在现代分布式系统中,可观测性(Observability)已成为保障系统可靠运行的核心能力。业界广泛认可的"可观测性三支柱"框架将系统运行时数据分为三类信号,各有分工但又彼此互补。

a、指标(Metrics)——回答"什么时候、哪里出了问题"

指标是随时间聚合的数值序列,例如 CPU 利用率、请求延迟 P99、错误率、队列深度、连接池使用率等。指标的核心价值在于全局视野和趋势感知:它能够以极低的存储和查询成本覆盖整个系统的健康状态,帮助运维人员快速感知"系统整体状态如何、什么时候开始异常"。

Google SRE 提出的"四大黄金信号"(Four Golden Signals)是指标监控的经典框架:

• 延迟(Latency):请求处理耗时,通常关注 P50、P95、P99 分位值。延迟升高往往是下游瓶颈或资源竞争的早期信号。

• 流量(Traffic):系统承受的请求量(如 QPS、每秒事务数)。流量的突增或骤降都值得关注——突增可能导致资源饱和,骤降可能意味着上游故障或路由异常。

• 错误率(Errors):请求失败的比例。错误率是最直接的异常信号,但需要区分客户端错误(4xx)和服务端错误(5xx),二者的根因通常完全不同。

• 饱和度(Saturation):系统资源的利用程度,如 CPU、内存、磁盘 IO、连接池占用率。饱和度接近上限时,系统性能通常会急剧下降。

在工程实践中,指标的采集通常通过 Prometheus 等系统以固定间隔 scrape 或通过 OpenTelemetry SDK 以 OTLP 协议主动推送。指标的一大优势是支持告警规则——通过对黄金信号设置阈值或基于 SLO(服务等级目标)定义告警,可以实现对异常的第一时间发现。例如,当某服务的错误率超过 SLO 阈值(如从 0.1% 跳到 5%),或延迟 P99 从 50ms 飙到 2 秒时,告警系统会自动触发事件,拉开整个根因分析流程的序幕。

但指标的局限性也很明显:它只能告诉你"哪里出了问题",却无法回答"请求在系统中具体经过了哪些服务"以及"具体是哪一行代码、哪一条 SQL 导致了问题"。

b、链路追踪(Traces)——回答"问题出在调用链的哪个环节"

链路追踪串联的是一次请求在分布式系统中经过的完整路径——从网关到微服务 A,再到缓存、数据库、消息队列,直到最终返回给用户。每一次请求生成一个 Trace,其中每个参与处理的服务或函数产生一个 Span。Span 之间通过 ParentSpanID 建立父子关系,最终形成一棵调用树。

每个 Span 携带的信息包括:起止时间戳、服务名、操作名、状态码,以及自定义的 Tags(键值对,如 http.status_code=500、db.type=mysql)和 Logs(带时间戳的事件,如异常堆栈)。

链路追踪的核心价值在于因果路径还原。与指标不同,Trace 不是聚合统计,而是对单次请求完整生命周期的精确记录。它能回答的问题包括:这次请求慢在哪里?是哪个下游调用超时了?是串行瓶颈还是并行等待?是否存在重试风暴或级联失败?

在可视化层面,链路数据通常以瀑布图(Waterfall)呈现——横轴是时间,每个 Span 是一个水平条,缩进代表父子层级。通过色块的长度和状态码的颜色,可以一目了然地定位出哪一环出现了耗时异常或错误。

链路追踪的局限在于:它能精确定位"请求在哪个环节变慢或出错",但如果问题不在某次具体请求的路径上(比如是后台 GC 导致的间歇性抖动),或者需要理解具体的失败机理(比如连接池耗尽的详细原因),Trace 本身的信息就不够了。

c、日志(Logs)——回答"到底发生了什么、为什么发生"

日志记录的是离散事件——某个时刻某个组件发生了什么。一条日志可以是一行错误堆栈、一次配置变更记录、一条 SQL 慢查询详情、一次连接池超时的异常信息。日志的价值在于细节和上下文,它是最终定性根因的关键证据。

与指标的数值聚合和链路的路径结构不同,日志天然是非结构化或半结构化的文本数据。这使得日志的信息量最大,但同时处理成本也最高——日志量通常远大于指标和链路,不可能逐条查看,必须依赖结构化处理、模式聚类和精确过滤。

在根因分析中,日志扮演的角色是"解释性证据的提供者"。当指标告诉你"错误率升高了"、链路告诉你"请求卡在数据库调用上"之后,还需要日志来回答最终的"为什么"——是 OOM 异常?是连接池耗尽?是某条 SQL 触发了全表扫描?还是上游推送了一个错误的配置参数?

d、三者的协同关系

三类信号各有擅长但不可替代。它们的协同逻辑可以概括为一个递进的诊断链条:

指标发现(What/Where)→ 链路定位(Where/Time)→ 日志确认(Why)

孤立的链路数据只能说明"发生了什么",而不能回答"为什么发生"。孤立的指标只能说明"哪里异常了",却不知道异常的传播路径。孤立的日志虽然包含最丰富的细节,但在数十个服务同时报警时,面对海量日志无从下手。只有三者结合,才能形成从"发现异常"到"定位路径"再到"确认根因"的完整闭环。

这一协同的技术基础是统一关联标识。通过在日志中注入 traceid 和 spanid,在指标中携带 exemplar(指向 trace ID 的引用),以及通过 OpenTelemetry 的资源属性(Resource Attributes)为所有遥测数据打上 service.name、k8s.pod.name 等统一标签,三类信号就可以在同一个事故场景中被自动关联和互相跳转。

2、三支柱协同诊断实战:一个电商订单系统的故障案例

为了具体理解三支柱如何在实际故障诊断中协同工作,下面用一个典型的电商系统故障场景来完整演示从发现到定位再到确认根因的全过程。

a、场景描述

某电商平台的核心交易链路包含以下服务:

某天上午 10:02,值班 SRE 收到告警:order-service 的错误率从 0.1% 跳升至 12%,P99 延迟从 200ms 飙升至 4.5 秒。

b、第一步:指标发现异常(Metrics → Detect)

SRE 首先打开 Grafana 指标看板,查看四大黄金信号:

• 错误率:order-service 错误率 12%(正常 <0.5%),API Gateway 错误率 8%(被动升高),inventory-service 错误率 18%(最高)。payment-service 正常。

• 延迟:order-service P99 = 4.5s(正常 200ms),inventory-service P99 = 3.2s(正常 40ms)。

• 流量:各服务 QPS 与往日同期持平,没有流量突增。

• 饱和度:inventory-service 所在 Pod 的数据库连接池使用率 98%(正常 30%)。

通过 servicegraph 派生的依赖边指标,SRE 进一步发现:order-service → inventory-service 这条边的错误率骤增,而 order-service → payment-service 这条边完全正常。

此时的判断:问题不在流量突增,也不在支付链路。异常集中在 inventory-service 及其下游,数据库连接池使用率接近上限是一个重要信号。但"连接池使用率高"到底是原因还是结果?指标无法回答这个问题。

同时,SRE 注意到指标时间线上有一个标注:10:00,inventory-service 发布了 v3.4.2 版本。这是一个重要的变更信号,但仅凭时间巧合不能断定因果关系。

c、第二步:链路定位瓶颈(Traces → Locate)

SRE 点击 Grafana 指标图表上 10:05 时刻的一个 exemplar 星标点,直接跳转到该时刻的一条异常 Trace。

在 Jaeger 的瀑布图中,这条 Trace 的结构如下:

关键发现:

• 整条请求 4.2 秒的耗时,几乎全部消耗在 inventory-service → mysql.query 这个 Span 上(3.5 秒)。

• 该 Span 状态为 ERROR,Tag 中标注了 db.error=connection pool timeout。

• payment-service 根本没有被调用——因为 inventory-service 已经返回错误,order-service 直接中断了后续流程。

SRE 又对比了 10:00 之前的正常 Trace:同样的 mysql.query Span 在正常时只需 8ms,且没有任何错误标记。

此时的判断:瀑布图清晰地展示了故障传播路径——inventory-service 的数据库查询超时,导致 order-service 等待超时,进而导致 API Gateway 返回错误给用户。问题的"地点"和"传播链"已经明确,但"为什么数据库查询会超时"还需要进一步确认。

d、第三步:日志确认根因(Logs → Confirm)

SRE 从异常 Trace 中复制了 traceid 和 inventory-service 对应的 spanid,跳转到日志系统(如 Kibana),按 traceid=xxx AND service.name=inventory-service 过滤,精确拉出该次请求相关的日志:

进一步搜索 10:00 之后 inventory-service 的全量日志模式聚类,发现:

日志清晰地揭示了故障链条:

1 v3.4.2 版本发布后,某条库存查询 SQL 的执行时间从正常的 8ms 恶化到数秒甚至数十秒(可能是新版本引入了一个缺少索引的查询条件,或者改变了 SQL 拼接逻辑导致全表扫描)。

2 慢 SQL 长时间占用数据库连接不释放,导致 HikariCP 连接池中的 50 个连接全部被慢查询占满。

3 后续请求在等待连接时超时(30 秒),inventory-service 开始大规模返回错误。

4 order-service 收到 inventory-service 的超时/错误响应后,整个订单创建失败。

5 API Gateway 向用户返回 500 错误。

e、三支柱协同的完整闭环

回顾整个诊断过程:

最终结论和处置动作:

• 根因:inventory-service v3.4.2 发布后引入了一条缺少索引的慢 SQL,导致数据库连接池耗尽。

• 立即动作:回滚 inventory-service 至 v3.4.1。

• 后续修复:检查新版本 SQL 变更,添加缺失索引,修复连接泄漏风险。

如果只有指标,SRE 只能看到"inventory-service 错误率高、连接池满",但不知道是哪条请求路径、哪个具体操作导致的。如果只有链路,能看到 mysql.query 超时,但不知道是慢 SQL 还是网络问题还是 DB 实例本身的瓶颈。如果只有日志,面对几十个服务同时产生的海量日志,连从哪里开始看都不知道。三者结合,才能在分钟级时间内完成从"全局异常发现"到"精确根因定位"的全过程。

02

全链路多维数据的处理与融合

第一部分介绍了三支柱的理论和关联机制的概念。本部分聚焦于:日志与链路、指标与链路之间的关联在逻辑上如何成立,业界有哪些不同的实现思路,以及完整的数据处理流水线应如何设计。

本部分讨论的关联逻辑是技术栈无关的——无论使用 OpenTelemetry、SkyWalking、DeepFlow 还是商用 APM,面临的核心问题和解法思路是相通的。在介绍通用模式之后,我们会引用不同系统的做法加以对照。

1、日志与链路的关联

在没有关联的情况下,链路系统和日志系统是两个孤岛。SRE 在瀑布图中看到某个 Span 报错后,需要手动切换到日志系统,输入服务名和大致时间范围搜索——但一个服务在几分钟异常窗口内可能产生数十万条日志,从中找到与这一次特定请求相关的那几条几乎不可能。

日志-链路关联要解决的核心问题是:让每一条日志"知道"自己属于哪次请求(trace_id)、哪个操作(span_id),从而支持从链路精确定位到日志。

a、通用模式:在日志中注入请求上下文标识

这一做法在分布式追踪出现的早期就已形成,与具体追踪系统无关。核心逻辑是:将当前请求的 trace_idspan_id 作为结构化字段写入每一条日志。

它只依赖两个基本条件:追踪系统在请求上下文中维护了 trace_id/span_id(几乎所有追踪系统都这样做),日志框架支持从请求上下文提取字段(几乎所有主流日志框架都支持)。

这一模式在不同技术栈中的实现方式各异,但底层逻辑完全一致:

• Zipkin 时代:Spring Sleuth + Logback 自动将 B3 trace_id 注入 MDC,每条日志携带 trace_id 字段

• SkyWalking:Java Agent 通过字节码增强自动在日志框架中注入 TID(trace_id

• Jaeger:应用从 Span 上下文中提取 trace_id 写入日志(如 Uber 内部在 Go 的 zap 日志中注入 Jaeger trace_id

• 商用 APM:New Relic 的"logs in context"自动装饰 trace.id/span.id;Datadog 同样通过日志字段注入实现关联

• OpenTelemetry:日志规范明确要求 LogRecord 携带 TraceId 与 SpanId,统一了字段名和注入方式

注入完成后,在日志系统中按 trace_id 过滤,即可瞬间拉出一次请求在所有服务中产生的全部日志。OTel 的价值不在于发明这一模式,而在于将其标准化,降低了多技术栈并存环境下的集成成本。

b、另一种思路:基于统一标签的自动关联

上述模式的前提是"应用侧主动注入 trace_id 到日志中"。

云杉网络的 DeepFlow 提供了一种不同的思路:不要求应用修改日志格式,而是通过统一标签体系在存储和查询层面实现关联。

DeepFlow 的 AutoTagging 机制自动从云平台 API 和 K8s apiserver 同步资源信息,为所有观测信号——无论是 eBPF 采集的 Span、Prometheus 采集的指标、还是应用产出的日志——统一注入标准化的标签(云资源属性、K8s 资源属性、自定义 Label 等)。由于所有信号都携带了相同的标签体系,用户在查询时可以用相同的标签(如 Pod 名、服务名、命名空间)跨信号类型过滤和关联,不需要依赖 trace_id 作为唯一纽带。

这种方式的优势在于对遗留系统特别友好——不需要改动应用代码就能实现跨信号关联。局限在于,标签关联的粒度是资源级(Pod、Service)而非请求级(trace_id),在需要精确到单次请求的场景下,仍然需要配合 trace_id 注入。

c、对于无法修改代码的场景:采集侧富化

对于无法修改应用代码的遗留系统,还可以在采集侧做日志富化(enrichment)——在日志被采集和转发的过程中,由采集器将 trace_id 补写到日志中。 • eBPF 方式:OTel 的 OBI 工具在内核层面捕获 trace context 并写回原日志流

• 服务网格方式:Envoy/Istio 的 access log 天然携带 trace_id • DeepFlow 方式:通过 eBPF 捕获的网络请求与应用日志通过时间戳、进程 ID 等维度做关联,在平台层面实现对应

采集侧富化的局限在于:它只能关联到采集器能"看到"的请求上下文,对应用内部细粒度操作的覆盖不如应用侧注入。

2、指标与链路的关联

在传统监控体系中,指标和链路往往是两套独立的数据流。这导致两个问题:指标和链路可能不一致(各自采集口径不同);两者之间没有跳转路径(发现指标异常后无法快速找到对应的 Trace)。

业界围绕这两个问题形成了三种通用关联模式。

a、模式一:从链路派生 RED 指标

核心思想是:直接从链路数据中聚合生成 RED 指标(请求率/错误率/延迟分布),而不是让指标和链路各自独立采集。因为每个 Span 天然携带服务名、操作名、状态码和耗时,对 Span 做聚合就能自动得到 RED 指标,天然与链路一致。

不同系统的实现方式:

• SkyWalking:OAP 后端从 Span 数据自动聚合生成服务级、端点级 RED 指标,指标和链路从一开始就不是"两份数据"

• DeepFlow:基于 eBPF 零侵扰采集每一次应用调用(AutoMetrics),自动生成全栈黄金指标(延迟、吞吐、错误),精细到每一次调用。由于指标直接从 eBPF 捕获的请求数据中计算,天然覆盖全量流量且与链路一致

• Datadog APM:APM Metrics 总是基于全部 traces 计算,不受采样控制影响

• OpenTelemetry:通过 Collector 中的 spanmetrics connector,从 Span 按 {service.name, span.name, status_code} 聚合生成 RED 指标

不同实现的共性是:都从请求/Span 数据出发聚合生成指标。差异在于聚合发生的位置(APM 后端、Collector、还是 eBPF 采集层)和输出格式。

b、模式二:从链路派生服务依赖拓扑

在一次调用中,调用方和被调方各自产生一个 Span。通过配对同一次调用中的 client Span 和 server Span,系统可以推断出服务间的调用边,并为每条边生成指标——请求数、失败数、延迟分布。这些边指标可以驱动一张动态的服务拓扑图。

不同系统的实现方式:

• SkyWalking:OAP 后端通过分析 Span 父子关系和服务归属自动构建拓扑图,是其核心能力之一

• DeepFlow:通过 eBPF 在网络层面直接观测服务间的流量,无需依赖应用级 Span 的配对。DeepFlow 能够自动绘制包含任意语言服务、基础设施服务在内的全景拓扑图,覆盖了传统 APM 无法插桩的网关、DNS、数据库等组件

• Istio/Envoy:通过 Sidecar 代理掌握服务间所有流量,在网格层面直接生成拓扑

• 商用 APM(Datadog/New Relic/Elastic APM 等):各自内置 Service Map 功能

• OpenTelemetry:通过 Collector 中的 servicegraph connector 配对 client/server Span 生成依赖边指标

值得注意的是,这里存在两种本质不同的拓扑生成方式:应用层 Span 配对(SkyWalking、OTel servicegraph)和网络层流量观测(DeepFlow、Istio/Envoy)。前者依赖应用埋点的覆盖度,后者依赖基础设施层的可见性。DeepFlow 和 Istio 的方式特别适合覆盖那些无法插桩的遗留系统和基础设施组件。

c、模式三:从指标反向指回链路

前两种模式解决了"从链路生成指标和拓扑",但还缺一个能力:在指标看板上发现异常时,如何快速找到引发异常的那条具体 Trace?

不同系统的解法差异最大:

• 商用 APM / SkyWalking / DeepFlow:由于指标和链路在同一平台内管理,"从指标跳转到 Trace"是产品内置的交互能力。例如 DeepFlow 中发现应用指标异常时,可以在右滑窗中一键调阅关联的 Trace 和主机指标,不需要额外的跳转机制

• Prometheus + Grafana + Tracing 后端(Jaeger/Tempo)的开源组合:由于指标和链路分属不同系统,需要依赖 exemplar 机制——在指标数据点旁附加一个 trace_id 引用(OpenMetrics 规范定义)。Grafana 将 exemplar 以"星标点"叠加在指标曲线上,点击后自动跳转到配置的 Tracing 数据源

exemplar 机制有一个工程陷阱:它必须指向一条已被保留的 Trace。如果对应的 Trace 被采样丢弃,跳转会失败。这个问题在一体化平台(如 DeepFlow、SkyWalking)中不存在或较易处理,但在开源组合方案中需要特别注意采样策略与 exemplar 生成的一致性。

d、统一标签:一种从根本上消除数据孤岛的思路

上述三种模式各自解决了指标-链路关联的一个方面。但还有一种更根本的思路:如果所有观测信号从一开始就携带统一的标签体系,关联就是天然的,不需要额外的"桥接"机制。

DeepFlow 的 AutoTagging + SmartEncoding 机制是这一思路的典型实践。AutoTagging 自动从云平台 API 和 K8s apiserver 同步 30 多种资源标签、100 多种自定义标签,为所有观测信号(eBPF 采集的指标、链路、日志,以及集成的 Prometheus 指标、OpenTelemetry 数据)统一注入标准化标签。SmartEncoding 则通过预编码机制将标签存储开销降低一个数量级,使得大规模标签注入在工程上可行。

这种方式的效果是:用户在查询时可以用相同的标签(Pod、Service、Namespace、Region 等)跨任何信号类型进行过滤、分组和关联,不需要显式配置 exemplar 或 spanmetrics 等桥接组件。正如 DeepFlow 文档所述:"利用相同的标签和时间范围,即使不懂底层原理,也能快速将整个系统相关的数据关联起来。"

OpenTelemetry 的资源属性(Resource Attributes)和语义约定(Semantic Conventions)在理念上与此相似——也是为所有信号注入统一的 service.name、k8s.pod.name 等标签。差异在于 OTel 依赖开发者手动配置和维护标签,而 DeepFlow 通过 AutoTagging 实现了自动化。

e、三种模式的关系小结

三者配合,再加上日志关联,形成了三类信号之间完整的关联闭环:

这个闭环的底层逻辑是技术栈无关的。差异只在于:一体化平台(DeepFlow、SkyWalking、商用 APM)天然内置了这些能力,开源组合方案(Prometheus + Jaeger + OTel Collector)需要通过额外组件来补齐。

3、端到端数据处理流水线

前面两节介绍了关联的通用模式。本节将这些能力放入完整的数据处理流水线中,说明从采集到存储到可视化的全景架构,以及为第三部分 RCA 智能体准备了什么样的数据基础。

a、两种典型的流水线架构

根据关联能力的实现位置不同,业界的流水线架构大致分为两类:

架构一:一体化平台型

以 DeepFlow、SkyWalking、商用 APM 为代表。采集、关联、存储、查询在同一平台内完成,三类信号的关联是平台内置能力,用户无需额外配置桥接组件。

这类架构的优势是开箱即用、关联天然完整;局限是对平台本身的依赖度高。

架构二:开源组合型

以 OpenTelemetry Collector + Prometheus + Jaeger/Tempo + ELK/Loki 为代表。各组件独立部署,关联通过额外的连接器和配置实现。

这类架构的优势是灵活可组合、各组件可独立替换;局限是需要自行配置和维护关联机制。

b、无论哪种架构都必须满足的关键约束

无论选择哪种架构,以下约束是技术栈无关的:

(1)指标必须基于全量数据生成。 如果先做 Trace 采样再派生指标,指标会严重失真。SkyWalking 的服务端采样只影响 Trace 存储不影响指标计算;Datadog 的 APM Metrics 基于全部 traces 计算;DeepFlow 基于 eBPF 全量采集;OTel 生态中 spanmetrics 需要放在 tail sampling 之前。这是一个普遍的架构原则。

(2)拓扑派生需要看到调用双方的信息。 无论是 Span 配对还是网络流量观测,都需要某种机制确保调用双方的数据能被集中处理。OTel 通过 TraceID 一致性路由解决,SkyWalking 通过 OAP 集群内消息汇聚解决,DeepFlow 在网络层面直接观测所以不依赖 Span 汇聚。

(3)日志必须携带请求标识或可通过统一标签关联。 这是链路→日志跳转的基础。无论是应用侧注入 trace_id,还是通过统一标签体系关联,至少要有一种机制让日志和链路能对应起来。

(4)统一的命名和语义约定。 如果不同服务对 service.name 命名不一致,所有基于服务名的聚合和拓扑生成都会出错。这是组织层面的治理问题,任何技术产品都无法自动解决(DeepFlow 的 AutoTagging 在资源层面缓解了这一问题,但业务层面的语义仍需人为规范)。

c、为 RCA 智能体准备了什么

完成上述流水线建设后,三类可观测数据具备了以下能力,为第三部分的大模型智能体提供了结构化的数据基础:

指标侧:基于全量数据的 RED 指标和服务依赖边指标已就绪,可以驱动告警和态势感知。智能体可以查询这些指标,快速判断"哪些服务异常、异常集中在哪些调用边"。

链路侧:异常和慢请求的 Trace 已被优先保留(或在 DeepFlow 等全量采集方案中无需采样),可以提供因果路径证据。智能体可以抽取异常 Trace、对比正常 Trace,识别关键 Span 和故障传播路径。

日志侧:结构化日志已携带 trace_id/span_id(或可通过统一标签关联),可以围绕特定请求精确查询。智能体可以自动拉取对应日志,寻找失败机理的解释性证据。

关联能力:三类信号通过 trace_id、统一标签、平台内置跳转等机制互相关联。智能体可以在一次 RCA 会话中自动串联"指标异常 → 异常 Trace → 相关日志",形成完整的证据链。

这正是第三部分 RCA 智能体能够从"经验式推断"升级为"证据链驱动的多阶段推理"的数据前提。

03

基于大模型智能体的根因分析

第二部分完成了全链路数据的处理与融合,三类可观测信号已经具备了关联查询能力。本部分聚焦于:如何在这一数据基础上,构建一个以大语言模型(LLM)为推理中枢的 RCA 智能体系统,实现从"告警触发"到"根因确认"的闭环分析。

1、从传统 RCA 到智能体 RCA 的范式升级

a、传统方法的能力与局限

在大语言模型介入之前,自动化根因分析主要依赖以下几类方法:

规则与启发式是最容易落地的方式,基于典型故障模式(例如"入口服务正常但下游 DB Span 耗时上升且错误码集中"即判定为 DB 瓶颈)编写 Playbook。这种方法的效果依赖 Span 语义标准化和 Runbook 体系的完备度,对已知故障模式有效,但无法应对新型故障。

统计异常检测与排名更适合高维指标与多服务环境,通常对延迟、错误率、资源利用率等做异常检测,再在服务依赖图上做传播与排名。以 ST-GraphRCA 为代表的框架利用流守恒原理区分"根因"与"受害者"——如果一个节点的异常程度显著高于其上游输入且下游输出异常很高,则该节点被判定为故障源。

因果推断试图从相关性走向因果解释。RCD 算法通过条件独立性测试构建节点间的因果骨架,ClearCausal 提出跨层因果分析框架将应用函数 Traces 与基础设施指标结合定位根因。

这些方法在处理结构化数据和确定性拓扑时表现稳定,但共同的局限是:高度依赖预定义阈值和精确的拓扑关系。当系统发生突发性架构变更或出现前所未有的未知故障时,固定权重的模型往往失效。更关键的是,这些方法难以处理非结构化的文本日志——而日志往往包含最终定性根因的关键证据。

b、范式转变:从"问答型"到"调查型"

有了全链路数据后,RCA 智能体的定位应当从"基于告警和经验规则做推断"升级为基于证据链驱动的多阶段推理。

新的 RCA 智能体不应该一上来就回答"根因是什么",而应该像一个高级 SRE 一样分步调查:

1 先判断影响面——多少用户受影响?哪些服务异常?从什么时候开始?

2 再定位异常路径——异常请求经过了哪些服务?在调用链的哪个环节出错?

3 再解释失败机理——为什么这个环节出错?是连接池耗尽、慢 SQL、配置错误还是网络抖动?

4 最后确认最可能根因——综合所有证据,哪个候选解释最可信?

这与第一部分介绍的三支柱协同逻辑完全一致:指标做发现与定界(what/where),Trace 做路径定位(where/time),日志做机理解释(why)。区别在于,以前这个过程由人工执行,现在由智能体自动编排。

c、核心升级:新增"证据构建层"

将传统的 RCA 流程与全链路数据能力结合,整体流程从六阶段演进为七阶段:

态势感知 → 异常收敛 → 证据构建(新增)→ 根因假设 → 验证执行 → 排序决策 → 处置推荐

新增的"证据构建层"是关键——有了全链路数据后,RCA 的核心竞争力不再是"会不会猜",而是"能不能把多模态证据组织成一条可信的根因链"。这一层的工作是:围绕嫌疑对象,从 Trace 中提取异常路径证据,从日志中提取失败机理证据,从指标中提取异常强度证据,最终将它们拼装成一个结构化的证据集合,供后续的假设生成和验证环节使用。

2、多智能体协作架构

企业级数据中心的故障场景复杂多样,单一的大模型对话很难覆盖从态势感知到处置建议的全链路。建议采用"总控编排 Agent + 多专业子 Agent"的协作架构,各 Agent 围绕统一的 Incident 上下文协同工作,逐步把事故从"全局异常"收敛到"具体服务、具体调用边、具体机理"。

a、Incident Orchestrator:总控编排 Agent

总控 Agent 是整个 RCA 流程的调度中枢,负责创建一次 RCA 会话(Session),按照预定义的调查流程依次调度各子 Agent,并在过程中根据中间结果动态调整调查方向。

总控 Agent 的输入是一个告警事件,包含时间窗口和受影响对象(服务/接口/业务域/机房/租户)。它的产出是最终的 RCA 结论,包括候选根因、证据链、置信度和处置建议。

总控 Agent 不直接做分析判断,它的核心价值是流程编排——确保各子 Agent 按正确的顺序执行,前一步的产出成为下一步的输入,整个调查过程有序推进而不是各自为战。

b、Situation Awareness Agent:态势感知

态势感知 Agent 是调查的第一步,不做根因判断,只做全局态势扫描。它的目标是把"事故地图"画出来。

这个 Agent 主要依赖指标数据(尤其是从链路派生的 RED 指标和依赖边指标),扫描以下维度:

• SLI/SLO 是否偏离正常范围

• 四大黄金信号(错误率、延迟、吞吐、饱和度)中哪些异常

• 异常影响是全局、局部、单租户还是单链路

• 是否存在明显的变更点、发布点、流量突增点

它的产出是一个Incident Snapshot(事故快照),结构化地描述当前事故的全貌:

• 异常时间窗口(起始时间、持续时间)

• 波及服务列表及每个服务的异常程度

• 异常最重的调用边(如 order-service → inventory-service 错误率 +18%)

• 异常类型判断(错误率型/延迟型/吞吐型/饱和型)

• 可疑变更事件(如 inventory-service v3.4.2 rollout at 10:00)

• 优先调查方向

这一步的目标不是判断根因,而是为后续的链路调查和日志分析提供方向和范围。

c、Trace Investigation Agent:链路调查

链路调查 Agent 是有了全链路数据后"最值钱"的 Agent,因为 Trace 本质上是因果执行路径,比单纯的指标更接近真实的故障传播链。

它的核心工作流程是:

1 抽取代表性异常 Trace:从态势感知 Agent 给出的异常时间窗和异常服务范围中,选取错误/慢请求的代表性 Trace

2 正常/异常 Trace Diff:对比同一接口在异常前后的 Trace 结构,找出差异——哪些 Span 是新出现的、哪些 Span 的耗时发生了数量级变化、哪些下游调用开始报错

3 识别关键路径和关键 Span:在异常 Trace 中标注出耗时最长的 Span、错误率最高的 downstream、出现重试/熔断/超时级联的节点

4 标出故障传播路径:基于 Span 的父子关系和时序,推断故障从哪里开始、向哪里传播

它的产出是一个Suspect Set(嫌疑集),把搜索空间从"几十个服务都在报警"收敛到"最值得查的 2~5 个对象":

• 嫌疑服务集合

• 嫌疑 Span 集合(如 inventory-service → mysql.query)

• 嫌疑依赖边集合

• 嫌疑资源集合(DB、Redis、MQ、第三方接口)

• 嫌疑变更集合

d、Log Explanation Agent:日志机理解释

日志解释 Agent 不负责定位"哪里坏了"(这是链路调查 Agent 的工作),它负责解释"为什么坏了"。

它围绕链路调查 Agent 产出的嫌疑 Span 和嫌疑服务,基于 traceid/spanid/service.name/时间窗精确收缩日志查询范围(而不是全局搜索),重点识别以下模式:

• 资源耗尽类:连接池耗尽(HikariPool timeout)、线程池阻塞、文件描述符不足

• 数据库类:SQL 超时、锁等待、死锁、慢查询

• 网络类:连接拒绝(connection refused)、DNS 解析失败、网络超时

• 应用逻辑类:空指针异常、配置读取失败、认证/鉴权失败、序列化错误

• 流量管控类:限流触发、熔断打开、重试风暴

• 外部依赖类:第三方接口超时、消息队列堆积

日志解释 Agent 还需要区分业务校验类失败(如"库存不足")和系统失败(如"连接池耗尽")。前者通常不需要 SRE 介入,后者才是真正需要处理的故障。

这一步是 LLM 最能发挥价值的环节——传统的规则引擎很难理解非结构化日志的语义,但 LLM 天然擅长从错误堆栈、异常信息中提取故障模式和因果关系。

e、Hypothesis & Verification Agent:根因假设与验证

这是 RCA 智能体真正"像人"的部分,也是整个系统的成败关键。

(1)假设生成

基于前面三个 Agent 产出的证据(Incident Snapshot + Suspect Set + 日志模式),通过 Hypothesis Generator Prompt 模板让 LLM 在嫌疑集的约束范围内生成候选根因,而不是开放式地猜测。

例如,给定以下输入:

• 异常边:order-service → inventory-service

• 关键 Span:mysql.query 耗时从 8ms 恶化到 3.5s

• 日志模式:HikariPool timeout、too many connections

• 变更事件:inventory-service v3.4.2 发布于 10:00

• 指标模式:P99 升高、错误率升高、QPS 平稳

LLM 在约束范围内可能生成以下候选根因:

• 候选 1:inventory-service 发布后引入慢 SQL,导致数据库连接池耗尽

• 候选 2:数据库实例本身出现性能瓶颈(磁盘 IO/CPU 饱和)

• 候选 3:inventory-service 新版本存在连接泄漏,连接未正确释放

建议将根因类别预定义为一套分类体系(Taxonomy),而非让模型自由生成文本。常见的根因类别包括:应用发布缺陷、配置变更错误、数据库性能/连接池问题、缓存故障、消息堆积、下游接口异常、网络时延/丢包、资源耗尽、限流/熔断/重试风暴、数据异常、外部依赖故障。这样后续的排序、统计和案例库沉淀都更方便。

(2)四维验证

对每个候选根因,智能体不是直接输出结论,而是做多维度验证:

一致性验证:候选根因是否同时被 metrics、traces、logs 三类信号支持。例如"数据库连接池耗尽"这个候选,需要同时看到:指标显示连接池使用率 98%、Trace 中 mysql.query Span 超时、日志中出现 HikariPool timeout。如果只有其中一类信号支持,可信度就要打折。

时序验证:根因信号出现的时间是否早于或同步于事故爆发时间。如果候选根因是"10:00 的版本发布导致慢 SQL",但日志显示慢 SQL 在 9:50 就开始出现(发布之前),这个候选就站不住。

传播验证:候选根因能否解释故障的传播方向。例如,如果根因在 inventory-service,应该看到下游先异常、上游后异常(inventory-service 先报错 → order-service 等待超时 → gateway 返回 500)。如果传播方向不一致,候选得分需要降低。

反事实验证:如果该候选为真根因,哪些现象必须出现?如果没出现,就降分。例如"数据库连接池耗尽"为真,则必须看到:DB 相关 Span 耗时上升、应用日志出现 pool timeout、上游服务耗时被动拉长。如果这些都成立,候选得分很高;如果只看到一个慢 Span,但没有日志支持、没有传播关系,那就不能排第一。

(3)实现方式

这一层建议用 LLM + 规则引擎 + 查询模板混合实现:

• LLM 负责生成候选解释、组织证据、理解非结构化日志语义

• 规则引擎 负责严谨的验证逻辑(时序校验、传播方向校验)

• 查询模板 负责自动执行指标/链路/日志的验证查询

不能只靠大模型"猜"。LLM 擅长理解、推理和解释,但在严谨的逻辑验证上不如确定性规则可靠。

f、Ranking & Recommendation Agent:排序与处置建议

最后一层输出用户真正关心的内容。

(1)多维度证据评分

根因排序不应纯靠 LLM 的主观判断,而应构建一个多维度打分模型,使排序结果稳定且可解释:

• 异常强度分:相关指标的偏离程度(如 P99 从 40ms 到 3.2s,偏离 80 倍)

• 路径集中度分:该候选在异常 Trace 中出现的频率

• 日志解释力分:是否有明确的错误机理日志支持

• 时序吻合分:根因信号出现时间与事故起始时间的吻合度

• 拓扑传播分:能否解释故障在依赖图上的传播方向

• 变更相关分:是否与最近的发布/配置变更时间吻合

• 反证惩罚分:关键证据缺失时扣分

加权打分公式示例:

权重可以根据企业历史案例数据做校准,也可以作为可调参数由 SRE 团队根据经验调整。

(2)输出格式

最终输出不应只是"根因疑似 DB 慢查询"这样的一句话,而应包含四类内容:

• 结论:最可能根因是什么

• 证据:为什么这么判断(指标/链路/日志各提供了什么证据)

• 动作:建议怎么处置(具体操作步骤、对应的 Runbook)

• 风险:如果处置失败还有什么备选方案

以第一部分的电商案例为例,最终输出应当是:

最可能根因:inventory-service v3.4.2 发布后引入缺少索引的慢 SQL,导致数据库连接池耗尽。

主要证据:异常 Trace 中 mysql.query Span 大量超时(P99 从 40ms 升至 3.2s);inventory-service 日志出现 HikariPool timeout 且连接池 Active 50/50;问题开始时间与 10:00 发布高度重合;上游 order-service 延迟被动升高,故障传播方向一致。

建议动作:①先回滚 inventory-service v3.4.2;②同时检查连接泄漏与慢 SQL;③临时提高连接池上限作为缓解。

风险提示:若回滚后仍异常,需排查底层 DB 实例资源瓶颈(磁盘 IO、CPU)。

这不是"分析报告",而是能直接用于值班和处置的输出。建议同时生成结构化 JSON(供系统对接和自动化流程消费)和可读摘要(供值班 SRE 直接使用)两种格式。

3、RCA 证据图谱:智能体的结构化推理底座

a、为什么需要证据图谱

前面描述的多 Agent 协作过程中,各 Agent 产出的证据是分散的——态势感知产出指标异常列表,链路调查产出嫌疑 Span 集合,日志解释产出错误模式。如果智能体只是把这些文本拼接起来让 LLM 做总结,很容易出现信息丢失、逻辑跳跃或"幻觉"。

更好的做法是构建一个轻量的RCA 证据图谱(Evidence Graph),让智能体基于图结构做收敛、传播和排序,而不是基于文本做总结。

b、图谱的节点与边

证据图谱中的节点代表事故相关的各类实体:

• 事故实体:incident(事故)、deployment(发布)、config change(配置变更)

• 架构实体:service(服务)、endpoint(接口)、dependency edge(依赖边)、resource(DB/Redis/MQ/host/pod)

• 证据实体:trace(链路)、span(跨度)、log pattern(日志模式)、metric anomaly(指标异常)

图谱中的边代表实体之间的关系:

• 架构关系:calls(调用)、depends_on(依赖) • 归属关系:occurred_in(发生在)、belongs_to(属于)

• 因果关系:caused_by(导致)、impacts(影响) • 证据关系:explained_by(被解释为)、correlated_with(相关联)、validates(支持)、contradicts(反驳)

• 变更关系:changed_by(被变更影响)

c、图谱在 RCA 中的作用

有了证据图谱,智能体的推理过程就从"处理一堆文本"变为"遍历和推理一张图":

在异常收敛阶段,图谱可以沿着依赖边做传播分析——从最上游的异常入口出发,沿调用链找到异常最先出现且最严重的节点,这通常就是根因的候选位置。

在假设验证阶段,图谱可以检查一个候选根因是否有完整的证据支撑——从候选根因节点出发,看是否存在 explained_by 边指向日志模式、correlated_with 边指向指标异常、changed_by 边指向发布事件。如果所有边都存在,候选得分高;如果关键边缺失,候选得分低。在排序阶段,图谱可以量化每个候选根因的"证据完整度"——有多少条 validates 边、多少条 contradicts 边,从而生成可解释的排序依据。

4、小结

基于全链路数据的 RCA 智能体,其本质是一个以证据链为核心的多阶段智能分析体系:

• 数据基础:第二部分完成的全链路数据融合——三类信号通过 trace_id、统一标签等机制互相关联

• 架构设计:总控编排 + 多专业子 Agent 协作,每个 Agent 专注于一个分析阶段

• 推理机制:LLM 做理解和假设,规则引擎做验证,证据图谱做收敛和排序

• 输出要求:不是"分析报告",而是"结论 + 证据 + 动作 + 风险"的可执行输出

• 落地路径:数据先行 → 辅助分析 → 自动验证 → 持续积累

用一句话概括整个系统的设计理念:规则负责稳,图谱负责收敛,大模型负责理解和解释,自动化负责执行。

04

结语

通过以上梳理,笔者对全链路可观测的三大支柱有了比较全面的认识,也对三类信号之间的关联逻辑和工程实现方式有了更清晰的理解。

关于第三部分整理的 RCA 智能体设计,笔者认为这套"多 Agent 协作 + 证据链驱动"的理念比较符合当下智能体工程设计的趋势——不同的分析阶段拆分给不同的专业 Agent,各自做好自己擅长的事情,效果才会最好。

不过也必须承认,笔者所在银行的业务系统和互联网公司的架构有比较大的差异。银行系统的调用链路更复杂、涉及的中间件和外部依赖更多、合规要求也更严格,不太可能直接照搬互联网的方案。实际落地时,大概率需要根据具体的业务场景逐一设计和适配 RCA 的流程。

以上关于智能体的设计,只是笔者参考目前数据中心 RCA 相关的案例和论文整理的一个初稿。结合到具体的企业环境,肯定还有很多需要优化和调整的地方。笔者会基于这次调研的成果,着手做实际的智能体开发和落地验证。后续如果有阶段性的成果,会继续总结整理成文章分享给大家。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-03-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 周银杂谈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前记:笔者所在的公司目前正在推进全链路可观测性项目,而全链路数据落地后的第一个核心应用场景就是故障根因分析。基于这个背景,笔者花了比较多的时间去了解全链路可观测的相关概念——Traces、Logs、Metrics 三类信号各自是什么、怎么关联、怎么融合,以及在这些数据基础之上,如何结合大模型来设计 RCA 智能体。这篇文章是这段调研过程的一个系统性整理。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档