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:供应商扩展字段,用于传递额外的追踪上下文。
值班台实践提示: 在资源权限审计场景中,SpanContext 可以携带用户身份 或权限标签,实现“一次请求,全链路审计”。建议在 Span 的 Attributes 中记录 user.id、permission.role 等字段。

2.2 分布式追踪数据模型:Trace 与 Span 的关系

下图展示了一个典型 Trace 的结构:一个前端请求经过 API 网关、订单服务、库存服务、支付服务,最终返回响应。每个服务内部的调用被记录为一个 Span,Span 之间通过 ParentSpanID 形成层级关系。

Trace 与 Span 层级关系图 Trace 结构示例:一次电商下单请求 TraceID: abc123def456 Span 1: API 网关 /api/checkout SpanID: 001 | 耗时: 120ms Span 2: 订单服务 createOrder SpanID: 002 | Parent: 001 | 耗时: 80ms Span 3: 库存服务 deductStock SpanID: 003 | Parent: 002 | 耗时: 30ms Span 4: 支付服务 processPayment SpanID: 004 | Parent: 002 | 耗时: 45ms 说明:每个 Span 记录一个服务的操作,通过 ParentSpanID 形成调用链。 SpanContext 中的 TraceID 保证所有 Span 属于同一个 Trace。

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 处理后发送到后端存储。

OpenTelemetry 架构部署图 OpenTelemetry 标准架构 服务 A OTel SDK 服务 B OTel SDK 服务 C OTel SDK 服务 D OTel SDK OpenTelemetry Collector 批处理 | 过滤 | 采样 | 重试 Jaeger / Tempo 分布式追踪存储 Prometheus / Cortex 指标存储 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 用于传递供应商自定义数据。

平台工程落地建议: 在值班台系统中,建议将用户权限上下文(如角色、租户 ID)写入 Span 的 Attributes 或 tracestate,实现“权限可追踪”。同时,利用 OTel Collector 的过滤能力,在导出前脱敏敏感信息(如手机号、身份证)。

2.4 小结