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
?
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