You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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();
    }
}

验证方法

  1. 客户端二请求:携带ot-custom-traceid和ot-custom-spanidHeader发送请求,查看服务端生成的Span是否复用这两个ID,可观测系统中是否能串联端到端链路。
  2. 客户端一请求:保持原有调用方式,验证标准链路传递逻辑不受影响。

注意事项

  • 确保项目已引入Micrometer Tracing相关依赖,比如对接Zipkin时需引入micrometer-tracing-bridge-brave。
  • 若需要向下游服务传递自定义追踪Header,实现CustomTracePropagator中的inject方法即可。

内容的提问来源于stack exchange,提问作者PatPanda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 16:25:15