From 49b7aaf6d6ef7b5a05b1c1d5bdaeb08ab69625f1 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Fri, 12 Sep 2025 13:27:54 +0200 Subject: [PATCH 1/5] call auto configure listener with declarative config --- .../AutoConfiguredOpenTelemetrySdkBuilder.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/AutoConfiguredOpenTelemetrySdkBuilder.java b/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/AutoConfiguredOpenTelemetrySdkBuilder.java index 7f1a5678959..8f12d14468e 100644 --- a/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/AutoConfiguredOpenTelemetrySdkBuilder.java +++ b/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/AutoConfiguredOpenTelemetrySdkBuilder.java @@ -451,8 +451,12 @@ private AutoConfiguredOpenTelemetrySdk buildImpl() { ? this.config : DefaultConfigProperties.create(Collections.emptyMap(), componentLoader), componentLoader); + SpiHelper spiHelper = SpiHelper.create(componentLoader); if (fromFileConfiguration != null) { - maybeRegisterShutdownHook(fromFileConfiguration.getOpenTelemetrySdk()); + OpenTelemetrySdk openTelemetrySdk = fromFileConfiguration.getOpenTelemetrySdk(); + maybeRegisterShutdownHook(openTelemetrySdk); + callAutoConfigureListeners(spiHelper, openTelemetrySdk); + Object configProvider = fromFileConfiguration.getConfigProvider(); if (setResultAsGlobal && INCUBATOR_AVAILABLE && configProvider != null) { IncubatingUtil.setGlobalConfigProvider(configProvider); @@ -460,7 +464,6 @@ private AutoConfiguredOpenTelemetrySdk buildImpl() { return fromFileConfiguration; } - SpiHelper spiHelper = SpiHelper.create(componentLoader); if (!customized) { customized = true; mergeSdkTracerProviderConfigurer(); From 93cf436d8a81df8f0319b7f07267e15605b0fd0f Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Tue, 16 Sep 2025 15:53:30 +0200 Subject: [PATCH 2/5] call auto configure listener with declarative config --- ...AutoConfiguredOpenTelemetrySdkBuilder.java | 7 +--- .../DeclarativeConfigurationSpiTest.java | 2 + .../TestDeclarativeConfigurationProvider.java | 3 ++ .../autoconfigure/TestResourceDetector.java | 38 +++++++++++++++++++ ...toconfigure.spi.internal.ComponentProvider | 1 + .../fileconfig/DeclarativeConfiguration.java | 25 ++++++++++-- 6 files changed, 67 insertions(+), 9 deletions(-) create mode 100644 sdk-extensions/autoconfigure/src/testDeclarativeConfigSpi/java/io/opentelemetry/sdk/autoconfigure/TestResourceDetector.java create mode 100644 sdk-extensions/autoconfigure/src/testDeclarativeConfigSpi/resources/META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider diff --git a/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/AutoConfiguredOpenTelemetrySdkBuilder.java b/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/AutoConfiguredOpenTelemetrySdkBuilder.java index 8f12d14468e..7f1a5678959 100644 --- a/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/AutoConfiguredOpenTelemetrySdkBuilder.java +++ b/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/AutoConfiguredOpenTelemetrySdkBuilder.java @@ -451,12 +451,8 @@ private AutoConfiguredOpenTelemetrySdk buildImpl() { ? this.config : DefaultConfigProperties.create(Collections.emptyMap(), componentLoader), componentLoader); - SpiHelper spiHelper = SpiHelper.create(componentLoader); if (fromFileConfiguration != null) { - OpenTelemetrySdk openTelemetrySdk = fromFileConfiguration.getOpenTelemetrySdk(); - maybeRegisterShutdownHook(openTelemetrySdk); - callAutoConfigureListeners(spiHelper, openTelemetrySdk); - + maybeRegisterShutdownHook(fromFileConfiguration.getOpenTelemetrySdk()); Object configProvider = fromFileConfiguration.getConfigProvider(); if (setResultAsGlobal && INCUBATOR_AVAILABLE && configProvider != null) { IncubatingUtil.setGlobalConfigProvider(configProvider); @@ -464,6 +460,7 @@ private AutoConfiguredOpenTelemetrySdk buildImpl() { return fromFileConfiguration; } + SpiHelper spiHelper = SpiHelper.create(componentLoader); if (!customized) { customized = true; mergeSdkTracerProviderConfigurer(); diff --git a/sdk-extensions/autoconfigure/src/testDeclarativeConfigSpi/java/io/opentelemetry/sdk/autoconfigure/DeclarativeConfigurationSpiTest.java b/sdk-extensions/autoconfigure/src/testDeclarativeConfigSpi/java/io/opentelemetry/sdk/autoconfigure/DeclarativeConfigurationSpiTest.java index 72a3eacac25..85e79634b61 100644 --- a/sdk-extensions/autoconfigure/src/testDeclarativeConfigSpi/java/io/opentelemetry/sdk/autoconfigure/DeclarativeConfigurationSpiTest.java +++ b/sdk-extensions/autoconfigure/src/testDeclarativeConfigSpi/java/io/opentelemetry/sdk/autoconfigure/DeclarativeConfigurationSpiTest.java @@ -49,5 +49,7 @@ void configFromSpi() { assertThat(autoConfiguredOpenTelemetrySdk.getOpenTelemetrySdk().toString()) .isEqualTo(expectedSdk.toString()); + + assertThat(TestResourceDetector.initialized).isTrue(); } } diff --git a/sdk-extensions/autoconfigure/src/testDeclarativeConfigSpi/java/io/opentelemetry/sdk/autoconfigure/TestDeclarativeConfigurationProvider.java b/sdk-extensions/autoconfigure/src/testDeclarativeConfigSpi/java/io/opentelemetry/sdk/autoconfigure/TestDeclarativeConfigurationProvider.java index 28a33710394..cc1bb6a240c 100644 --- a/sdk-extensions/autoconfigure/src/testDeclarativeConfigSpi/java/io/opentelemetry/sdk/autoconfigure/TestDeclarativeConfigurationProvider.java +++ b/sdk-extensions/autoconfigure/src/testDeclarativeConfigSpi/java/io/opentelemetry/sdk/autoconfigure/TestDeclarativeConfigurationProvider.java @@ -17,6 +17,9 @@ public OpenTelemetryConfigurationModel getConfigurationModel() { String yaml = "file_format: \"1.0-rc.1\"\n" + "resource:\n" + + " detection/development:\n" + + " detectors:\n" + + " - test:\n" + " attributes:\n" + " - name: service.name\n" + " value: test\n" diff --git a/sdk-extensions/autoconfigure/src/testDeclarativeConfigSpi/java/io/opentelemetry/sdk/autoconfigure/TestResourceDetector.java b/sdk-extensions/autoconfigure/src/testDeclarativeConfigSpi/java/io/opentelemetry/sdk/autoconfigure/TestResourceDetector.java new file mode 100644 index 00000000000..65cdf2df576 --- /dev/null +++ b/sdk-extensions/autoconfigure/src/testDeclarativeConfigSpi/java/io/opentelemetry/sdk/autoconfigure/TestResourceDetector.java @@ -0,0 +1,38 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.sdk.autoconfigure; + +import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; +import io.opentelemetry.sdk.OpenTelemetrySdk; +import io.opentelemetry.sdk.autoconfigure.spi.internal.AutoConfigureListener; +import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider; +import io.opentelemetry.sdk.resources.Resource; + +public class TestResourceDetector implements ComponentProvider, AutoConfigureListener { + + @SuppressWarnings("NonFinalStaticField") + static boolean initialized = false; + + @Override + public void afterAutoConfigure(OpenTelemetrySdk sdk) { + initialized = true; + } + + @Override + public Class getType() { + return Resource.class; + } + + @Override + public String getName() { + return "test"; + } + + @Override + public Resource create(DeclarativeConfigProperties config) { + return Resource.empty(); + } +} diff --git a/sdk-extensions/autoconfigure/src/testDeclarativeConfigSpi/resources/META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider b/sdk-extensions/autoconfigure/src/testDeclarativeConfigSpi/resources/META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider new file mode 100644 index 00000000000..aad133d8acf --- /dev/null +++ b/sdk-extensions/autoconfigure/src/testDeclarativeConfigSpi/resources/META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider @@ -0,0 +1 @@ +io.opentelemetry.sdk.autoconfigure.TestResourceDetector diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfiguration.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfiguration.java index 96ddf9109b4..39cf168935b 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfiguration.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfiguration.java @@ -14,6 +14,7 @@ import io.opentelemetry.common.ComponentLoader; import io.opentelemetry.sdk.OpenTelemetrySdk; import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper; +import io.opentelemetry.sdk.autoconfigure.spi.internal.AutoConfigureListener; import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider; import io.opentelemetry.sdk.extension.incubator.ExtendedOpenTelemetrySdk; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel; @@ -25,6 +26,7 @@ import java.util.Collections; import java.util.Map; import java.util.Objects; +import java.util.logging.Level; import java.util.logging.Logger; import java.util.regex.MatchResult; import java.util.regex.Matcher; @@ -122,10 +124,13 @@ public static ExtendedOpenTelemetrySdk create( provider.customize(builder); } - return createAndMaybeCleanup( - OpenTelemetryConfigurationFactory.getInstance(), - spiHelper, - builder.customizeModel(configurationModel)); + OpenTelemetrySdk sdk = + createAndMaybeCleanup( + OpenTelemetryConfigurationFactory.getInstance(), + spiHelper, + builder.customizeModel(configurationModel)); + callAutoConfigureListeners(spiHelper, sdk); + return sdk; } /** @@ -404,4 +409,16 @@ private StringBuilder envVarSubstitution( return newVal; } } + + private static void callAutoConfigureListeners( + SpiHelper spiHelper, OpenTelemetrySdk openTelemetrySdk) { + for (AutoConfigureListener listener : spiHelper.getListeners()) { + try { + listener.afterAutoConfigure(openTelemetrySdk); + } catch (Throwable throwable) { + logger.log( + Level.WARNING, "Error invoking listener " + listener.getClass().getName(), throwable); + } + } + } } From 48d1e2c93c04511f9aa9b2abea32820c55223ea5 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Fri, 19 Sep 2025 14:53:34 +0200 Subject: [PATCH 3/5] add test --- .../fileconfig/DeclarativeConfiguration.java | 4 ++-- .../DeclarativeConfigurationCreateTest.java | 20 +++++++++++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfiguration.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfiguration.java index 39cf168935b..2e7963fc9fe 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfiguration.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfiguration.java @@ -410,8 +410,8 @@ private StringBuilder envVarSubstitution( } } - private static void callAutoConfigureListeners( - SpiHelper spiHelper, OpenTelemetrySdk openTelemetrySdk) { + // Visible for testing + static void callAutoConfigureListeners(SpiHelper spiHelper, OpenTelemetrySdk openTelemetrySdk) { for (AutoConfigureListener listener : spiHelper.getListeners()) { try { listener.afterAutoConfigure(openTelemetrySdk); diff --git a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfigurationCreateTest.java b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfigurationCreateTest.java index 6c7a01022ba..8ec60d601dd 100644 --- a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfigurationCreateTest.java +++ b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfigurationCreateTest.java @@ -9,6 +9,8 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatCode; import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; import com.linecorp.armeria.testing.junit5.server.SelfSignedCertificateExtension; import io.github.netmikey.logunit.api.LogCapturer; @@ -16,6 +18,7 @@ import io.opentelemetry.common.ComponentLoader; import io.opentelemetry.internal.testing.CleanupExtension; import io.opentelemetry.sdk.extension.incubator.ExtendedOpenTelemetrySdk; +import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SpanProcessorModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.TracerProviderModel; @@ -173,4 +176,21 @@ void create_ModelCustomizer() { + "telemetry.sdk.name=\"opentelemetry\", " + "telemetry.sdk.version=\""); } + + @Test + void callAutoConfigureListeners_exceptionIsCaught() { + SpiHelper spiHelper = mock(SpiHelper.class); + when(spiHelper.getListeners()) + .thenReturn( + Collections.singleton( + sdk -> { + throw new RuntimeException("Test exception from AutoConfigureListener"); + })); + + assertThatCode( + () -> + DeclarativeConfiguration.callAutoConfigureListeners( + spiHelper, OpenTelemetrySdk.builder().build())) + .doesNotThrowAnyException(); + } } From 620ff480d6e7986c10c85717330f90731282e294 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Fri, 19 Sep 2025 14:55:23 +0200 Subject: [PATCH 4/5] add test --- .../fileconfig/DeclarativeConfigurationCreateTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfigurationCreateTest.java b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfigurationCreateTest.java index 8ec60d601dd..b7e4756ce0f 100644 --- a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfigurationCreateTest.java +++ b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfigurationCreateTest.java @@ -17,8 +17,9 @@ import io.opentelemetry.api.incubator.config.DeclarativeConfigException; import io.opentelemetry.common.ComponentLoader; import io.opentelemetry.internal.testing.CleanupExtension; -import io.opentelemetry.sdk.extension.incubator.ExtendedOpenTelemetrySdk; +import io.opentelemetry.sdk.OpenTelemetrySdk; import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper; +import io.opentelemetry.sdk.extension.incubator.ExtendedOpenTelemetrySdk; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SpanProcessorModel; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.TracerProviderModel; From 043c1e21398e06614c2c77a872301c0e9a64f88b Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Fri, 19 Sep 2025 15:09:39 +0200 Subject: [PATCH 5/5] add test --- .../incubator/fileconfig/DeclarativeConfiguration.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfiguration.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfiguration.java index 2e7963fc9fe..77341981103 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfiguration.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfiguration.java @@ -124,7 +124,7 @@ public static ExtendedOpenTelemetrySdk create( provider.customize(builder); } - OpenTelemetrySdk sdk = + ExtendedOpenTelemetrySdk sdk = createAndMaybeCleanup( OpenTelemetryConfigurationFactory.getInstance(), spiHelper,