2. 分布式追踪基础:Trace、Span、SpanContext 概念,OpenTelemetry 标准简介
分布式追踪是平台工程中观测性(Observability)的三大支柱之一,也是值班台系统在故障定位、性能分析和资源权限审计时的核心数据来源。本节将系统讲解分布式追踪的三大核心抽象——Trace、Span、SpanContext,并介绍当前业界标准 OpenTelemetry 的基本架构。
2.1 核心概念:Trace、Span、SpanContext
分布式追踪的本质是记录一次请求在多个微服务、中间件、数据库之间的完整传播路径。为了统一描述这种跨进程的调用关系,业界抽象出三个基础概念:
| 概念 | 定义 | 类比(一次电商下单) |
|---|---|---|
| Trace | 一次完整请求的生命周期,由多个 Span 组成的有向无环图(DAG) | 用户从点击“下单”到收到“成功”页面的全过程 |
| Span | Trace 中的一个工作单元,记录一个操作(如 RPC 调用、数据库查询)的开始和结束 | 订单服务调用库存服务的这一次 HTTP 请求 |
| SpanContext | 跨进程传递的追踪标识集合,包含 TraceID、SpanID、采样标志等 | 快递单上的运单号、发货地址、收件人信息 |
2.1.1 Trace:请求的全景图
Trace 由全局唯一的 TraceID 标识。一个 Trace 包含若干 Span,这些 Span 通过父子关系或因果关系连接,形成一棵树状结构(或 DAG)。在值班台场景中,Trace 可以对应一次用户操作、一个定时任务调度、或一次 API 网关转发。
2.1.2 Span:最小的观测单元
每个 Span 记录以下关键信息:
- SpanID:当前 Span 的唯一标识。
- ParentSpanID:父 Span 的 ID,用于构建调用链。
- OperationName:操作名称,如
HTTP GET /api/orders。 - StartTime / EndTime:开始与结束时间戳,用于计算延迟。
- Attributes:键值对形式的元数据,如
http.method、db.system。 - Events:时间戳标记的事件,如缓存命中、异常抛出。
- Status:成功或错误状态码。
2.1.3 SpanContext:跨进程的“护照”
SpanContext 是分布式追踪能够跨服务传播的核心。它通常包含以下字段:
- TraceID:全局唯一,128 位(通常用 32 位十六进制表示)。
- SpanID:当前 Span 的 64 位标识。
- TraceFlags:采样标志位,指示当前 Trace 是否被采样。
- TraceState:供应商扩展字段,用于传递额外的追踪上下文。
user.id、permission.role 等字段。
2.2 分布式追踪数据模型:Trace 与 Span 的关系
下图展示了一个典型 Trace 的结构:一个前端请求经过 API 网关、订单服务、库存服务、支付服务,最终返回响应。每个服务内部的调用被记录为一个 Span,Span 之间通过 ParentSpanID 形成层级关系。
2.3 OpenTelemetry 标准简介
OpenTelemetry(简称 OTel)是 CNCF 孵化的可观测性标准,旨在统一分布式追踪、指标和日志的数据采集与导出。它由 OpenTracing 和 OpenCensus 合并而来,已成为平台工程中数据采集层的事实标准。
2.3.1 OpenTelemetry 核心架构
OpenTelemetry 的架构分为三个主要层次:
- API:定义 Trace、Span、SpanContext、Meter、Counter 等抽象接口,不依赖具体实现。
- SDK:提供 API 的默认实现,包括采样、处理、导出等逻辑。
- Exporter:将数据导出到后端系统(如 Jaeger、Zipkin、Prometheus、Datadog)。
下图展示了 OpenTelemetry 在微服务架构中的典型部署方式:每个服务通过 OTel SDK 采集追踪数据,经过 Collector 处理后发送到后端存储。
2.3.2 OpenTelemetry 关键组件
| 组件 | 职责 | 值班台关注点 |
|---|---|---|
| OTel API | 定义 Tracer、Span、SpanContext 等接口 | 与语言无关,支持 Java、Go、Python 等 |
| OTel SDK | 实现 API,提供采样、SpanProcessor、Exporter | 可配置采样率,控制存储成本 |
| OTel Collector | 接收、处理、导出遥测数据 | 支持批处理、重试、过滤敏感字段 |
| Exporter | 将数据发送到后端(Jaeger、Zipkin、OTLP) | 多后端同时导出,便于迁移 |
| Propagator | 负责跨进程传递 SpanContext(HTTP/gRPC 头) | 支持 W3C TraceContext 标准 |
2.3.3 跨进程传播:W3C TraceContext
OpenTelemetry 默认使用 W3C TraceContext 标准进行跨服务传播。传播载体是 HTTP 头或 gRPC 元数据:
# HTTP 请求头示例
traceparent: 00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01
tracestate: congo=t61rcWkgMzE,rojo=00f067aa0ba902b7
其中 traceparent 包含版本号、TraceID、SpanID、TraceFlags;tracestate 用于传递供应商自定义数据。