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

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处理能力:

  1. 去掉CustomPropagator类上的@Component注解
  2. 新增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,提问作者Тигран Мартиросян

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 16:09:05