2. OpenTelemetry 核心概念:Trace、Span、Metric、Log、Context Propagation、Exporter

OpenTelemetry(简称 OTel)是 CNCF 孵化的可观测性标准框架,它通过一套统一的 API、SDK 和协议,将应用程序的 Trace(链路)、Metric(指标)、Log(日志) 三大信号进行标准化采集与导出。理解其核心概念是构建自动化 Runbook 响应体系的基础。

2.1 核心信号概览

OTel 将可观测性数据抽象为三种主要信号,它们共同覆盖了系统行为的“发生了什么”、“为什么发生”和“趋势如何”。

信号类型 核心作用 典型数据 在 Runbook 中的用途
Trace(链路) 追踪请求在分布式系统中的完整路径 请求 ID、耗时、服务间调用关系 定位故障点、分析延迟瓶颈
Metric(指标) 聚合统计系统或服务的数值特征 CPU 使用率、请求 QPS、错误率、延迟 P99 触发告警阈值、评估系统健康度
Log(日志) 记录离散的事件或消息 错误堆栈、访问日志、业务操作记录 提供故障上下文、辅助根因分析
实践要点:在自动化 Runbook 中,通常由 Metric 触发告警,然后通过 Trace 快速定位异常服务,最后结合 Log 进行根因确认。三者缺一不可。

2.2 Trace 与 Span:分布式追踪的基石

Trace 代表一个请求或事务在分布式系统中经过的完整路径。一个 Trace 由一个或多个 Span 组成,Span 是追踪的最小工作单元,描述了一个具体的操作(如一次数据库查询、一个 RPC 调用)。

  • Span 属性:每个 Span 包含名称、开始/结束时间戳、状态(OK/Error)、Span 上下文(Trace ID、Span ID、Parent Span ID)以及可选的属性(Attributes)和事件(Events)。
  • 父子关系:Span 之间通过 Parent Span ID 形成树状结构,完整还原请求的调用拓扑。
  • Span 状态:当 Span 状态为 Error 时,通常意味着该操作失败,是 Runbook 自动响应的重要触发点。
Trace 与 Span 结构示例 Trace: /api/order/create (Trace ID: abc123) Span: 用户鉴权 (Span ID: s1, Parent: null) Span: 库存查询 (Span ID: s2, Parent: s1) Span: 扣减库存 (Span ID: s3, Parent: s2) [状态: Error] Span: 发送通知 (Span ID: s4, Parent: s1) 说明:Span s3 状态为 Error,自动化 Runbook 可据此触发回滚或告警流程

2.3 Metric:聚合与告警的量化基础

Metric 是随时间变化的数值型数据,用于衡量系统的状态和性能。OTel 定义了三种主要的 Metric 类型:

  • Counter(计数器):只增不减的值,如请求总数、错误总数。
  • Histogram(直方图):对观测值进行采样并统计分布,如请求延迟的 P50/P90/P99。
  • Gauge(仪表盘):可增可减的瞬时值,如当前内存使用量、活跃连接数。
Runbook 集成示例:当 Histogram 类型的 http.server.duration 指标的 P99 超过 2000ms 时,自动化 Runbook 可以自动触发慢查询分析或扩容流程。

2.4 Log:事件记录的标准化

OTel 的 Log 信号旨在将传统日志与 Trace 关联起来。通过 Trace ID 和 Span ID,日志可以自动关联到对应的请求链路,实现“日志即事件”。

// 结构化日志示例(JSON 格式)
{
  "timestamp": "2025-04-10T14:30:00.123Z",
  "severity": "ERROR",
  "body": "数据库连接超时",
  "trace_id": "abc123",
  "span_id": "s3",
  "attributes": {
    "db.system": "mysql",
    "db.operation": "SELECT",
    "error.message": "Connection refused"
  }
}

2.5 Context Propagation:跨服务传递追踪上下文

Context Propagation 是分布式追踪的核心机制。它确保一个请求在跨越多个服务(如 A → B → C)时,Trace ID 和 Span ID 能够被正确传递,从而将所有 Span 关联到同一个 Trace 中。

  • 传播方式:通常通过 HTTP 头(如 traceparent)、gRPC 元数据或消息队列的 Header 进行传递。
  • W3C Trace Context:OTel 默认遵循 W3C 标准,使用 traceparent 和 tracestate 头。
  • 自动化 Runbook 意义:当 Runbook 自动调用下游服务进行诊断时,必须正确传递上下文,否则无法形成完整的故障链路视图。
Context Propagation 跨服务传递流程 服务 A 生成 Trace ID: abc 服务 B 接收 Trace ID: abc 服务 C 接收 Trace ID: abc HTTP Header: traceparent: 00-abc123-0000000000000001-01 每个服务解析 Header,创建子 Span,并继续向下传递 说明:若 Runbook 自动调用服务 B 的 API,必须携带 traceparent 头,否则链路断裂

2.6 Exporter:数据导出与后端集成

Exporter 负责将 OTel SDK 采集到的 Trace、Metric、Log 数据发送到后端分析系统(如 Prometheus、Jaeger、Grafana、Datadog 等)。

Exporter 类型 协议/格式 常见后端 适用场景
OTLP Exporter gRPC / HTTP (Protobuf) OpenTelemetry Collector 标准推荐,支持所有信号
Prometheus Exporter HTTP /text Prometheus Server 仅 Metric,与 Prometheus 生态集成
Jaeger Exporter Thrift / gRPC Jaeger Collector 仅 Trace,传统 Jaeger 用户
Console Exporter 标准输出 调试/开发环境 本地测试与验证
关键配置:在自动化 Runbook 场景中,建议使用 OTLP Exporter 将数据发送到 OTel Collector,再由 Collector 进行路由、过滤、批处理后再转发到多个后端。这样可以避免 Runbook 直接依赖后端服务的可用性,提高数据采集的可靠性。

2.7 概念关系总结

下图展示了 OTel 核心概念之间的协作关系:应用程序通过 SDK 生成 Trace/Metric/Log,Context Propagation 确保跨服务关联,最终由 Exporter 统一导出。

OpenTelemetry 核心概念关系图 应用程序 (Application) OpenTelemetry SDK (API + SDK) Trace / Span Metric Log Exporter (OTLP / Prometheus / Jaeger / Console)
自动化 Runbook 视角:理解这些核心概念后,Runbook 可以设计为:监听 Metric 告警 → 通过 Trace ID 拉取完整链路 → 分析 Error Span 的 Attributes 和 Log → 根据预定义规则执行自动化恢复操作(如重启、降级、限流)。Context Propagation 确保 Runbook 自身的诊断请求也能融入链路,形成闭环。