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

Spring Boot 3.x是否内置Azure Service Bus消息生产/消费链路追踪支持?

Spring Boot 3.x 中 Azure Service Bus 的 Micrometer Tracing/OTEL 链路追踪支持

Spring Boot 3.x 本身没有内置针对 Azure Service Bus 生产者/消费者的 Micrometer Tracing/OTEL 链路追踪一键集成,Azure Service Bus 的 Spring 绑定器也暂未提供类似 RabbitMQ 的观测开关配置。但可以通过手动配置实现完整的链路追踪能力:

实现步骤

1. 确保依赖正确

引入必要的依赖(以 Maven 为例):

<!-- Azure Service Bus Starter -->
<dependency>
    <groupId>com.azure.spring</groupId>
    <artifactId>spring-cloud-azure-starter-servicebus</artifactId>
    <version>4.12.0</version> <!-- 适配 Spring Boot 3.x 的版本 -->
</dependency>
<!-- Micrometer Tracing with OTEL -->
<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-tracing-bridge-otel</artifactId>
</dependency>
<dependency>
    <groupId>io.opentelemetry</groupId>
    <artifactId>opentelemetry-exporter-otlp</artifactId>
</dependency>

2. 生产者端追踪配置

自定义 ServiceBusSenderAsyncClient,在发送消息时注入 OTEL 追踪上下文到消息属性:

@Configuration
public class ServiceBusTracingConfig {
    private final Tracer tracer;

    public ServiceBusTracingConfig(Tracer tracer) {
        this.tracer = tracer;
    }

    @Bean
    public ServiceBusSenderAsyncClient serviceBusSenderAsyncClient(ServiceBusClientBuilder serviceBusClientBuilder) {
        return serviceBusClientBuilder.sender()
                .queueName("your-queue-name")
                .buildAsyncClient();
    }

    // 封装发送方法,注入追踪上下文
    @Bean
    public MessageSender messageSender(ServiceBusSenderAsyncClient sender) {
        return message -> {
            Span span = tracer.startSpan("azure-servicebus-send");
            try (Tracer.SpanInScope scope = tracer.withSpan(span)) {
                // 标记链路元数据
                span.tag("messaging.system", "azure-servicebus");
                span.tag("messaging.destination", "your-queue-name");
                span.tag("messaging.operation", "send");

                // 将追踪上下文注入消息属性
                ServiceBusMessage serviceBusMessage = new ServiceBusMessage(message);
                String traceId = tracer.currentSpan().context().traceId();
                String spanId = tracer.currentSpan().context().spanId();
                serviceBusMessage.addProperty("traceparent", String.format("%s-%s-1", traceId, spanId));
                
                sender.sendMessage(serviceBusMessage).block();
            } finally {
                span.end();
            }
        };
    }

    @FunctionalInterface
    public interface MessageSender {
        void send(String message);
    }
}

3. 消费者端追踪配置

使用 @ServiceBusListener 时,从消息属性中提取追踪上下文并启动 Span:

@Component
public class ServiceBusMessageListener {
    private final Tracer tracer;

    public ServiceBusMessageListener(Tracer tracer) {
        this.tracer = tracer;
    }

    @ServiceBusListener(queueName = "your-queue-name")
    public void handleMessage(ServiceBusReceivedMessage message) {
        // 从消息属性中提取traceparent
        String traceparent = message.getProperties().get("traceparent").toString();
        String[] parts = traceparent.split("-");
        
        // 构建追踪上下文,串联链路
        TraceContext traceContext = TraceContext.newBuilder()
                .traceId(TraceId.fromString(parts[0]))
                .spanId(SpanId.fromString(parts[1]))
                .build();

        Span span = tracer.startSpan("azure-servicebus-receive", traceContext);
        try (Tracer.SpanInScope scope = tracer.withSpan(span)) {
            // 标记链路元数据
            span.tag("messaging.system", "azure-servicebus");
            span.tag("messaging.destination", "your-queue-name");
            span.tag("messaging.operation", "receive");

            // 处理消息逻辑
            System.out.println("Received message: " + message.getBody().toString());
        } finally {
            span.end();
        }
    }
}

4. 基础观测配置

在 application.yml 中启用追踪:

spring:
  application:
    name: your-app-name
management:
  tracing:
    enabled: true
    sampling:
      probability: 1.0

注意事项

  • 版本匹配:确保 Azure Spring Cloud Starter 版本(4.x 系列)与 Spring Boot 3.x 兼容,避免依赖冲突
  • 规范遵循:手动注入的追踪头需符合 OTEL 规范,确保上下游链路能正确串联
  • 后续更新:Azure 可能会在后续版本中添加自动集成支持,可关注官方版本迭代

内容的提问来源于stack exchange,提问作者Tyler Van Gorder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 05:12:43