从Spring Boot2/Sleuth/Zipkin迁移至Spring Boot3/Micrometer:DefaultMessageSpanCustomizer等效方案
等效机制与实现方案
在Spring Boot 3 + Micrometer Tracing + Spring Cloud 2022.0.1的技术栈中,原Spring Cloud Sleuth的DefaultMessageSpanCustomizer功能可以通过以下两种核心方式替代:
1. 实现MessageSpanCustomizer接口(推荐)
Micrometer Tracing提供了io.micrometer.tracing.MessageSpanCustomizer接口(若使用Zipkin默认搭配的Brave作为Tracer实现,可对应使用BraveMessageSpanCustomizer),用于定制与消息绑定的Span。
你可以创建自定义实现类,重写customize方法(对应原customizeHandle逻辑),从消息头提取信息并添加为Span标签:
import io.micrometer.tracing.MessageSpanCustomizer; import io.micrometer.tracing.SpanCustomizer; import org.springframework.messaging.Message; import org.springframework.stereotype.Component; @Component public class CustomMessageSpanCustomizer implements MessageSpanCustomizer { @Override public void customize(Message<?> message, SpanCustomizer spanCustomizer) { // 从消息头提取自定义字段,添加为Span标签 String customHeaderValue = message.getHeaders().get("X-Custom-Tag", String.class); if (customHeaderValue != null) { spanCustomizer.tag("custom.tag", customHeaderValue); } // 可添加更多自定义标签逻辑 } }
该Bean会被Spring Cloud自动发现并应用到所有消息处理的Span中,包括出站消息场景。
2. 自定义ChannelInterceptor针对出站消息
如果需要更细粒度的控制(比如仅针对特定出站通道),可以实现ChannelInterceptor,在消息发送前获取当前Span并添加标签:
import io.micrometer.tracing.Span; import io.micrometer.tracing.Tracer; import org.springframework.messaging.Message; import org.springframework.messaging.MessageChannel; import org.springframework.messaging.support.ChannelInterceptor; import org.springframework.stereotype.Component; @Component public class OutboundMessageSpanInterceptor implements ChannelInterceptor { private final Tracer tracer; public OutboundMessageSpanInterceptor(Tracer tracer) { this.tracer = tracer; } @Override public Message<?> preSend(Message<?> message, MessageChannel channel) { Span currentSpan = tracer.currentSpan(); if (currentSpan != null) { // 提取消息头信息添加标签 String customValue = message.getHeaders().get("X-Outbound-Tag", String.class); if (customValue != null) { currentSpan.tag("outbound.custom.tag", customValue); } } return message; } }
随后将该拦截器注册到目标出站通道:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.messaging.support.ChannelInterceptor; import org.springframework.messaging.support.DirectChannel; @Configuration public class MessagingConfig { @Bean public ChannelInterceptor outboundMessageSpanInterceptor(Tracer tracer) { return new OutboundMessageSpanInterceptor(tracer); } @Bean public DirectChannel outboundChannel(ChannelInterceptor outboundMessageSpanInterceptor) { DirectChannel channel = new DirectChannel(); channel.addInterceptor(outboundMessageSpanInterceptor); return channel; } }
关键说明
- 原Sleuth的
DefaultMessageSpanCustomizer核心逻辑是绑定消息与Span并添加自定义标签,上述两种方案完全覆盖该能力。 - 若使用Brave(Zipkin默认依赖),
MessageSpanCustomizer的默认实现为BraveMessageSpanCustomizer,自定义实现会自动补充或覆盖默认逻辑。 - 确保项目引入
spring-cloud-starter-zipkin和micrometer-tracing-bridge-brave依赖,这些依赖会自动配置所需的Tracer和Span相关Bean。
内容的提问来源于stack exchange,提问作者wabrit
相关产品推荐
相关产品推荐

