Skip to content

Commit cdf8d2e

Browse files
committed
Back off on Propagator in Brave and Otel auto-configurations
This also fixes the bug that both auto-configurations couldn't be used together. Closes gh-49183
1 parent 6f30303 commit cdf8d2e

File tree

5 files changed

+66
-4
lines changed

5 files changed

+66
-4
lines changed

module/spring-boot-micrometer-tracing-brave/src/main/java/org/springframework/boot/micrometer/tracing/brave/autoconfigure/BraveAutoConfiguration.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
import io.micrometer.tracing.exporter.SpanExportingPredicate;
4040
import io.micrometer.tracing.exporter.SpanFilter;
4141
import io.micrometer.tracing.exporter.SpanReporter;
42+
import io.micrometer.tracing.propagation.Propagator;
4243

4344
import org.springframework.beans.factory.ObjectProvider;
4445
import org.springframework.boot.autoconfigure.AutoConfiguration;
@@ -166,7 +167,7 @@ BraveTracer braveTracerBridge(brave.Tracer tracer, CurrentTraceContext currentTr
166167
}
167168

168169
@Bean
169-
@ConditionalOnMissingBean
170+
@ConditionalOnMissingBean(Propagator.class)
170171
BravePropagator bravePropagator(Tracing tracing) {
171172
return new BravePropagator(tracing);
172173
}

module/spring-boot-micrometer-tracing-brave/src/test/java/org/springframework/boot/micrometer/tracing/brave/autoconfigure/BraveAutoConfigurationTests.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,15 @@
3939
import io.micrometer.observation.Observation.Scope;
4040
import io.micrometer.observation.ObservationRegistry;
4141
import io.micrometer.tracing.brave.bridge.BraveBaggageManager;
42+
import io.micrometer.tracing.brave.bridge.BravePropagator;
4243
import io.micrometer.tracing.brave.bridge.BraveSpanCustomizer;
4344
import io.micrometer.tracing.brave.bridge.BraveTracer;
4445
import io.micrometer.tracing.brave.bridge.CompositeSpanHandler;
4546
import io.micrometer.tracing.brave.bridge.W3CPropagation;
4647
import io.micrometer.tracing.exporter.SpanExportingPredicate;
4748
import io.micrometer.tracing.exporter.SpanFilter;
4849
import io.micrometer.tracing.exporter.SpanReporter;
50+
import io.micrometer.tracing.propagation.Propagator;
4951
import org.assertj.core.api.InstanceOfAssertFactories;
5052
import org.junit.jupiter.api.Test;
5153

@@ -126,6 +128,15 @@ void shouldSupplyMicrometerBeans() {
126128
this.contextRunner.run((context) -> assertThat(context).hasSingleBean(BraveTracer.class));
127129
}
128130

131+
@Test
132+
void shouldNotSupplyBravePropagatorWhenPropagatorBeanIsPresent() {
133+
this.contextRunner.withUserConfiguration(PropagatorConfiguration.class).run((context) -> {
134+
assertThat(context).hasSingleBean(Propagator.class);
135+
assertThat(context).hasBean("customPropagator");
136+
assertThat(context).doesNotHaveBean(BravePropagator.class);
137+
});
138+
}
139+
129140
@Test
130141
void shouldNotSupplyBeansIfBraveIsMissing() {
131142
this.contextRunner.withClassLoader(new FilteredClassLoader("brave"))
@@ -535,4 +546,14 @@ io.micrometer.tracing.SpanCustomizer customMicrometerSpanCustomizer() {
535546

536547
}
537548

549+
@Configuration(proxyBeanMethods = false)
550+
static class PropagatorConfiguration {
551+
552+
@Bean
553+
Propagator customPropagator() {
554+
return mock(Propagator.class);
555+
}
556+
557+
}
558+
538559
}

