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

Spring Boot 3 JMS监听器应用中Micrometer Tracing无法正常工作

Spring Boot 3 + Micrometer Tracing JMS监听器无法打印Trace ID/Span ID的解决办法

之前用Sleuth能正常输出Trace ID和Span ID,换成Micrometer Tracing后失效,哪怕自定义EnvironmentPostProcessor强制改日志格式也没用?按以下步骤排查修复:

1. 核对依赖是否正确

确保你的依赖里包含Micrometer Tracing的Brave桥接(默认推荐用Brave实现),以Maven为例:

<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-tracing-bridge-brave</artifactId>
</dependency>
<dependency>
    <groupId>io.zipkin.reporter2</groupId>
    <artifactId>zipkin-reporter-brave</artifactId>
</dependency>

2. 直接配置日志格式,不用EnvironmentPostProcessor

在application.yml或application.properties里直接指定日志输出格式,把%X{traceId}和%X{spanId}加上:

logging:
  pattern:
    console: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg %X{traceId:-} %X{spanId:-}%n"

:-是兜底写法,没有Trace/Span ID时会显示空值,避免日志里留占位符。

3. 确保JMS监听器的Trace上下文能传递

Micrometer Tracing不会自动为所有JMS场景配置上下文传播,分两种情况处理:

用@JmsListener注解的情况

如果你的监听器用了@JmsListener,确保类被Spring扫描到,同时检查application.yml里没禁用追踪:

management:
  tracing:
    enabled: true

Brave桥接会自动拦截JMS消息,把Trace上下文注入到MDC里。

自定义消息容器的情况

如果是手动创建DefaultMessageListenerContainer,要手动绑定Trace上下文到当前线程:

@Configuration
public class JmsTracingConfig {

    @Bean
    public DefaultMessageListenerContainer jmsListenerContainer(ConnectionFactory connectionFactory, Tracer tracer) {
        DefaultMessageListenerContainer container = new DefaultMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        container.setMessageListener(message -> {
            // 绑定Span到当前线程,确保MDC能拿到Trace/Span ID
            try (Tracer.SpanInScope scope = tracer.withSpan(tracer.currentSpan())) {
                // 调用你的监听器逻辑
                yourJmsListener.onMessage(message);
            }
        });
        return container;
    }
}

4. 手动验证MDC内容

在监听器里直接打印MDC里的Trace/Span ID,确认是否真的没注入:

@Component
public class MyJmsListener {
    private static final Logger log = LoggerFactory.getLogger(MyJmsListener.class);

    @JmsListener(destination = "your-queue")
    public void onMessage(String msg) {
        log.info("收到消息: {}, TraceID: {}, SpanID: {}", 
                 msg, 
                 MDC.get("traceId"), 
                 MDC.get("spanId"));
    }
}

常见坑点排查

  • 有没有自定义MDC清理逻辑?别在监听器执行前把MDC清了
  • 检查Brave和Micrometer Tracing的版本兼容性,Spring Boot 3.x配Brave 5.x系列准没错
  • 确认management.tracing.sampling.probability没设成0,否则不会生成Trace/Span ID

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 17:09:53