From d017d5f18aa37328270dcee99099ace36aa3b389 Mon Sep 17 00:00:00 2001 From: Christian Frommeyer Date: Thu, 20 Jan 2022 05:48:49 +0100 Subject: [PATCH] SdkTracerProvider auto closed as separate Context Bean (#5124) (#5125) --- .../OpenTelemetryAutoConfiguration.java | 48 +++++++++++-------- .../OpenTelemetryAutoConfigurationTest.java | 34 ++++++++++--- 2 files changed, 55 insertions(+), 27 deletions(-) diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/OpenTelemetryAutoConfiguration.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/OpenTelemetryAutoConfiguration.java index ca177c14e7..fd7b48db6e 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/OpenTelemetryAutoConfiguration.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/OpenTelemetryAutoConfiguration.java @@ -33,29 +33,37 @@ import org.springframework.context.annotation.Configuration; @EnableConfigurationProperties(SamplerProperties.class) public class OpenTelemetryAutoConfiguration { - @Bean - @ConditionalOnMissingBean - public OpenTelemetry openTelemetry( - SamplerProperties samplerProperties, - ObjectProvider propagatorsProvider, - ObjectProvider> spanExportersProvider) { - SdkTracerProviderBuilder tracerProviderBuilder = SdkTracerProvider.builder(); + @Configuration + @ConditionalOnMissingBean(OpenTelemetry.class) + public static class OpenTelemetryBeanConfig { - spanExportersProvider.getIfAvailable(Collections::emptyList).stream() - // todo SimpleSpanProcessor...is that really what we want here? - .map(SimpleSpanProcessor::create) - .forEach(tracerProviderBuilder::addSpanProcessor); + @Bean(destroyMethod = "close") + @ConditionalOnMissingBean + public SdkTracerProvider sdkTracerProvider( + SamplerProperties samplerProperties, + ObjectProvider> spanExportersProvider) { + SdkTracerProviderBuilder tracerProviderBuilder = SdkTracerProvider.builder(); - SdkTracerProvider tracerProvider = - tracerProviderBuilder - .setSampler(Sampler.traceIdRatioBased(samplerProperties.getProbability())) - .build(); + spanExportersProvider.getIfAvailable(Collections::emptyList).stream() + // todo SimpleSpanProcessor...is that really what we want here? + .map(SimpleSpanProcessor::create) + .forEach(tracerProviderBuilder::addSpanProcessor); - ContextPropagators propagators = propagatorsProvider.getIfAvailable(ContextPropagators::noop); + return tracerProviderBuilder + .setSampler(Sampler.traceIdRatioBased(samplerProperties.getProbability())) + .build(); + } - return OpenTelemetrySdk.builder() - .setTracerProvider(tracerProvider) - .setPropagators(propagators) - .build(); + @Bean + public OpenTelemetry openTelemetry( + ObjectProvider propagatorsProvider, SdkTracerProvider tracerProvider) { + + ContextPropagators propagators = propagatorsProvider.getIfAvailable(ContextPropagators::noop); + + return OpenTelemetrySdk.builder() + .setTracerProvider(tracerProvider) + .setPropagators(propagators) + .build(); + } } } diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/OpenTelemetryAutoConfigurationTest.java b/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/OpenTelemetryAutoConfigurationTest.java index 2dd8fccfcd..c767171708 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/OpenTelemetryAutoConfigurationTest.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/OpenTelemetryAutoConfigurationTest.java @@ -9,6 +9,7 @@ import static org.assertj.core.api.Assertions.assertThat; import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.sdk.trace.SdkTracerProvider; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -37,23 +38,42 @@ class OpenTelemetryAutoConfigurationTest { @Test @DisplayName( "when Application Context contains OpenTelemetry bean should NOT initialize openTelemetry") - void customTracer() { + void customOpenTelemetry() { this.contextRunner .withUserConfiguration(CustomTracerConfiguration.class) .withConfiguration(AutoConfigurations.of(OpenTelemetryAutoConfiguration.class)) .run( - context -> { - assertThat(context.containsBean("customOpenTelemetry")).isTrue(); - assertThat(context.containsBean("openTelemetry")).isFalse(); - }); + context -> + assertThat(context) + .hasBean("customOpenTelemetry") + .doesNotHaveBean("openTelemetry") + .doesNotHaveBean("sdkTracerProvider")); } @Test @DisplayName( "when Application Context DOES NOT contain OpenTelemetry bean should initialize openTelemetry") - void initializeTracer() { + void initializeTracerProviderAndOpenTelemetry() { this.contextRunner .withConfiguration(AutoConfigurations.of(OpenTelemetryAutoConfiguration.class)) - .run(context -> assertThat(context.containsBean("openTelemetry")).isTrue()); + .run(context -> assertThat(context).hasBean("openTelemetry").hasBean("sdkTracerProvider")); + } + + @Test + @DisplayName( + "when Application Context DOES NOT contain OpenTelemetry bean but TracerProvider should initialize openTelemetry") + void initializeOpenTelemetry() { + this.contextRunner + .withBean( + "customTracerProvider", + SdkTracerProvider.class, + () -> SdkTracerProvider.builder().build()) + .withConfiguration(AutoConfigurations.of(OpenTelemetryAutoConfiguration.class)) + .run( + context -> + assertThat(context) + .hasBean("openTelemetry") + .hasBean("customTracerProvider") + .doesNotHaveBean("sdkTracerProvider")); } }