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..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 @@ -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)); + ExtendedOpenTelemetrySdk sdk = + createAndMaybeCleanup( + OpenTelemetryConfigurationFactory.getInstance(), + spiHelper, + builder.customizeModel(configurationModel)); + callAutoConfigureListeners(spiHelper, sdk); + return sdk; } /** @@ -404,4 +409,16 @@ private StringBuilder envVarSubstitution( return newVal; } } + + // Visible for testing + 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); + } + } + } } 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..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 @@ -9,12 +9,16 @@ 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; import io.opentelemetry.api.incubator.config.DeclarativeConfigException; import io.opentelemetry.common.ComponentLoader; import io.opentelemetry.internal.testing.CleanupExtension; +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; @@ -173,4 +177,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(); + } }