Micrometer Tracing 负责 traceId、spanId 的创建和跨进程传播。它是日志与调用链能串起来的前提,不负责存储和展示调用链。
一、Reactor 场景要开启上下文传播
@PostConstruct
public void enableReactorContextPropagation() {
Hooks.enableAutomaticContextPropagation();
}
Gateway 是异步链路,线程会切换。开启自动上下文传播后,traceId 才能恢复到回调线程的 MDC,被日志输出。
二、跨服务靠标准请求头
服务之间传播 W3C traceparent 请求头。一个请求从 Gateway 进入,再调用 Provider 或 Mail,仍然保持同一个 traceId。
三、采样是成本开关
开发环境使用全采样,方便排查;生产环境使用低采样率,控制链路数据量。采样策略要跟环境目标匹配。
四、避坑点
- 异步线程、线程池、Reactor 回调都可能丢上下文。
- 日志格式要包含 traceId/spanId 才能真正使用。
- 有 traceId 不代表每个服务都导出了 span。
- 采样率越高,观测越细,成本也越高。
五、经验总结
Micrometer Tracing 是可观测性的上下文基础。它让一次请求在不同服务、不同线程之间仍然可以被识别为同一件事。