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

如何在Spring Boot 3.4中替换ZipkinSpanExporter为自定义实现

问题:Spring Boot 3.4 自定义替换ZipkinSpanExporter实现

环境与配置

  • 基于Spring Boot 3.4的应用
  • application.properties配置:
management.tracing.sampling.probability=1
management.zipkin.tracing.export.enabled=false
  • 项目依赖:
// 桥接Micrometer Observation API到OpenTelemetry
implementation("io.micrometer:micrometer-tracing-bridge-otel")
// 上报追踪数据到Zipkin
implementation("io.opentelemetry:opentelemetry-exporter-zipkin")

问题场景

默认的ZipkinSpanExporter由以下自动配置类创建,但我需要替换为自定义实现:

@Configuration(proxyBeanMethods = false)
@ConditionalOnClass({ ZipkinSpanExporter.class, Span.class })
static class OpenTelemetryConfiguration {

    @Bean
    @ConditionalOnMissingBean(value = Span.class, parameterizedContainer = BytesEncoder.class)
    BytesEncoder<Span> spanBytesEncoder(Encoding encoding) {
        return SpanBytesEncoder.forEncoding(encoding);
    }

    @Bean
    @ConditionalOnMissingBean
    @ConditionalOnBean(BytesMessageSender.class)
    @ConditionalOnEnabledTracing("zipkin")
    ZipkinSpanExporter zipkinSpanExporter(BytesMessageSender sender, BytesEncoder<Span> spanBytesEncoder) {
        return ZipkinSpanExporter.builder().setSender(sender).setEncoder(spanBytesEncoder).build();
    }

}

我追踪了上报器的选择逻辑,对应核心代码如下:

package org.springframework.boot.actuate.autoconfigure.tracing;

/**
 * {@link SpringBootCondition} to check whether tracing is enabled.
 *
 * @author Moritz Halbritter
 * @see ConditionalOnEnabledTracing
 */
class OnEnabledTracingCondition extends SpringBootCondition {

    private static final String GLOBAL_PROPERTY = "management.tracing.enabled";

    private static final String EXPORTER_PROPERTY = "management.%s.tracing.export.enabled";

    @Override
    public ConditionOutcome getMatchOutcome(ConditionContext context, AnnotatedTypeMetadata metadata) {
        String tracingExporter = getExporterName(metadata);
        // 省略其他逻辑
      }
      
      private static String getExporterName(AnnotatedTypeMetadata metadata) {
         Map<String, Object> attributes = 
         metadata.getAnnotationAttributes(ConditionalOnEnabledTracing.class.getName());
         if (attributes == null) {
             return null;
         }
         return (String) attributes.get("value");
      }
}

调试时发现tracingExporter为空字符串,现提出以下疑问:

  1. 如何覆盖默认的ZipkinSpanExporter实现?
  2. 是否可以通过application.properties配置来实现替换?

内容的提问来源于stack exchange,提问作者gstackoverflow

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 23:52:40