Spring Cloud Sleuth自定义传播机制实现后baggage传播不生效问题
问题根因
- 你当前直接将未经过BaggagePropagation包装的自定义传播器注册为顶层传播工厂,直接替换了Sleuth默认的复合传播链,丢失了负责baggage字段读取、传递、写入的全部处理逻辑
- Sleuth默认的传播逻辑是外层由BaggagePropagation处理所有baggage相关的请求头,再委托内层的B3Propagation处理链路追踪字段,你的自定义实现直接跳过了外层的Baggage处理层,所以配置的kek字段无法被识别和传递
解决方案
步骤1:修复语法错误
先修复CustomPropagator伴生对象中HEADER_KEYS的语法问题,补全逗号:
val HEADER_KEYS = listOf<String>( B3_TRACE_ID, B3_SPAN_ID, B3_PARENT_SPAN_ID, B3_SAMPLED, B3_FLAGS, "X-trace-id", // 补全此处逗号 "X-span-id" )
步骤2:调整传播工厂注册逻辑,保留Baggage处理层
不要直接将CustomPropagator作为传播工厂注册到Spring容器,而是使用官方的BaggagePropagation包装你的自定义传播器,保留原生baggage处理能力:
- 去掉CustomPropagator类上的
@Component注解 - 新增Sleuth配置类,注册包装后的传播工厂:
import brave.baggage.BaggagePropagation import brave.propagation.Propagation import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration @Configuration class SleuthCustomConfig { @Bean fun propagationFactory(): Propagation.Factory { // 你的自定义传播器作为内层委托,只负责链路追踪字段的处理 val delegateFactory = CustomPropagator() // 外层用BaggagePropagation包装,自动处理所有配置的baggage字段 return BaggagePropagation.newFactoryBuilder(delegateFactory).build() } }
步骤3:验证配置有效性
保留你现有的application.properties配置不变,重启服务后测试:
- 入口请求携带
kek请求头时,日志中会正常输出%X{kek}对应的值 - 跨服务调用时,
kek字段会自动被注入到下游请求头中完成传递
内容的提问来源于stack exchange,提问作者Тигран Мартиросян
相关产品推荐
相关产品推荐

