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
相关产品推荐
相关产品推荐

