From b52c8c959fb9cba4950f3b4193deebe67404bbd0 Mon Sep 17 00:00:00 2001 From: Yanming Zhou Date: Fri, 27 Jun 2025 17:12:09 +0800 Subject: [PATCH] `GlobalOpenTelemetry.get()` should never returns obfuscated Noop OpenTelemetry Fix inconsistent behavior that first call will return Noop but later calls return obfuscated Noop. Signed-off-by: Yanming Zhou --- .../java/io/opentelemetry/api/GlobalOpenTelemetry.java | 4 ++-- .../api/testing/internal/AbstractOpenTelemetryTest.java | 7 +++++++ .../autoconfigure/AutoConfiguredOpenTelemetrySdkTest.java | 2 +- .../sdk/autoconfigure/DeclarativeConfigurationTest.java | 3 ++- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/api/all/src/main/java/io/opentelemetry/api/GlobalOpenTelemetry.java b/api/all/src/main/java/io/opentelemetry/api/GlobalOpenTelemetry.java index 83e70bf7d8b..5176e848d36 100644 --- a/api/all/src/main/java/io/opentelemetry/api/GlobalOpenTelemetry.java +++ b/api/all/src/main/java/io/opentelemetry/api/GlobalOpenTelemetry.java @@ -72,7 +72,7 @@ private GlobalOpenTelemetry() {} * interface FQCN but the specified provider cannot be found. */ public static OpenTelemetry get() { - OpenTelemetry openTelemetry = globalOpenTelemetry; + ObfuscatedOpenTelemetry openTelemetry = globalOpenTelemetry; if (openTelemetry == null) { synchronized (mutex) { openTelemetry = globalOpenTelemetry; @@ -88,7 +88,7 @@ public static OpenTelemetry get() { } } } - return openTelemetry; + return openTelemetry.delegate == OpenTelemetry.noop() ? OpenTelemetry.noop() : openTelemetry; } /** diff --git a/api/testing-internal/src/main/java/io/opentelemetry/api/testing/internal/AbstractOpenTelemetryTest.java b/api/testing-internal/src/main/java/io/opentelemetry/api/testing/internal/AbstractOpenTelemetryTest.java index 4223d853661..4591b3a5d29 100644 --- a/api/testing-internal/src/main/java/io/opentelemetry/api/testing/internal/AbstractOpenTelemetryTest.java +++ b/api/testing-internal/src/main/java/io/opentelemetry/api/testing/internal/AbstractOpenTelemetryTest.java @@ -115,4 +115,11 @@ void toString_noop_Valid() { + "propagators=DefaultContextPropagators{textMapPropagator=NoopTextMapPropagator}" + "}"); } + + @Test + void neverReturnsObfuscatedNoop() { + assertThat(GlobalOpenTelemetry.get()).isSameAs(OpenTelemetry.noop()); + // ensure sequential calls of GlobalOpenTelemetry.get() return same object + assertThat(GlobalOpenTelemetry.get()).isSameAs(OpenTelemetry.noop()); + } } diff --git a/sdk-extensions/autoconfigure/src/test/java/io/opentelemetry/sdk/autoconfigure/AutoConfiguredOpenTelemetrySdkTest.java b/sdk-extensions/autoconfigure/src/test/java/io/opentelemetry/sdk/autoconfigure/AutoConfiguredOpenTelemetrySdkTest.java index 45d26308320..c9567ce4aa7 100644 --- a/sdk-extensions/autoconfigure/src/test/java/io/opentelemetry/sdk/autoconfigure/AutoConfiguredOpenTelemetrySdkTest.java +++ b/sdk-extensions/autoconfigure/src/test/java/io/opentelemetry/sdk/autoconfigure/AutoConfiguredOpenTelemetrySdkTest.java @@ -372,7 +372,7 @@ void builder_addLoggerProviderCustomizer() { @Test void builder_setResultAsGlobalFalse() { - GlobalOpenTelemetry.set(OpenTelemetry.noop()); + GlobalOpenTelemetry.set(mock(OpenTelemetry.class)); OpenTelemetrySdk openTelemetry = builder.build().getOpenTelemetrySdk(); diff --git a/sdk-extensions/autoconfigure/src/testIncubating/java/io/opentelemetry/sdk/autoconfigure/DeclarativeConfigurationTest.java b/sdk-extensions/autoconfigure/src/testIncubating/java/io/opentelemetry/sdk/autoconfigure/DeclarativeConfigurationTest.java index f92c1027ccd..efc9606a10a 100644 --- a/sdk-extensions/autoconfigure/src/testIncubating/java/io/opentelemetry/sdk/autoconfigure/DeclarativeConfigurationTest.java +++ b/sdk-extensions/autoconfigure/src/testIncubating/java/io/opentelemetry/sdk/autoconfigure/DeclarativeConfigurationTest.java @@ -11,6 +11,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; @@ -161,7 +162,7 @@ void configFile_NoShutdownHook() { @Test void configFile_setResultAsGlobalFalse() { - GlobalOpenTelemetry.set(OpenTelemetry.noop()); + GlobalOpenTelemetry.set(mock(OpenTelemetry.class)); ConfigProperties config = DefaultConfigProperties.createFromMap( Collections.singletonMap("otel.experimental.config.file", configFilePath.toString()));