module/spring-boot-micrometer-tracing-opentelemetry/build.gradle

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,9 @@ dependencies {
4949
dockerTestImplementation("org.testcontainers:testcontainers-junit-jupiter")
5050

5151
testImplementation(project(":core:spring-boot-test"))
52+
testImplementation(project(":module:spring-boot-micrometer-tracing-brave"))
5253
testImplementation(project(":test-support:spring-boot-test-support"))
54+
testImplementation("io.micrometer:micrometer-tracing-bridge-brave")
5355
testImplementation("com.squareup.okhttp3:mockwebserver")
5456
testImplementation("io.micrometer:micrometer-registry-prometheus")
5557
testImplementation("io.opentelemetry:opentelemetry-exporter-common")

module/spring-boot-micrometer-tracing-opentelemetry/src/main/java/org/springframework/boot/micrometer/tracing/opentelemetry/autoconfigure/OpenTelemetryTracingAutoConfiguration.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import io.micrometer.tracing.otel.bridge.OtelTracer;
3232
import io.micrometer.tracing.otel.bridge.OtelTracer.EventPublisher;
3333
import io.micrometer.tracing.otel.bridge.Slf4JEventListener;
34+
import io.micrometer.tracing.propagation.Propagator;
3435
import io.opentelemetry.api.OpenTelemetry;
3536
import io.opentelemetry.api.metrics.MeterProvider;
3637
import io.opentelemetry.api.trace.Tracer;
@@ -164,7 +165,7 @@ OtelTracer micrometerOtelTracer(Tracer tracer, EventPublisher eventPublisher,
164165
}
165166

166167
@Bean
167-
@ConditionalOnMissingBean
168+
@ConditionalOnMissingBean(Propagator.class)
168169
OtelPropagator otelPropagator(ContextPropagators contextPropagators, Tracer tracer) {
169170
return new OtelPropagator(contextPropagators, tracer);
170171
}

module/spring-boot-micrometer-tracing-opentelemetry/src/test/java/org/springframework/boot/micrometer/tracing/opentelemetry/autoconfigure/OpenTelemetryTracingAutoConfigurationTests.java

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727

2828
import io.micrometer.tracing.SpanCustomizer;
2929
import io.micrometer.tracing.Tracer.SpanInScope;
30+
import io.micrometer.tracing.handler.PropagatingReceiverTracingObservationHandler;
31+
import io.micrometer.tracing.handler.PropagatingSenderTracingObservationHandler;
3032
import io.micrometer.tracing.otel.bridge.EventListener;
3133
import io.micrometer.tracing.otel.bridge.OtelCurrentTraceContext;
3234
import io.micrometer.tracing.otel.bridge.OtelPropagator;
@@ -36,6 +38,7 @@
3638
import io.micrometer.tracing.otel.bridge.Slf4JBaggageEventListener;
3739
import io.micrometer.tracing.otel.bridge.Slf4JEventListener;
3840
import io.micrometer.tracing.otel.propagation.BaggageTextMapPropagator;
41+
import io.micrometer.tracing.propagation.Propagator;
3942
import io.opentelemetry.api.common.AttributeKey;
4043
import io.opentelemetry.api.common.Attributes;
4144
import io.opentelemetry.api.metrics.MeterProvider;
@@ -63,6 +66,8 @@
6366
import org.springframework.boot.autoconfigure.AutoConfigurations;
6467
import org.springframework.boot.micrometer.observation.autoconfigure.ObservationAutoConfiguration;
6568
import org.springframework.boot.micrometer.tracing.autoconfigure.MicrometerTracingAutoConfiguration;
69+
import org.springframework.boot.micrometer.tracing.brave.autoconfigure.BraveAutoConfiguration;
70+
import org.springframework.boot.opentelemetry.autoconfigure.OpenTelemetrySdkAutoConfiguration;
6671
import org.springframework.boot.test.context.FilteredClassLoader;
6772
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
6873
import org.springframework.boot.testsupport.classpath.ForkedClassPath;
@@ -89,8 +94,7 @@
8994
class OpenTelemetryTracingAutoConfigurationTests {
9095

9196
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
92-
.withConfiguration(AutoConfigurations.of(
93-
org.springframework.boot.opentelemetry.autoconfigure.OpenTelemetrySdkAutoConfiguration.class,
97+
.withConfiguration(AutoConfigurations.of(OpenTelemetrySdkAutoConfiguration.class,
9498
OpenTelemetryTracingAutoConfiguration.class));
9599

96100
@Test
@@ -179,6 +183,29 @@ void shouldBackOffOnCustomBeans() {
179183
});
180184
}
181185

186+
@Test
187+
void shouldNotSupplyOtelPropagatorWhenPropagatorBeanIsPresent() {
188+
this.contextRunner.withUserConfiguration(PropagatorConfiguration.class).run((context) -> {
189+
assertThat(context).hasSingleBean(Propagator.class);
190+
assertThat(context).hasBean("customPropagator");
191+
assertThat(context).doesNotHaveBean(OtelPropagator.class);
192+
});
193+
}
194+
195+
@Test
196+
void shouldWorkWithBraveAutoConfigurationWhenBothConfigurationsAreOnClasspath() {
197+
new ApplicationContextRunner()
198+
.withConfiguration(AutoConfigurations.of(OpenTelemetrySdkAutoConfiguration.class,
199+
OpenTelemetryTracingAutoConfiguration.class, BraveAutoConfiguration.class,
200+
ObservationAutoConfiguration.class, MicrometerTracingAutoConfiguration.class))
201+
.run((context) -> {
202+
assertThat(context).hasSingleBean(io.micrometer.tracing.Tracer.class);
203+
assertThat(context).hasSingleBean(Propagator.class);
204+
assertThat(context).hasSingleBean(PropagatingSenderTracingObservationHandler.class);
205+
assertThat(context).hasSingleBean(PropagatingReceiverTracingObservationHandler.class);
206+
});
207+
}
208+
182209
@Test
183210
void shouldSetupDefaultResourceAttributes() {
184211
this.contextRunner
@@ -518,6 +545,16 @@ SpanCustomizer customSpanCustomizer() {
518545

519546
}
520547

548+
@Configuration(proxyBeanMethods = false)
549+
static class PropagatorConfiguration {
550+
551+
@Bean
552+
Propagator customPropagator() {
553+
return mock(Propagator.class);
554+
}
555+
556+
}
557+
521558
@Configuration(proxyBeanMethods = false)
522559
private static final class SdkTracerProviderCustomizationConfiguration {
523560

0 commit comments

Comments
 (0)