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

Spring Cloud Sleuth 2如何自定义Span注入与提取器?版本冲突求解

Spring Cloud Sleuth 2.x 自定义Span注入与提取器方案

你说得没错,Spring Cloud Sleuth 2.x 确实全面切换到了 Zipkin Brave 作为底层的追踪实现,这也是1.2.x版本的自定义方法失效的核心原因。下面直接给你适配2.x版本的解决方案,以及回退版本冲突的说明:

一、基于Brave API自定义Span注入/提取器

在Sleuth 2.x中,所有Span的传播逻辑都由Brave接管,所以我们需要基于Brave的Injector和Extractor接口来实现自定义:

1. 自定义提取器(Extractor)

提取器负责从请求载体(比如HTTP请求、MQ消息)中解析Trace/Span信息。你可以实现brave.propagation.Extractor接口,然后将其注册为Spring Bean:

import brave.propagation.Extractor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.servlet.http.HttpServletRequest;

@Configuration
public class CustomSleuthConfig {

    // 自定义HTTP请求的Span提取器
    @Bean
    public Extractor<HttpServletRequest> customHttpSpanExtractor() {
        return (request, key) -> {
            // 示例:从自定义Header提取追踪信息,比如前缀为X-My-Trace-*的头
            return request.getHeader("X-My-Trace-" + key);
        };
    }
}

2. 自定义注入器(Injector)

注入器负责将Trace/Span信息写入响应或发送的消息载体中。同样实现brave.propagation.Injector接口并注册为Bean:

import brave.propagation.Injector;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.servlet.http.HttpServletResponse;

@Configuration
public class CustomSleuthConfig {

    // 自定义HTTP响应的Span注入器
    @Bean
    public Injector<HttpServletResponse> customHttpSpanInjector() {
        return (response, key, value) -> {
            // 示例:将追踪信息写入自定义Header
            response.setHeader("X-My-Trace-" + key, value);
        };
    }
}

3. 进阶:自定义传播规则

如果需要完全自定义TraceId/SpanId的传播格式(比如修改默认的X-B3-TraceId等头的命名),还可以自定义Propagation.Factory:

import brave.propagation.Propagation;
import brave.propagation.B3Propagation;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class CustomSleuthConfig {

    @Bean
    public Propagation.Factory customPropagationFactory() {
        // 示例:自定义B3协议的头前缀
        return B3Propagation.newFactoryBuilder()
                .traceIdName("X-My-Trace-Id")
                .spanIdName("X-My-Span-Id")
                .sampledName("X-My-Sampled")
                .build();
    }
}

二、关于回退1.3.3版本的冲突问题

Spring Cloud Sleuth 1.3.3对应的是Spring Boot 1.5.x版本,如果你的项目使用的是Spring Boot 2.x,必然会出现依赖冲突(比如Spring Context、Web等组件的版本不兼容)。除非你愿意将整个项目回退到Boot 1.5生态,否则不建议采用这种方式,适配2.x的Brave方案是更合理的选择。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:40:34