This code sets up distributed tracing for RabbitMQ message processing in a Spring Boot application using Brave (Zipkin's Java client library). Here's what each part does:
The project includes key dependencies for tracing:
micrometer-tracing-bridge-brave
- Bridges Micrometer tracing with Bravebrave-instrumentation-spring-rabbit
- Provides automatic instrumentation for Spring AMQP/RabbitMQ- Standard Spring Boot starters for web, AMQP, and actuator
The configuration class creates several beans to enable comprehensive RabbitMQ tracing:
MDC Scope Decorator
@Bean
public CurrentTraceContext.ScopeDecorator logScopeDecorator() {
return MDCScopeDecorator.newBuilder().build();
}
This automatically injects trace and span IDs into the Mapped Diagnostic Context (MDC), making them available in log statements. Your logs will automatically include correlation IDs.
SpringRabbitTracing Bean
@Bean
public SpringRabbitTracing springRabbitTracing(Tracing tracing) {
return SpringRabbitTracing.newBuilder(tracing)
.remoteServiceName("rabbitmq")
.build();
}
Creates the main tracing component that will instrument RabbitMQ operations. The remoteServiceName("rabbitmq")
labels the message broker in trace visualizations.
RabbitTemplate Customizer
@Bean
public RabbitTemplateCustomizer tracingRabbitTemplateCustomizer(SpringRabbitTracing springRabbitTracing) {
return rabbitTemplate -> springRabbitTracing.decorateRabbitTemplate(rabbitTemplate);
}
Automatically instruments the RabbitTemplate
for outgoing messages. When you publish messages, this creates spans and propagates trace context.
Listener Container Factory
@Bean
public SimpleRabbitListenerContainerFactory tracingListenerContainerFactory(
SpringRabbitTracing springRabbitTracing,
SimpleRabbitListenerContainerFactory factory) {
springRabbitTracing.decorateSimpleRabbitListenerContainerFactory(factory);
return factory;
}
Instruments the listener container factory for incoming messages. This creates spans for message consumption and extracts trace context from message headers.
With this configuration, you get:
- End-to-end tracing across service boundaries via RabbitMQ
- Automatic span creation for message publishing and consuming
- Trace context propagation through message headers
- Correlation IDs in logs for easier debugging
- Service topology visualization in tools like Zipkin
When a traced request publishes a message to RabbitMQ, the trace context travels with the message, and the consuming service continues the same distributed trace, giving you complete visibility into your message-driven architecture.