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,形成调用链。
2.2 Context Propagation(上下文传播)
Context Propagation 是分布式追踪的核心机制,负责将 Trace 上下文(TraceId、SpanId、Baggage 等)跨进程、跨网络边界传递。没有正确的传播,多个服务之间的 Span 将无法关联到同一个 Trace。
传播方式分为两种:
- W3C TraceContext(推荐): 使用
traceparent和tracestateHTTP 头传递上下文,是业界标准。 - 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 完整性。
2.4 四大概念的关系
这四个概念在 OpenTelemetry SDK 中的协作流程如下:
- 应用发起请求,SDK 通过 Propagator 从传入请求中提取 Trace 上下文(TraceId、ParentSpanId)。
- SDK 创建新的 Span,并调用 Sampler 的
ShouldSample方法决定是否采样。 - 如果决策为
RecordAndSample,Span 数据被记录并最终导出到后端。 - 当 Span 调用下游服务时,SDK 通过 Propagator 将当前上下文注入到出站请求中,实现跨服务传播。
实战要点: 自定义 Sampler 可以访问
SamplingParameters 中的 Attributes 和 ParentContext,从而实现基于业务标签(如 http.status_code=500)或 Trace 级别的动态采样策略。这是后续章节实现“异常自动采样”的基础。