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

从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 12:38:30