Trace ID 与 Span ID 是什么
分布式追踪靠两个标识串起全链路:trace_id 标识一次完整请求,长度 16 字节(32 位十六进制);span_id 标识链路中的一个节点操作,长度 8 字节(16 位十六进制)。同一 trace 内 trace_id 保持不变,每跳生成新的 span_id,并记录 parent_span_id 指向父节点,从而还原调用树。
基本信息
| trace_id | 16 字节,32 位十六进制 |
|---|---|
| span_id | 8 字节,16 位十六进制 |
| 父子关系 | 子 span 记录 parent_span_id |
| 生成方式 | 随机生成,不拼接业务信息 |
| 常用大小写 | 十六进制小写 |
| 相关规范 | W3C Trace Context、OpenTelemetry |
典型使用场景
- 按 trace_id 拉取一次请求经过的全部服务与耗时
- 定位某个慢请求具体卡在哪一跳,看 span 的耗时分布
- 把 trace_id 打进日志,实现日志与链路互相跳转
- 统计跨服务调用次数,梳理服务依赖关系
- 在压测或回归时按 trace 对照前后差异
- 排查异步链路时确认 trace 是否在消息队列处断开
格式示例
格式示例
trace_id 4bf92f3577b34da6a3ce929d0e0e4736 # 32 hex
span_id 00f067aa0ba902b7 # 16 hex
子 span 记录 parent_span_id 指向父节点;
跨服务传播时 trace_id 保持不变,span_id 每跳新生成。
# 日志里带上标识,才能与链路互跳
{"ts":"...","trace_id":"4bf92f3577b34da6a3ce929d0e0e4736","span_id":"00f067aa0ba902b7"}两个标识的职责
| 标识 | 长度 | 作用 |
|---|---|---|
| trace_id | 32 位十六进制 | 串联一次请求的全部操作 |
| span_id | 16 位十六进制 | 标识链路中的单个操作 |
| parent_span_id | 16 位十六进制 | 指向父节点,还原调用树 |
| 是否可变 | — | trace_id 全程不变,span_id 每跳新生成 |
日志里打印 trace_id 是实现「链路与日志互跳」的前提,格式按十六进制小写对齐,避免大小写差异导致比较失配。
标识必须随机生成:用时间戳或自增数拼接会在高并发下碰撞,也会泄漏业务信息。
全零的 trace_id 常被用于表示「跟踪被丢弃」的采样标记,排查时遇到全零标识应先确认采样策略。
跨系统对接时先核对标识长度与字节序:第三方系统用十进制或变长表示时,需要显式转换而不是直接透传。