2. OpenTelemetry 核心概念:Trace、Span、Metrics、Logs、Context Propagation
在构建值班机器人故障诊断体系之前,必须理解 OpenTelemetry 的五大核心概念。它们构成了可观测性的数据基础,也是事件触发与根因分析的原始素材来源。本节将逐一拆解这些概念,并展示它们如何在故障诊断链路中协同工作。
2.1 核心概念全景图
OpenTelemetry 将可观测性数据归纳为三大信号(Traces、Metrics、Logs),并通过 Context Propagation 将它们关联到同一个请求上下文中。下图展示了这四类数据与传播机制的关系:
2.2 Trace(追踪)
Trace 记录一个请求从入口到出口的完整路径,跨越多个服务、进程和网络边界。在故障诊断中,Trace 是还原请求全貌的核心工具。
| 属性 | 说明 | 故障诊断价值 |
|---|---|---|
| Trace ID | 全局唯一标识,贯穿整个请求生命周期 | 关联所有相关 Span 和日志 |
| Span 集合 | 由多个 Span 组成的有向无环图 | 展示请求经过的每个服务节点 |
| 时间范围 | 从请求开始到结束的完整时间窗口 | 判断整体延迟是否异常 |
| 服务拓扑 | Span 之间的父子关系构成服务调用链 | 定位故障发生在哪个环节 |
值班场景提示: 当告警触发时,值班机器人应自动提取异常 Trace ID,并关联该 Trace 下的所有 Span,快速定位故障服务。
2.3 Span(跨度)
Span 是 Trace 中的最小工作单元,代表一个操作或一个步骤。每个 Span 包含操作名称、开始时间、结束时间、状态和属性。
Span 的关键属性:
- Span ID:当前 Span 的唯一标识
- Parent Span ID:父 Span 的 ID,用于构建调用链
- Span Kind:Client、Server、Internal、Producer、Consumer
- Status:Unset、Ok、Error(含错误描述)
- Attributes:键值对,记录业务或技术上下文
- Events:Span 生命周期内的关键事件
// Span 创建示例(伪代码)
span = tracer.startSpan("process_order")
span.setAttribute("order.id", "ORD-12345")
span.setAttribute("payment.amount", 299.99)
// ... 执行业务逻辑 ...
span.setStatus(StatusCode.ERROR, "支付超时")
span.end()
2.4 Metrics(指标)
Metrics 是聚合后的数值数据,用于衡量系统在时间维度上的行为。与 Trace 的请求级粒度不同,Metrics 关注的是整体趋势和阈值。
| 指标类型 | 说明 | 典型示例 |
|---|---|---|
| Counter | 单调递增计数器 | 请求总数、错误总数 |
| Histogram | 数值分布统计 | 请求延迟分布、响应大小分布 |
| Gauge | 可上下波动的瞬时值 | CPU 使用率、内存占用 |
| UpDownCounter | 可增减的计数器 | 活跃连接数、队列深度 |
故障诊断关联: 值班机器人通常基于 Metrics 触发告警(如 P99 延迟 > 500ms),然后自动拉取对应时间窗口的 Trace 和 Logs 进行根因分析。
2.5 Logs(日志)
Logs 是带有时间戳的结构化或非结构化文本记录。OpenTelemetry 的 Logs 信号与 Trace 深度集成,每条日志可以关联到特定的 Trace ID 和 Span ID。
结构化日志推荐格式:
{
"timestamp": "2025-03-21T14:30:00.123Z",
"severity": "ERROR",
"body": "数据库连接超时",
"trace_id": "abc123def456",
"span_id": "span789",
"attributes": {
"db.system": "postgresql",
"db.operation": "SELECT",
"error.type": "timeout"
}
}
2.6 Context Propagation(上下文传播)
Context Propagation 是 OpenTelemetry 的粘合剂,负责在服务之间传递上下文信息(Trace ID、Span ID、Baggage 等)。没有它,Trace 会在服务边界断裂,Metrics 和 Logs 也无法关联到同一个请求。
传播机制分为两部分:
- W3C Trace Context:标准 HTTP 头
traceparent和tracestate - Baggage:携带业务上下文(如用户 ID、租户 ID)
// HTTP 请求中的上下文传播示例
// 客户端发送请求时自动注入
traceparent: 00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01
tracestate: vendor_id=abc123
baggage: user_id=u_98765,tenant=prod-east
2.7 四类数据在故障诊断中的协同
下表总结了 Trace、Span、Metrics、Logs 在值班机器人故障诊断流程中的角色:
| 诊断阶段 | 主要数据源 | 作用 |
|---|---|---|
| 告警触发 | Metrics | 检测异常指标,触发告警事件 |
| 问题定位 | Trace + Span | 还原请求路径,定位故障服务 |
| 根因分析 | Logs + Span Events | 查看错误详情和异常堆栈 |
| 影响评估 | Metrics + Trace | 评估故障影响范围和持续时间 |
常见误区: 不要只依赖一种信号。仅看 Metrics 可能误判故障点,仅看 Logs 可能丢失请求上下文。OpenTelemetry 的价值在于三信号联动 + 上下文传播。
2.8 实战:从 Metrics 告警到 Trace 关联
以下是一个典型的值班机器人故障诊断数据流:
2.9 关键概念速查表
| 概念 | 粒度 | 是否跨服务 | 主要用途 |
|---|---|---|---|
| Trace | 请求级 | 是 | 端到端请求追踪 |
| Span | 操作级 | 否(单服务内) | 记录单个操作详情 |
| Metrics | 聚合级 | 是 | 系统健康度监控 |
| Logs | 事件级 | 否 | 错误详情与调试信息 |
| Context Propagation | 上下文级 | 是 | 关联所有信号 |