spring-boottracemicrometerzipkinmicrometer-oltp

How to replace ZipkinSpanExporter to my Own in spring boot application?


I have an application based on spring boot 3.4

I have application.properties with lines:

management.tracing.sampling.probability=1
management.zipkin.tracing.export.enabled=false

and dependencies:

// bridges the Micrometer Observation API to OpenTelemetry.
implementation("io.micrometer:micrometer-tracing-bridge-otel")
// reports traces to Zipkin.
implementation("io.opentelemetry:opentelemetry-exporter-zipkin")

I see that following configuration responsible for reporter creation but I want to replace it with my own implementation.

@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();
    }

}

As far I understand reporter is chosen here:

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");
      }

I am lost here. In debug I see that tracingExporter is empty string

How can I override it? is it possible to provide configuration via application.properties ?


Solution

  • It was enough just to register bean:

        @Bean
        fun mySpanExporter(): MySpanExporter {
            return MySpanExporter()
        }
    

    in the class marked with: @Configuration

    All other magic was done by springboot