如何在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为空字符串,现提出以下疑问:
- 如何覆盖默认的
ZipkinSpanExporter实现? - 是否可以通过
application.properties配置来实现替换?
内容的提问来源于stack exchange,提问作者gstackoverflow
相关产品推荐
相关产品推荐

