2、核心概念:Span、Trace、Context Propagation、Sampler,以及它们在超时监控中的作用
在 OpenTelemetry 追踪体系中,理解四个核心概念是构建超时监控能力的基础。它们共同定义了“一次请求从哪里开始、经过哪些服务、每个步骤花了多少时间、以及哪些请求被记录”。下面逐一拆解这些概念,并说明它们与调用链超时监控的直接关系。
2.1 Span —— 追踪的最小工作单元
Span 代表一个单一的操作或工作单元,例如一次数据库查询、一个 HTTP 请求处理、或一段业务逻辑的执行。每个 Span 记录以下关键信息:
- 操作名称(Operation Name):描述正在执行的操作,如
HTTP GET /api/orders。 - 开始时间戳(Start Timestamp)与结束时间戳(End Timestamp):精确到微秒或纳秒,用于计算耗时。
- 属性(Attributes):键值对形式的元数据,如
http.method、http.status_code、db.statement。 - 状态(Status):
OK、ERROR或UNSET,用于标记操作是否成功。 - 事件(Events):带时间戳的日志记录,用于标记异常或关键里程碑。
ERROR 并附加超时事件,从而在追踪中快速定位超时根因。
2.2 Trace —— 端到端的请求链路
Trace 由一组 Span 组成,这些 Span 通过相同的 Trace ID 关联,共同描述一个完整的请求从入口到出口的完整路径。Trace 的结构通常是一个有向无环图(DAG),其中每个 Span 代表一个服务或组件内的操作。
在超时监控中,Trace 的价值在于:
- 展示请求经过的所有服务节点及其调用顺序。
- 暴露每个节点的耗时分布,快速识别“慢在哪一环”。
- 通过 Trace 的总耗时与服务级别目标(SLO)对比,判断是否违反误差预算。
2.3 Context Propagation —— 跨进程的上下文传递
Context Propagation 是 OpenTelemetry 的核心机制,它确保 Trace ID、Span ID 以及 Baggage(自定义上下文数据)能够在不同服务、不同进程、甚至不同协议之间无缝传递。没有正确的传播,分布式追踪将断裂成孤立的 Span,无法形成完整的 Trace。
传播方式通常通过 HTTP 头部(如 traceparent、tracestate)或 gRPC 元数据实现。以下是一个典型的 HTTP 传播头部示例:
traceparent: 00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01
| | |-- Trace ID (32 hex chars) --| |-- Span ID (16 hex chars) --| |-trace flags-|
2.4 Sampler —— 采样决策引擎
Sampler 决定哪些 Trace 被记录和导出。在高流量系统中,记录所有 Trace 会产生巨大的存储和计算开销,因此需要采样策略。OpenTelemetry 支持多种采样器:
| 采样器类型 | 决策依据 | 超时监控适用场景 |
|---|---|---|
| AlwaysOn | 记录所有 Trace | 低流量系统或调试阶段 |
| AlwaysOff | 不记录任何 Trace | 生产环境禁用(仅用于测试) |
| TraceIdRatioBased | 基于 Trace ID 哈希的概率采样 | 通用生产环境,按比例(如 1%)采样 |
| ParentBased | 继承父 Span 的采样决策 | 保证同一 Trace 内所有 Span 采样一致 |
| 自定义(如 Head-Based) | 根据请求属性(如 URL、延迟)动态决策 | 超时监控首选:优先采样高延迟或超时风险请求 |
2.5 四者协同:超时监控中的角色分工
下面这张 SVG 图展示了 Span、Trace、Context Propagation 和 Sampler 在超时监控中的协作关系:
2.6 超时监控中的关键数据流
下面这张 SVG 图展示了一个典型请求在超时场景下的数据流,从 Span 创建到误差预算更新:
2.7 概念与超时监控的映射关系总结
| 核心概念 | 在超时监控中的角色 | 关键属性/方法 |
|---|---|---|
| Span | 记录每个操作的实际耗时,判断是否超时 | startTime、endTime、status、attributes |
| Trace | 组装完整请求路径,计算端到端耗时 | traceId、rootSpan、spanCount |
| Context Propagation | 保证跨服务 Trace 连续性,避免链路断裂 | traceparent、tracestate、baggage |
| Sampler | 控制超时 Trace 的采样率,平衡成本与可见性 | shouldSample()、samplingResult |