diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/BraveAutoConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/BraveAutoConfiguration.java index c234c8974f..28ff465313 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/BraveAutoConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/BraveAutoConfiguration.java @@ -19,6 +19,8 @@ package org.springframework.boot.actuate.autoconfigure.tracing; import java.util.Collections; import java.util.List; +import brave.CurrentSpanCustomizer; +import brave.SpanCustomizer; import brave.Tracer; import brave.Tracing; import brave.Tracing.Builder; @@ -52,6 +54,7 @@ import io.micrometer.tracing.brave.bridge.BraveCurrentTraceContext; import io.micrometer.tracing.brave.bridge.BraveHttpClientHandler; import io.micrometer.tracing.brave.bridge.BraveHttpServerHandler; import io.micrometer.tracing.brave.bridge.BravePropagator; +import io.micrometer.tracing.brave.bridge.BraveSpanCustomizer; import io.micrometer.tracing.brave.bridge.BraveTracer; import io.micrometer.tracing.brave.bridge.CompositeSpanHandler; import io.micrometer.tracing.brave.bridge.W3CPropagation; @@ -185,6 +188,18 @@ public class BraveAutoConfiguration { return new BraveHttpClientHandler(httpClientHandler); } + @Bean + @ConditionalOnMissingBean(SpanCustomizer.class) + CurrentSpanCustomizer currentSpanCustomizer(Tracing tracing) { + return CurrentSpanCustomizer.create(tracing); + } + + @Bean + @ConditionalOnMissingBean(io.micrometer.tracing.SpanCustomizer.class) + BraveSpanCustomizer braveSpanCustomizer(SpanCustomizer spanCustomizer) { + return new BraveSpanCustomizer(spanCustomizer); + } + @Configuration(proxyBeanMethods = false) @ConditionalOnProperty(value = "management.tracing.baggage.enabled", havingValue = "false") static class BraveNoBaggageConfiguration { diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/OpenTelemetryAutoConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/OpenTelemetryAutoConfiguration.java index 1f2173c7cd..5bf0e04976 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/OpenTelemetryAutoConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/OpenTelemetryAutoConfiguration.java @@ -21,6 +21,7 @@ import java.util.List; import java.util.regex.Pattern; import io.micrometer.tracing.SamplerFunction; +import io.micrometer.tracing.SpanCustomizer; import io.micrometer.tracing.otel.bridge.DefaultHttpClientAttributesGetter; import io.micrometer.tracing.otel.bridge.DefaultHttpServerAttributesExtractor; import io.micrometer.tracing.otel.bridge.EventListener; @@ -30,6 +31,7 @@ import io.micrometer.tracing.otel.bridge.OtelCurrentTraceContext; import io.micrometer.tracing.otel.bridge.OtelHttpClientHandler; import io.micrometer.tracing.otel.bridge.OtelHttpServerHandler; import io.micrometer.tracing.otel.bridge.OtelPropagator; +import io.micrometer.tracing.otel.bridge.OtelSpanCustomizer; import io.micrometer.tracing.otel.bridge.OtelTracer; import io.micrometer.tracing.otel.bridge.OtelTracer.EventPublisher; import io.micrometer.tracing.otel.bridge.Slf4JBaggageEventListener; @@ -182,6 +184,12 @@ public class OpenTelemetryAutoConfiguration { return new Slf4JEventListener(); } + @Bean + @ConditionalOnMissingBean(SpanCustomizer.class) + OtelSpanCustomizer otelSpanCustomizer() { + return new OtelSpanCustomizer(); + } + @Configuration(proxyBeanMethods = false) @ConditionalOnProperty(prefix = "management.tracing.baggage", name = "enabled", matchIfMissing = true) static class BaggageConfiguration { diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/tracing/BraveAutoConfigurationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/tracing/BraveAutoConfigurationTests.java index e437f801db..1c1558ddef 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/tracing/BraveAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/tracing/BraveAutoConfigurationTests.java @@ -19,6 +19,7 @@ package org.springframework.boot.actuate.autoconfigure.tracing; import java.util.Collections; import brave.Span; +import brave.SpanCustomizer; import brave.Tracer; import brave.Tracing; import brave.baggage.BaggagePropagation; @@ -39,6 +40,7 @@ import brave.sampler.Sampler; import io.micrometer.tracing.brave.bridge.BraveBaggageManager; import io.micrometer.tracing.brave.bridge.BraveHttpClientHandler; import io.micrometer.tracing.brave.bridge.BraveHttpServerHandler; +import io.micrometer.tracing.brave.bridge.BraveSpanCustomizer; import io.micrometer.tracing.brave.bridge.BraveTracer; import io.micrometer.tracing.brave.bridge.CompositeSpanHandler; import io.micrometer.tracing.brave.bridge.W3CPropagation; @@ -91,6 +93,8 @@ class BraveAutoConfigurationTests { assertThat(context).hasSingleBean(BraveHttpServerHandler.class); assertThat(context).hasSingleBean(BraveHttpClientHandler.class); assertThat(context).hasSingleBean(CompositeSpanHandler.class); + assertThat(context).hasSingleBean(SpanCustomizer.class); + assertThat(context).hasSingleBean(BraveSpanCustomizer.class); }); } @@ -127,6 +131,10 @@ class BraveAutoConfigurationTests { assertThat(context).hasSingleBean(HttpClientHandler.class); assertThat(context).hasBean("customCompositeSpanHandler"); assertThat(context).hasSingleBean(CompositeSpanHandler.class); + assertThat(context).hasBean("customSpanCustomizer"); + assertThat(context).hasSingleBean(SpanCustomizer.class); + assertThat(context).hasBean("customMicrometerSpanCustomizer"); + assertThat(context).hasSingleBean(io.micrometer.tracing.SpanCustomizer.class); }); } @@ -421,6 +429,16 @@ class BraveAutoConfigurationTests { return new CompositeSpanHandler(Collections.emptyList(), Collections.emptyList(), Collections.emptyList()); } + @Bean + SpanCustomizer customSpanCustomizer() { + return mock(SpanCustomizer.class); + } + + @Bean + io.micrometer.tracing.SpanCustomizer customMicrometerSpanCustomizer() { + return mock(io.micrometer.tracing.SpanCustomizer.class); + } + } } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/tracing/OpenTelemetryAutoConfigurationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/tracing/OpenTelemetryAutoConfigurationTests.java index 5e49894523..bfe7921c19 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/tracing/OpenTelemetryAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/tracing/OpenTelemetryAutoConfigurationTests.java @@ -19,10 +19,12 @@ package org.springframework.boot.actuate.autoconfigure.tracing; import java.util.Collection; import java.util.List; +import io.micrometer.tracing.SpanCustomizer; import io.micrometer.tracing.otel.bridge.OtelCurrentTraceContext; import io.micrometer.tracing.otel.bridge.OtelHttpClientHandler; import io.micrometer.tracing.otel.bridge.OtelHttpServerHandler; import io.micrometer.tracing.otel.bridge.OtelPropagator; +import io.micrometer.tracing.otel.bridge.OtelSpanCustomizer; import io.micrometer.tracing.otel.bridge.OtelTracer; import io.micrometer.tracing.otel.bridge.OtelTracer.EventPublisher; import io.micrometer.tracing.otel.bridge.Slf4JBaggageEventListener; @@ -78,6 +80,7 @@ class OpenTelemetryAutoConfigurationTests { assertThat(context).hasSingleBean(SpanProcessor.class); assertThat(context).hasSingleBean(OtelPropagator.class); assertThat(context).hasSingleBean(TextMapPropagator.class); + assertThat(context).hasSingleBean(OtelSpanCustomizer.class); }); } @@ -100,6 +103,7 @@ class OpenTelemetryAutoConfigurationTests { assertThat(context).doesNotHaveBean(SpanProcessor.class); assertThat(context).doesNotHaveBean(OtelPropagator.class); assertThat(context).doesNotHaveBean(TextMapPropagator.class); + assertThat(context).doesNotHaveBean(OtelSpanCustomizer.class); }); } @@ -132,6 +136,8 @@ class OpenTelemetryAutoConfigurationTests { assertThat(context).hasSingleBean(Slf4JBaggageEventListener.class); assertThat(context).hasBean("customOtelPropagator"); assertThat(context).hasSingleBean(OtelPropagator.class); + assertThat(context).hasBean("customSpanCustomizer"); + assertThat(context).hasSingleBean(SpanCustomizer.class); }); } @@ -275,6 +281,11 @@ class OpenTelemetryAutoConfigurationTests { return mock(TextMapPropagator.class); } + @Bean + SpanCustomizer customSpanCustomizer() { + return mock(SpanCustomizer.class); + } + } }