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

Spring Boot 3.1.3+Micrometer下JMS消息缺失Trace ID求助

Spring Boot 3 + Micrometer:JMS消息收发未自动添加TraceId(对比Spring Boot 2 + Sleuth)

我有两个结构相似的POC项目:一个基于Spring Boot 2.7 + Sleuth,另一个基于Spring Boot 3.1.3 + Micrometer,核心代码完全一致。前者中,使用JmsTemplate发送消息、@JmsListener接收消息时,Receiver的日志会自动带上traceId和spanId;但后者的Receiver日志里完全没有链路追踪信息,看起来Micrometer没有给JMS消息添加traceId。

核心代码如下:

Receiver类

@Component
public class Receiver {

    private static Logger logger = LoggerFactory.getLogger(Receiver.class);

    @JmsListener(destination = "test-queue")
//    @Observed
    public void receive(String s) {
        logger.info("received message: {}", s);
    }
}

Sender类

@RestController
public class Sender {
    private static Logger logger = LoggerFactory.getLogger(Sender.class);

    @Autowired
    JmsTemplate jmsTemplate;

    @GetMapping
    @ResponseStatus(HttpStatus.ACCEPTED)
    public void send() {
        logger.info("sending message...");
        jmsTemplate.convertAndSend("test-queue", "hello");
    }
}

请问是不是Micrometer版本遗漏了什么额外配置?


解决方案

Spring Boot 3里Micrometer Tracing对JMS的支持逻辑和Sleuth不一样,需要补充以下配置:

  • 补全依赖
    除了基础的Micrometer追踪依赖,还要确保引入spring-boot-starter-actuator,完整依赖示例(Maven):

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
        <groupId>io.micrometer</groupId>
        <artifactId>micrometer-tracing</artifactId>
    </dependency>
    <dependency>
        <groupId>io.micrometer</groupId>
        <artifactId>micrometer-tracing-bridge-brave</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jms</artifactId>
    </dependency>
    
  • 启用JMS观测配置
    要么给@JmsListener方法加上@Observed注解(你代码里注释掉了,这是Micrometer追踪JMS方法的必要标记):

    @JmsListener(destination = "test-queue")
    @Observed
    public void receive(String s) {
        logger.info("received message: {}", s);
    }
    

    要么通过全局配置自动启用JMS观测:

    micrometer.observation.jms.enabled=true
    
  • 配置日志输出traceId/spanId
    确保日志格式(比如Logback的logback-spring.xml)包含traceId和spanId的占位符,示例:

    <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} [%X{traceId},%X{spanId}] - %msg%n</pattern>
    

完成上述配置后,Receiver的日志就能正常输出traceId和spanId了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 12:35:12