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

Spring 3.1.2中单个HTTP请求出现不同TraceId问题求助

单个HTTP请求获取不同TraceId问题排查与配置建议

当前环境与配置信息

  • Spring版本:3.1.2
  • 已添加依赖:implementation 'io.micrometer:micrometer-tracing-bridge-brave'
  • 依赖树:
+--- io.micrometer:micrometer-tracing-bridge-brave -> 1.1.3
|    +--- io.micrometer:micrometer-tracing:1.1.3
|    |    +--- io.micrometer:micrometer-observation:1.11.2 (*)
|    |    +--- io.micrometer:context-propagation:1.0.4
|    |    \--- aopalliance:aopalliance:1.0
|    +--- org.slf4j:slf4j-api:1.7.36 -> 2.0.7
|    +--- io.zipkin.brave:brave:5.14.1 -> 5.15.1
|    +--- io.zipkin.brave:brave-context-slf4j:5.14.1 -> 5.15.1
|    |    \--- io.zipkin.brave:brave:5.15.1
|    +--- io.zipkin.brave:brave-instrumentation-http:5.14.1 -> 5.15.1
|    |    \--- io.zipkin.brave:brave:5.15.1
|    \--- io.zipkin.aws:brave-propagation-aws:0.23.4
|         \--- io.zipkin.brave:brave:5.13.7 -> 5.15.1
  • application.yml配置:
management:
      tracing: # All traces should be sent to latency analysis tool
        sampling:
            probability: 1.0
  • TraceId获取代码:
private final io.micrometer.tracing.Tracer tracer;

return Optional.ofNullable(tracer.currentSpan())
.map(span -> span.context().traceId())
.orElseGet(() -> UUID.randomUUID().toString())
  • 主类配置:
public static void main(String[] args) {
        Hooks.enableAutomaticContextPropagation();
        SpringApplication.run(CalcApiApplication.class, args);
}

问题分析与配置建议

1. 补充上下文传播格式配置

默认情况下Spring Boot 3.x的Micrometer Tracing会使用兼容的传播格式,但明确指定传播类型可以避免格式不匹配导致的TraceId重置。根据你的追踪系统(比如Zipkin常用B3,OpenTelemetry常用W3C),补充以下配置:

management:
  tracing:
    sampling:
      probability: 1.0
    propagation:
      type: B3 # 可根据实际场景替换为W3C

2. 确保异步/线程池的上下文传递

如果请求处理中使用自定义线程池或@Async注解,默认上下文不会自动传递,需做如下处理:

  • 自定义线程池:用ContextExecutorService包装原线程池
import io.micrometer.context.ContextExecutorService;

ExecutorService originalExecutor = Executors.newFixedThreadPool(10);
ExecutorService contextAwareExecutor = ContextExecutorService.wrap(originalExecutor);
  • @Async场景:配置上下文感知的TaskExecutor
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import io.micrometer.context.ContextExecutorService;

@Configuration
public class AsyncConfig {
    @Bean
    public ThreadPoolTaskExecutor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(5);
        executor.setMaxPoolSize(10);
        executor.setQueueCapacity(25);
        executor.initialize();
        return new ThreadPoolTaskExecutor() {
            @Override
            protected ExecutorService initializeExecutor() {
                return ContextExecutorService.wrap(super.initializeExecutor());
            }
        };
    }
}

3. 检查Web拦截器执行顺序

确保Micrometer的TraceWebFilter在自定义拦截器之前执行,避免自定义拦截器提前处理请求导致TraceId未初始化。Micrometer的拦截器默认顺序为Ordered.HIGHEST_PRECEDENCE + 10,自定义拦截器的@Order值应大于该数值。

4. 规范Span的创建与关联

避免手动创建Span时未关联父Span,所有子Span需基于当前请求的根Span创建:

// 正确创建子Span的方式
Span childSpan = tracer.startSpan("sub-operation", tracer.currentSpan().context());
try (Tracer.SpanInScope spanInScope = tracer.withSpan(childSpan)) {
    // 执行子操作逻辑
} finally {
    childSpan.end();
}

5. 验证依赖版本兼容性

确认项目中没有引入冲突版本的Brave或Micrometer组件,可通过gradle dependencies命令排查依赖树,确保所有相关组件版本对齐。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 12:55:26