SpringBoot 3.4如何基于自定义Header实现链路追踪传递?
解决SpringBoot 3.4 + Micrometer下自定义追踪Header的链路延续问题
要同时兼容标准链路传递(客户端一)和自定义Header传递(客户端二),核心是通过自定义Micrometer Tracing的Propagator,让服务端识别并延续自定义Header中的追踪信息,无需依赖Spring Cloud Sleuth。
实现步骤
1. 自定义Propagator解析自定义Header
实现Propagator接口,专门处理ot-custom-traceid和ot-custom-spanid这两个自定义Header,提取追踪信息并生成对应的SpanContext。
import io.micrometer.tracing.SpanContext; import io.micrometer.tracing.TraceContext; import io.micrometer.tracing.propagation.Propagator; import java.util.List; public class CustomTracePropagator implements Propagator { public static final String CUSTOM_TRACE_ID = "ot-custom-traceid"; public static final String CUSTOM_SPAN_ID = "ot-custom-spanid"; @Override public List<String> fields() { return List.of(CUSTOM_TRACE_ID, CUSTOM_SPAN_ID); } @Override public <C> void inject(SpanContext context, C carrier, Setter<C> setter) { // 若需要向下游传递自定义Header,可在此实现 // setter.set(carrier, CUSTOM_TRACE_ID, context.traceContext().traceId()); // setter.set(carrier, CUSTOM_SPAN_ID, context.traceContext().spanId()); } @Override public <C> SpanContext extract(C carrier, Getter<C> getter) { String traceId = getter.get(carrier, CUSTOM_TRACE_ID); String spanId = getter.get(carrier, CUSTOM_SPAN_ID); if (traceId != null && spanId != null) { return new CustomSpanContext(traceId, spanId); } return null; } static class CustomSpanContext implements SpanContext { private final String traceId; private final String spanId; CustomSpanContext(String traceId, String spanId) { this.traceId = traceId; this.spanId = spanId; } @Override public TraceContext traceContext() { return new TraceContext() { @Override public String traceId() { return traceId; } @Override public String spanId() { return spanId; } @Override public boolean sampled() { return true; // 根据业务需求调整采样策略 } }; } @Override public boolean isRemote() { return true; } } }
2. 配置复合Propagator兼容双客户端
创建配置类,将自定义Propagator与默认的标准Propagator合并,确保服务端优先尝试解析自定义Header,若不存在则使用标准链路传递逻辑(兼容客户端一)。
import io.micrometer.tracing.propagation.Propagator; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.List; @Configuration public class TracingConfig { @Bean public Propagator compositePropagator(Propagator defaultPropagator, CustomTracePropagator customPropagator) { // 顺序优先:先解析自定义Header,再用默认标准逻辑 return Propagator.composite(List.of(customPropagator, defaultPropagator)); } @Bean public CustomTracePropagator customTracePropagator() { return new CustomTracePropagator(); } }
验证方法
- 客户端二请求:携带
ot-custom-traceid和ot-custom-spanidHeader发送请求,查看服务端生成的Span是否复用这两个ID,可观测系统中是否能串联端到端链路。 - 客户端一请求:保持原有调用方式,验证标准链路传递逻辑不受影响。
注意事项
- 确保项目已引入Micrometer Tracing相关依赖,比如对接Zipkin时需引入
micrometer-tracing-bridge-brave。 - 若需要向下游服务传递自定义追踪Header,实现
CustomTracePropagator中的inject方法即可。
内容的提问来源于stack exchange,提问作者PatPanda
相关产品推荐
相关产品推荐

