2. OpenTelemetry 核心概念:Trace、Span、Context Propagation、Sampler 接口

在深入自动化采样与 Runbook 联动之前,必须牢固掌握 OpenTelemetry 的四大核心抽象。它们是整个可观测性数据模型的基石,也是后续配置采样策略和编写自动化脚本的操作对象。

2.1 Trace(追踪)与 Span(跨度)

Trace 代表一个请求或事务在分布式系统中的完整生命周期。它由多个 Span 组成,这些 Span 通过父子关系连接,形成一棵有向无环图(DAG)。

Span 是 Trace 中的最小工作单元,记录了一个操作(如数据库查询、RPC 调用、函数执行)的开始、结束、状态和元数据。

概念类比关键属性
Trace一次完整的电商下单流程TraceId(全局唯一)、开始时间、结束时间
Span流程中的“查询库存”步骤SpanId、ParentSpanId、OperationName、StartTime、EndTime、Status、Attributes、Events
关键点: TraceId 在整个请求链中保持不变;SpanId 在每个 Span 内唯一;ParentSpanId 指向父 Span,形成调用链。
Trace 与 Span 树形结构示例 Root Span: /checkout Span: auth.verify Span: inventory.check Span: payment.process Span: db.query TraceId 全局唯一;每个 Span 通过 ParentSpanId 指向父节点,形成完整的调用链拓扑

2.2 Context Propagation(上下文传播)

Context Propagation 是分布式追踪的核心机制,负责将 Trace 上下文(TraceId、SpanId、Baggage 等)跨进程、跨网络边界传递。没有正确的传播,多个服务之间的 Span 将无法关联到同一个 Trace。

传播方式分为两种:

  • W3C TraceContext(推荐): 使用 traceparent 和 tracestate HTTP 头传递上下文,是业界标准。
  • B3 Propagation: Zipkin 使用的格式,使用 X-B3-TraceId、X-B3-SpanId 等头。
最佳实践: 新项目优先使用 W3C TraceContext;存量系统可通过 OpenTelemetry SDK 的 CompositePropagator 同时支持多种格式,实现平滑迁移。

2.3 Sampler 接口(采样器接口)

Sampler 是 OpenTelemetry 中控制数据采集量的核心接口。它决定一个 Span 是否被采样(记录并导出)。SDK 内置了多种采样器,也支持自定义实现。

核心接口定义(简化):

// Sampler 接口
type Sampler interface {
    ShouldSample(parameters SamplingParameters) SamplingResult
    Description() string
}

// SamplingParameters 包含:
// - TraceId
// - SpanId
// - SpanName
// - SpanKind
// - Attributes
// - Links
// - ParentContext

// SamplingResult 包含:
// - Decision: Drop | RecordOnly | RecordAndSample
// - Attributes: 附加到 Span 的采样标签
// - Tracestate: 更新后的 tracestate
内置采样器决策逻辑适用场景
AlwaysOnSampler始终采样开发环境、低流量调试
AlwaysOffSampler始终不采样完全禁用追踪
TraceIdRatioBasedSampler基于 TraceId 哈希的概率采样生产环境按比例采样(如 10%)
ParentBasedSampler继承父 Span 的采样决策确保整个 Trace 的采样一致性
注意: 如果父 Span 被采样而子 Span 未继承决策,会导致 Trace 断裂。生产环境通常使用 ParentBased(ratioSampler) 组合,保证 Trace 完整性。
Sampler 决策流程 SamplingParameters Sampler.ShouldSample() Drop RecordOnly RecordAndSample Drop:丢弃 Span;RecordOnly:记录但不导出;RecordAndSample:记录并导出

2.4 四大概念的关系

这四个概念在 OpenTelemetry SDK 中的协作流程如下:

  1. 应用发起请求,SDK 通过 Propagator 从传入请求中提取 Trace 上下文(TraceId、ParentSpanId)。
  2. SDK 创建新的 Span,并调用 Sampler 的 ShouldSample 方法决定是否采样。
  3. 如果决策为 RecordAndSample,Span 数据被记录并最终导出到后端。
  4. 当 Span 调用下游服务时,SDK 通过 Propagator 将当前上下文注入到出站请求中,实现跨服务传播。
实战要点: 自定义 Sampler 可以访问 SamplingParameters 中的 Attributes 和 ParentContext,从而实现基于业务标签(如 http.status_code=500)或 Trace 级别的动态采样策略。这是后续章节实现“异常自动采样”的基础。