From 1249421682783d92abdcadaa0118335cf3387154 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Thu, 4 Sep 2025 12:56:04 +0200 Subject: [PATCH 1/9] return resource in auto configured sdk --- .../sdk/autoconfigure/IncubatingUtil.java | 9 +++-- .../DeclarativeConfigurationTest.java | 6 ++-- .../fileconfig/DeclarativeConfiguration.java | 33 +++++++++++++++---- .../DeclarativeConfigurationCreateTest.java | 22 +++++++++++++ 4 files changed, 57 insertions(+), 13 deletions(-) diff --git a/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/IncubatingUtil.java b/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/IncubatingUtil.java index ce700181c93..dc85e395178 100644 --- a/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/IncubatingUtil.java +++ b/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/IncubatingUtil.java @@ -111,9 +111,12 @@ private static AutoConfiguredOpenTelemetrySdk getOpenTelemetrySdk( sdkConfigProvider.getMethod("create", openTelemetryConfiguration, ComponentLoader.class); ConfigProvider configProvider = (ConfigProvider) createFileConfigProvider.invoke(null, model, componentLoader); - // Note: can't access file configuration resource without reflection so setting a dummy - // resource - return AutoConfiguredOpenTelemetrySdk.create(sdk, Resource.getDefault(), null, configProvider); + Method createResource = + declarativeConfiguration.getMethod( + "createResource", openTelemetryConfiguration, ComponentLoader.class); + Resource resource = (Resource) createResource.invoke(null, model, componentLoader); + + return AutoConfiguredOpenTelemetrySdk.create(sdk, resource, null, configProvider); } // Visible for testing 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 a062ca30af8..c899d850e26 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 @@ -7,7 +7,6 @@ import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; import static java.util.Collections.singletonMap; -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.ArgumentMatchers.any; @@ -127,13 +126,14 @@ void configFile_Valid() { cleanup.addCloseable(autoConfiguredOpenTelemetrySdk.getOpenTelemetrySdk()); OpenTelemetrySdk openTelemetrySdk = autoConfiguredOpenTelemetrySdk.getOpenTelemetrySdk(); + Resource resource = Resource.getDefault().toBuilder().put("service.name", "test").build(); ExtendedOpenTelemetrySdk expectedSdk = ExtendedOpenTelemetrySdk.create( OpenTelemetrySdk.builder() .setTracerProvider( SdkTracerProvider.builder() .setResource( - Resource.getDefault().toBuilder().put("service.name", "test").build()) + resource) .addSpanProcessor(SimpleSpanProcessor.create(LoggingSpanExporter.create())) .build()) .build(), @@ -142,7 +142,7 @@ void configFile_Valid() { assertThat(openTelemetrySdk.toString()).hasToString(expectedSdk.toString()); // AutoConfiguredOpenTelemetrySdk#getResource() is set to a dummy value when configuring from // file - assertThat(autoConfiguredOpenTelemetrySdk.getResource()).isEqualTo(Resource.getDefault()); + assertThat(autoConfiguredOpenTelemetrySdk.getResource()).isEqualTo(resource); verify(builder, times(1)).shutdownHook(autoConfiguredOpenTelemetrySdk.getOpenTelemetrySdk()); assertThat(Runtime.getRuntime().removeShutdownHook(thread)).isTrue(); logCapturer.assertContains("Autoconfiguring from configuration file: " + configFilePath); 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 77341981103..7fb785a4c66 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 @@ -19,6 +19,7 @@ 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.SamplerModel; +import io.opentelemetry.sdk.resources.Resource; import io.opentelemetry.sdk.trace.samplers.Sampler; import java.io.Closeable; import java.io.IOException; @@ -117,6 +118,30 @@ public static ExtendedOpenTelemetrySdk create( OpenTelemetryConfigurationModel configurationModel, ComponentLoader componentLoader) { SpiHelper spiHelper = SpiHelper.create(componentLoader); + ExtendedOpenTelemetrySdk sdk = createAndMaybeCleanup( + OpenTelemetryConfigurationFactory.getInstance(), + spiHelper, + customizeModel(configurationModel, spiHelper)); + callAutoConfigureListeners(spiHelper, sdk); + return sdk; + } + + public static Resource createResource( + OpenTelemetryConfigurationModel configurationModel, ComponentLoader componentLoader) { + SpiHelper spiHelper = SpiHelper.create(componentLoader); + OpenTelemetryConfigurationModel model = customizeModel(configurationModel, spiHelper); + + Resource resource = Resource.getDefault(); + if (model.getResource() != null) { + resource = + ResourceFactory.getInstance() + .create(model.getResource(), new DeclarativeConfigContext(spiHelper)); + } + return resource; + } + + private static OpenTelemetryConfigurationModel customizeModel( + OpenTelemetryConfigurationModel configurationModel, SpiHelper spiHelper) { DeclarativeConfigurationBuilder builder = new DeclarativeConfigurationBuilder(); for (DeclarativeConfigurationCustomizerProvider provider : @@ -124,13 +149,7 @@ public static ExtendedOpenTelemetrySdk create( provider.customize(builder); } - ExtendedOpenTelemetrySdk sdk = - createAndMaybeCleanup( - OpenTelemetryConfigurationFactory.getInstance(), - spiHelper, - builder.customizeModel(configurationModel)); - callAutoConfigureListeners(spiHelper, sdk); - return sdk; + return builder.customizeModel(configurationModel); } /** 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 b7e4756ce0f..2c40fd142c9 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 @@ -23,6 +23,7 @@ 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; +import io.opentelemetry.sdk.resources.Resource; import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; @@ -194,4 +195,25 @@ void callAutoConfigureListeners_exceptionIsCaught() { spiHelper, OpenTelemetrySdk.builder().build())) .doesNotThrowAnyException(); } + + @Test + void createResource() { + OpenTelemetryConfigurationModel model = new OpenTelemetryConfigurationModel(); + model.withFileFormat("1.0-rc.1"); + Resource resource = + DeclarativeConfiguration.createResource( + model, + // customizer is TestDeclarativeConfigurationCustomizerProvider + ComponentLoader.forClassLoader( + DeclarativeConfigurationCreateTest.class.getClassLoader())); + assertThat(resource.toString()) + .contains( + "Resource{schemaUrl=null, attributes={" + + "color=\"blue\", " + + "foo=\"bar\", " + + "service.name=\"unknown_service:java\", " + + "telemetry.sdk.language=\"java\", " + + "telemetry.sdk.name=\"opentelemetry\", " + + "telemetry.sdk.version=\""); + } } From c4c3fc74ce410f55de1ed5df136a97cf7b19f7ce Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Thu, 4 Sep 2025 14:00:20 +0200 Subject: [PATCH 2/9] don't create resource twice --- .../sdk/autoconfigure/IncubatingUtil.java | 18 +---- .../fileconfig/DeclarativeConfigContext.java | 21 ++++- .../fileconfig/DeclarativeConfiguration.java | 78 ++++++++++++------- .../OpenTelemetryConfigurationFactory.java | 1 + .../DeclarativeConfigurationCreateTest.java | 12 +-- 5 files changed, 80 insertions(+), 50 deletions(-) diff --git a/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/IncubatingUtil.java b/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/IncubatingUtil.java index dc85e395178..b1557996007 100644 --- a/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/IncubatingUtil.java +++ b/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/IncubatingUtil.java @@ -11,9 +11,7 @@ import io.opentelemetry.api.incubator.config.DeclarativeConfigException; import io.opentelemetry.api.incubator.config.GlobalConfigProvider; import io.opentelemetry.common.ComponentLoader; -import io.opentelemetry.sdk.OpenTelemetrySdk; import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException; -import io.opentelemetry.sdk.resources.Resource; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; @@ -102,21 +100,9 @@ private static AutoConfiguredOpenTelemetrySdk getOpenTelemetrySdk( "io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfiguration"); Method create = declarativeConfiguration.getMethod( - "create", openTelemetryConfiguration, ComponentLoader.class); + "createAutoConfiguredSdk", openTelemetryConfiguration, ComponentLoader.class); - OpenTelemetrySdk sdk = (OpenTelemetrySdk) create.invoke(null, model, componentLoader); - Class sdkConfigProvider = - Class.forName("io.opentelemetry.sdk.extension.incubator.fileconfig.SdkConfigProvider"); - Method createFileConfigProvider = - sdkConfigProvider.getMethod("create", openTelemetryConfiguration, ComponentLoader.class); - ConfigProvider configProvider = - (ConfigProvider) createFileConfigProvider.invoke(null, model, componentLoader); - Method createResource = - declarativeConfiguration.getMethod( - "createResource", openTelemetryConfiguration, ComponentLoader.class); - Resource resource = (Resource) createResource.invoke(null, model, componentLoader); - - return AutoConfiguredOpenTelemetrySdk.create(sdk, resource, null, configProvider); + return (AutoConfiguredOpenTelemetrySdk) create.invoke(null, model, componentLoader); } // Visible for testing diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfigContext.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfigContext.java index 1bb0f4f0900..d61da9de097 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfigContext.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfigContext.java @@ -7,7 +7,7 @@ import io.opentelemetry.api.incubator.config.DeclarativeConfigException; import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; -import io.opentelemetry.api.metrics.MeterProvider; +import io.opentelemetry.common.ComponentLoader; import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper; import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider; import java.io.Closeable; @@ -16,19 +16,24 @@ import java.util.List; import java.util.function.Function; import java.util.stream.Collectors; -import javax.annotation.Nullable; /** Declarative configuration context and state carrier. */ class DeclarativeConfigContext { private final SpiHelper spiHelper; private final List closeables = new ArrayList<>(); + private Resource resource = Resource.empty(); @Nullable private volatile MeterProvider meterProvider; + // Visible for testing DeclarativeConfigContext(SpiHelper spiHelper) { this.spiHelper = spiHelper; } + static DeclarativeConfigContext create(ComponentLoader componentLoader) { + return new DeclarativeConfigContext(SpiHelper.create(componentLoader)); + } + /** * Add the {@code closeable} to the list of closeables to clean up if configuration fails * exceptionally, and return it. @@ -51,6 +56,18 @@ public void setMeterProvider(MeterProvider meterProvider) { this.meterProvider = meterProvider; } + Resource getResource() { + return resource; + } + + void setResource(Resource resource) { + this.resource = resource; + } + + SpiHelper getSpiHelper() { + return spiHelper; + } + /** * Find a registered {@link ComponentProvider} with {@link ComponentProvider#getType()} matching * {@code type}, {@link ComponentProvider#getName()} matching {@code name}, and call {@link 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 7fb785a4c66..d5f23687e0a 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 @@ -13,7 +13,9 @@ import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; import io.opentelemetry.common.ComponentLoader; import io.opentelemetry.sdk.OpenTelemetrySdk; -import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper; +import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk; +import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; +import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException; import io.opentelemetry.sdk.autoconfigure.spi.internal.AutoConfigureListener; import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider; import io.opentelemetry.sdk.extension.incubator.ExtendedOpenTelemetrySdk; @@ -24,6 +26,8 @@ import java.io.Closeable; import java.io.IOException; import java.io.InputStream; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; import java.util.Collections; import java.util.Map; import java.util.Objects; @@ -116,40 +120,62 @@ public static ExtendedOpenTelemetrySdk create( */ public static ExtendedOpenTelemetrySdk create( OpenTelemetryConfigurationModel configurationModel, ComponentLoader componentLoader) { - SpiHelper spiHelper = SpiHelper.create(componentLoader); + return create(configurationModel, DeclarativeConfigContext.create(componentLoader)); + } + + private static OpenTelemetrySdk create( + OpenTelemetryConfigurationModel configurationModel, DeclarativeConfigContext context) { + DeclarativeConfigurationBuilder builder = new DeclarativeConfigurationBuilder(); + + for (DeclarativeConfigurationCustomizerProvider provider : + context.getSpiHelper().loadOrdered(DeclarativeConfigurationCustomizerProvider.class)) { + provider.customize(builder); + } ExtendedOpenTelemetrySdk sdk = createAndMaybeCleanup( OpenTelemetryConfigurationFactory.getInstance(), - spiHelper, - customizeModel(configurationModel, spiHelper)); + context, + builder.customizeModel(configurationModel)); callAutoConfigureListeners(spiHelper, sdk); return sdk; } - public static Resource createResource( + public static AutoConfiguredOpenTelemetrySdk createAutoConfiguredSdk( OpenTelemetryConfigurationModel configurationModel, ComponentLoader componentLoader) { - SpiHelper spiHelper = SpiHelper.create(componentLoader); - OpenTelemetryConfigurationModel model = customizeModel(configurationModel, spiHelper); - - Resource resource = Resource.getDefault(); - if (model.getResource() != null) { - resource = - ResourceFactory.getInstance() - .create(model.getResource(), new DeclarativeConfigContext(spiHelper)); - } - return resource; - } + DeclarativeConfigContext context = DeclarativeConfigContext.create(componentLoader); - private static OpenTelemetryConfigurationModel customizeModel( - OpenTelemetryConfigurationModel configurationModel, SpiHelper spiHelper) { - DeclarativeConfigurationBuilder builder = new DeclarativeConfigurationBuilder(); + OpenTelemetrySdk sdk = create(configurationModel, context); + SdkConfigProvider provider = SdkConfigProvider.create(configurationModel, componentLoader); - for (DeclarativeConfigurationCustomizerProvider provider : - spiHelper.loadOrdered(DeclarativeConfigurationCustomizerProvider.class)) { - provider.customize(builder); + try { + Method method = + Class.forName(AutoConfiguredOpenTelemetrySdk.class.getName()) + .getDeclaredMethod( + "create", + OpenTelemetrySdk.class, + Resource.class, + ConfigProperties.class, + Object.class); + method.setAccessible(true); + return (AutoConfiguredOpenTelemetrySdk) + method.invoke(null, sdk, context.getResource(), null, provider); + } catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException e) { + throw new ConfigurationException( + "Error configuring from file. Is opentelemetry-sdk-extension-incubator on the classpath?", + e); + } catch (InvocationTargetException e) { + Throwable cause = e.getCause(); + if (cause instanceof DeclarativeConfigException) { + throw toConfigurationException((DeclarativeConfigException) cause); + } + throw new ConfigurationException("Unexpected error configuring from file", e); } + } - return builder.customizeModel(configurationModel); + private static ConfigurationException toConfigurationException( + DeclarativeConfigException exception) { + String message = Objects.requireNonNull(exception.getMessage()); + return new ConfigurationException(message, exception); } /** @@ -232,7 +258,7 @@ public static Sampler createSampler(DeclarativeConfigProperties genericSamplerMo DeclarativeConfigProperties.toMap(yamlDeclarativeConfigProperties), SamplerModel.class); return createAndMaybeCleanup( SamplerFactory.getInstance(), - SpiHelper.create(yamlDeclarativeConfigProperties.getComponentLoader()), + DeclarativeConfigContext.create(yamlDeclarativeConfigProperties.getComponentLoader()), samplerModel); } @@ -245,8 +271,8 @@ private static YamlDeclarativeConfigProperties requireYamlDeclarativeConfigPrope return (YamlDeclarativeConfigProperties) declarativeConfigProperties; } - static R createAndMaybeCleanup(Factory factory, SpiHelper spiHelper, M model) { - DeclarativeConfigContext context = new DeclarativeConfigContext(spiHelper); + static R createAndMaybeCleanup( + Factory factory, DeclarativeConfigContext context, M model) { try { return factory.create(model, context); } catch (RuntimeException e) { diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/OpenTelemetryConfigurationFactory.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/OpenTelemetryConfigurationFactory.java index f00762917b9..ea0ad7ef2a8 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/OpenTelemetryConfigurationFactory.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/OpenTelemetryConfigurationFactory.java @@ -55,6 +55,7 @@ public ExtendedOpenTelemetrySdk create( if (model.getResource() != null) { resource = ResourceFactory.getInstance().create(model.getResource(), context); } + context.setResource(resource); if (model.getMeterProvider() != null) { SdkMeterProvider meterProvider = 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 2c40fd142c9..50c9a457516 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 @@ -20,10 +20,10 @@ import io.opentelemetry.sdk.OpenTelemetrySdk; import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper; import io.opentelemetry.sdk.extension.incubator.ExtendedOpenTelemetrySdk; +import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk; 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; -import io.opentelemetry.sdk.resources.Resource; import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; @@ -197,18 +197,18 @@ void callAutoConfigureListeners_exceptionIsCaught() { } @Test - void createResource() { + void createAutoConfiguredSdk() { OpenTelemetryConfigurationModel model = new OpenTelemetryConfigurationModel(); model.withFileFormat("1.0-rc.1"); - Resource resource = - DeclarativeConfiguration.createResource( + AutoConfiguredOpenTelemetrySdk sdk = + DeclarativeConfiguration.createAutoConfiguredSdk( model, // customizer is TestDeclarativeConfigurationCustomizerProvider ComponentLoader.forClassLoader( DeclarativeConfigurationCreateTest.class.getClassLoader())); - assertThat(resource.toString()) + assertThat(sdk.toString()) .contains( - "Resource{schemaUrl=null, attributes={" + "resource=Resource{schemaUrl=null, attributes={" + "color=\"blue\", " + "foo=\"bar\", " + "service.name=\"unknown_service:java\", " From 541f260bd9c23b67f1a6edac973dc8ae2524b393 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Thu, 4 Sep 2025 14:22:14 +0200 Subject: [PATCH 3/9] test coverage --- .../AutoConfiguredOpenTelemetrySdkAccess.java | 71 +++++++++++++++++++ .../fileconfig/DeclarativeConfiguration.java | 34 +-------- ...oConfiguredOpenTelemetrySdkAccessTest.java | 42 +++++++++++ 3 files changed, 114 insertions(+), 33 deletions(-) create mode 100644 sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/AutoConfiguredOpenTelemetrySdkAccess.java create mode 100644 sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/AutoConfiguredOpenTelemetrySdkAccessTest.java diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/AutoConfiguredOpenTelemetrySdkAccess.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/AutoConfiguredOpenTelemetrySdkAccess.java new file mode 100644 index 00000000000..dfdbdd69b9c --- /dev/null +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/AutoConfiguredOpenTelemetrySdkAccess.java @@ -0,0 +1,71 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.sdk.extension.incubator.fileconfig; + +import io.opentelemetry.api.incubator.config.DeclarativeConfigException; +import io.opentelemetry.sdk.OpenTelemetrySdk; +import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk; +import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; +import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException; +import io.opentelemetry.sdk.resources.Resource; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.Objects; + +class AutoConfiguredOpenTelemetrySdkAccess { + + private AutoConfiguredOpenTelemetrySdkAccess() {} + + static AutoConfiguredOpenTelemetrySdk create( + OpenTelemetrySdk sdk, Resource resource, SdkConfigProvider provider) { + return createWithFactory( + () -> { + Method method = + Class.forName(AutoConfiguredOpenTelemetrySdk.class.getName()) + .getDeclaredMethod( + "create", + OpenTelemetrySdk.class, + Resource.class, + ConfigProperties.class, + Object.class); + method.setAccessible(true); + return (AutoConfiguredOpenTelemetrySdk) + method.invoke(null, sdk, resource, null, provider); + }); + } + + // Visible for testing + interface Factory { + AutoConfiguredOpenTelemetrySdk create() + throws ClassNotFoundException, + NoSuchMethodException, + IllegalAccessException, + InvocationTargetException; + } + + // Visible for testing + static AutoConfiguredOpenTelemetrySdk createWithFactory(Factory factory) { + try { + return factory.create(); + } catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException e) { + throw new ConfigurationException( + "Error configuring from file. Is opentelemetry-sdk-extension-incubator on the classpath?", + e); + } catch (InvocationTargetException e) { + Throwable cause = e.getCause(); + if (cause instanceof DeclarativeConfigException) { + throw toConfigurationException((DeclarativeConfigException) cause); + } + throw new ConfigurationException("Unexpected error configuring from file", e); + } + } + + private static ConfigurationException toConfigurationException( + DeclarativeConfigException exception) { + String message = Objects.requireNonNull(exception.getMessage()); + return new ConfigurationException(message, exception); + } +} 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 d5f23687e0a..9b29b7f8bff 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 @@ -21,13 +21,10 @@ 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.SamplerModel; -import io.opentelemetry.sdk.resources.Resource; import io.opentelemetry.sdk.trace.samplers.Sampler; import java.io.Closeable; import java.io.IOException; import java.io.InputStream; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; import java.util.Collections; import java.util.Map; import java.util.Objects; @@ -143,39 +140,10 @@ private static OpenTelemetrySdk create( public static AutoConfiguredOpenTelemetrySdk createAutoConfiguredSdk( OpenTelemetryConfigurationModel configurationModel, ComponentLoader componentLoader) { DeclarativeConfigContext context = DeclarativeConfigContext.create(componentLoader); - OpenTelemetrySdk sdk = create(configurationModel, context); SdkConfigProvider provider = SdkConfigProvider.create(configurationModel, componentLoader); - try { - Method method = - Class.forName(AutoConfiguredOpenTelemetrySdk.class.getName()) - .getDeclaredMethod( - "create", - OpenTelemetrySdk.class, - Resource.class, - ConfigProperties.class, - Object.class); - method.setAccessible(true); - return (AutoConfiguredOpenTelemetrySdk) - method.invoke(null, sdk, context.getResource(), null, provider); - } catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException e) { - throw new ConfigurationException( - "Error configuring from file. Is opentelemetry-sdk-extension-incubator on the classpath?", - e); - } catch (InvocationTargetException e) { - Throwable cause = e.getCause(); - if (cause instanceof DeclarativeConfigException) { - throw toConfigurationException((DeclarativeConfigException) cause); - } - throw new ConfigurationException("Unexpected error configuring from file", e); - } - } - - private static ConfigurationException toConfigurationException( - DeclarativeConfigException exception) { - String message = Objects.requireNonNull(exception.getMessage()); - return new ConfigurationException(message, exception); + return AutoConfiguredOpenTelemetrySdkAccess.create(sdk, context.getResource(), provider); } /** diff --git a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/AutoConfiguredOpenTelemetrySdkAccessTest.java b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/AutoConfiguredOpenTelemetrySdkAccessTest.java new file mode 100644 index 00000000000..f5b0a16121c --- /dev/null +++ b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/AutoConfiguredOpenTelemetrySdkAccessTest.java @@ -0,0 +1,42 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.sdk.extension.incubator.fileconfig; + +import static org.assertj.core.api.Assertions.assertThatCode; + +import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException; +import java.lang.reflect.InvocationTargetException; +import org.junit.jupiter.api.Test; + +class AutoConfiguredOpenTelemetrySdkAccessTest { + + @Test + void classNotFoundException() { + assertThatCode( + () -> + AutoConfiguredOpenTelemetrySdkAccess.createWithFactory( + () -> { + Class.forName("foo"); + return null; + })) + .isInstanceOf(ConfigurationException.class) + .hasMessage( + "Error configuring from file. Is opentelemetry-sdk-extension-incubator on the classpath?"); + } + + @Test + void invocationTargetException() { + assertThatCode( + () -> + AutoConfiguredOpenTelemetrySdkAccess.createWithFactory( + () -> { + throw new InvocationTargetException(new RuntimeException("test exception")); + })) + .isInstanceOf(ConfigurationException.class) + .hasMessage("Unexpected error configuring from file") + .hasRootCauseMessage("test exception"); + } +} From 207e7c4de501123bed0e79b0e21b19c93463cd83 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Fri, 5 Sep 2025 10:16:11 +0200 Subject: [PATCH 4/9] rebase --- .../incubator/fileconfig/DeclarativeConfigContext.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfigContext.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfigContext.java index d61da9de097..272641ce3a7 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfigContext.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfigContext.java @@ -7,23 +7,26 @@ import io.opentelemetry.api.incubator.config.DeclarativeConfigException; import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; +import io.opentelemetry.api.metrics.MeterProvider; import io.opentelemetry.common.ComponentLoader; import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper; import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider; +import io.opentelemetry.sdk.resources.Resource; import java.io.Closeable; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.function.Function; import java.util.stream.Collectors; +import javax.annotation.Nullable; /** Declarative configuration context and state carrier. */ class DeclarativeConfigContext { private final SpiHelper spiHelper; private final List closeables = new ArrayList<>(); - private Resource resource = Resource.empty(); @Nullable private volatile MeterProvider meterProvider; + private Resource resource = Resource.empty(); // Visible for testing DeclarativeConfigContext(SpiHelper spiHelper) { From 75509158fb0810a1d091a5fee1c39c8a8758919f Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Thu, 25 Sep 2025 13:44:12 +0200 Subject: [PATCH 5/9] format --- .../autoconfigure/DeclarativeConfigurationTest.java | 3 +-- .../fileconfig/DeclarativeConfiguration.java | 11 +++++------ .../DeclarativeConfigurationCreateTest.java | 2 +- 3 files changed, 7 insertions(+), 9 deletions(-) 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 c899d850e26..3d04962237a 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 @@ -132,8 +132,7 @@ void configFile_Valid() { OpenTelemetrySdk.builder() .setTracerProvider( SdkTracerProvider.builder() - .setResource( - resource) + .setResource(resource) .addSpanProcessor(SimpleSpanProcessor.create(LoggingSpanExporter.create())) .build()) .build(), 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 9b29b7f8bff..7cbb24f162a 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,8 +14,6 @@ import io.opentelemetry.common.ComponentLoader; import io.opentelemetry.sdk.OpenTelemetrySdk; import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException; import io.opentelemetry.sdk.autoconfigure.spi.internal.AutoConfigureListener; import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider; import io.opentelemetry.sdk.extension.incubator.ExtendedOpenTelemetrySdk; @@ -129,10 +127,11 @@ private static OpenTelemetrySdk create( provider.customize(builder); } - ExtendedOpenTelemetrySdk sdk = createAndMaybeCleanup( - OpenTelemetryConfigurationFactory.getInstance(), - context, - builder.customizeModel(configurationModel)); + ExtendedOpenTelemetrySdk sdk = + createAndMaybeCleanup( + OpenTelemetryConfigurationFactory.getInstance(), + context, + builder.customizeModel(configurationModel)); callAutoConfigureListeners(spiHelper, sdk); return sdk; } 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 50c9a457516..a99b9884e71 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 @@ -18,9 +18,9 @@ import io.opentelemetry.common.ComponentLoader; import io.opentelemetry.internal.testing.CleanupExtension; import io.opentelemetry.sdk.OpenTelemetrySdk; +import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk; import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper; import io.opentelemetry.sdk.extension.incubator.ExtendedOpenTelemetrySdk; -import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk; 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 f86f89b9eb5d3613ed4c94baafd5c33caad21fb0 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Thu, 25 Sep 2025 13:48:01 +0200 Subject: [PATCH 6/9] rebase --- .../incubator/fileconfig/DeclarativeConfiguration.java | 6 ++++-- 1 file changed, 4 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 7cbb24f162a..87a86f470c3 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.AutoConfiguredOpenTelemetrySdk; +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; @@ -118,12 +119,13 @@ public static ExtendedOpenTelemetrySdk create( return create(configurationModel, DeclarativeConfigContext.create(componentLoader)); } - private static OpenTelemetrySdk create( + private static ExtendedOpenTelemetrySdk create( OpenTelemetryConfigurationModel configurationModel, DeclarativeConfigContext context) { DeclarativeConfigurationBuilder builder = new DeclarativeConfigurationBuilder(); + SpiHelper spiHelper = context.getSpiHelper(); for (DeclarativeConfigurationCustomizerProvider provider : - context.getSpiHelper().loadOrdered(DeclarativeConfigurationCustomizerProvider.class)) { + spiHelper.loadOrdered(DeclarativeConfigurationCustomizerProvider.class)) { provider.customize(builder); } From 16e1492ee7b86cdb0bd19a689c2613145142b84c Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Thu, 25 Sep 2025 14:11:13 +0200 Subject: [PATCH 7/9] move logic to incubating util --- .../sdk/autoconfigure/IncubatingUtil.java | 29 +++++++- .../AutoConfiguredOpenTelemetrySdkAccess.java | 71 ------------------- .../fileconfig/DeclarativeConfiguration.java | 10 --- ...oConfiguredOpenTelemetrySdkAccessTest.java | 42 ----------- .../DeclarativeConfigurationCreateTest.java | 22 ------ 5 files changed, 26 insertions(+), 148 deletions(-) delete mode 100644 sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/AutoConfiguredOpenTelemetrySdkAccess.java delete mode 100644 sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/AutoConfiguredOpenTelemetrySdkAccessTest.java diff --git a/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/IncubatingUtil.java b/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/IncubatingUtil.java index b1557996007..7596864631f 100644 --- a/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/IncubatingUtil.java +++ b/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/IncubatingUtil.java @@ -11,7 +11,9 @@ import io.opentelemetry.api.incubator.config.DeclarativeConfigException; import io.opentelemetry.api.incubator.config.GlobalConfigProvider; import io.opentelemetry.common.ComponentLoader; +import io.opentelemetry.sdk.OpenTelemetrySdk; import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException; +import io.opentelemetry.sdk.resources.Resource; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; @@ -98,11 +100,32 @@ private static AutoConfiguredOpenTelemetrySdk getOpenTelemetrySdk( Class declarativeConfiguration = Class.forName( "io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfiguration"); + + Class contextClass = + Class.forName( + "io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfigContext"); + Method createContext = contextClass.getDeclaredMethod("create", ComponentLoader.class); + createContext.setAccessible(true); + Object context = createContext.invoke(null, componentLoader); + Method create = - declarativeConfiguration.getMethod( - "createAutoConfiguredSdk", openTelemetryConfiguration, ComponentLoader.class); + declarativeConfiguration.getDeclaredMethod( + "create", openTelemetryConfiguration, contextClass); + create.setAccessible(true); + OpenTelemetrySdk sdk = (OpenTelemetrySdk) create.invoke(null, model, context); + + Class providerClass = + Class.forName("io.opentelemetry.sdk.extension.incubator.fileconfig.SdkConfigProvider"); + Object provider = + providerClass + .getDeclaredMethod("create", openTelemetryConfiguration, ComponentLoader.class) + .invoke(null, model, componentLoader); + + Method getResource = contextClass.getDeclaredMethod("getResource"); + getResource.setAccessible(true); + Resource resource = (Resource) getResource.invoke(context); - return (AutoConfiguredOpenTelemetrySdk) create.invoke(null, model, componentLoader); + return AutoConfiguredOpenTelemetrySdk.create(sdk, resource, null, provider); } // Visible for testing diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/AutoConfiguredOpenTelemetrySdkAccess.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/AutoConfiguredOpenTelemetrySdkAccess.java deleted file mode 100644 index dfdbdd69b9c..00000000000 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/AutoConfiguredOpenTelemetrySdkAccess.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.sdk.extension.incubator.fileconfig; - -import io.opentelemetry.api.incubator.config.DeclarativeConfigException; -import io.opentelemetry.sdk.OpenTelemetrySdk; -import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException; -import io.opentelemetry.sdk.resources.Resource; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.Objects; - -class AutoConfiguredOpenTelemetrySdkAccess { - - private AutoConfiguredOpenTelemetrySdkAccess() {} - - static AutoConfiguredOpenTelemetrySdk create( - OpenTelemetrySdk sdk, Resource resource, SdkConfigProvider provider) { - return createWithFactory( - () -> { - Method method = - Class.forName(AutoConfiguredOpenTelemetrySdk.class.getName()) - .getDeclaredMethod( - "create", - OpenTelemetrySdk.class, - Resource.class, - ConfigProperties.class, - Object.class); - method.setAccessible(true); - return (AutoConfiguredOpenTelemetrySdk) - method.invoke(null, sdk, resource, null, provider); - }); - } - - // Visible for testing - interface Factory { - AutoConfiguredOpenTelemetrySdk create() - throws ClassNotFoundException, - NoSuchMethodException, - IllegalAccessException, - InvocationTargetException; - } - - // Visible for testing - static AutoConfiguredOpenTelemetrySdk createWithFactory(Factory factory) { - try { - return factory.create(); - } catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException e) { - throw new ConfigurationException( - "Error configuring from file. Is opentelemetry-sdk-extension-incubator on the classpath?", - e); - } catch (InvocationTargetException e) { - Throwable cause = e.getCause(); - if (cause instanceof DeclarativeConfigException) { - throw toConfigurationException((DeclarativeConfigException) cause); - } - throw new ConfigurationException("Unexpected error configuring from file", e); - } - } - - private static ConfigurationException toConfigurationException( - DeclarativeConfigException exception) { - String message = Objects.requireNonNull(exception.getMessage()); - return new ConfigurationException(message, exception); - } -} 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 87a86f470c3..7a643630c7b 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 @@ -13,7 +13,6 @@ import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; import io.opentelemetry.common.ComponentLoader; import io.opentelemetry.sdk.OpenTelemetrySdk; -import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk; import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper; import io.opentelemetry.sdk.autoconfigure.spi.internal.AutoConfigureListener; import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider; @@ -138,15 +137,6 @@ private static ExtendedOpenTelemetrySdk create( return sdk; } - public static AutoConfiguredOpenTelemetrySdk createAutoConfiguredSdk( - OpenTelemetryConfigurationModel configurationModel, ComponentLoader componentLoader) { - DeclarativeConfigContext context = DeclarativeConfigContext.create(componentLoader); - OpenTelemetrySdk sdk = create(configurationModel, context); - SdkConfigProvider provider = SdkConfigProvider.create(configurationModel, componentLoader); - - return AutoConfiguredOpenTelemetrySdkAccess.create(sdk, context.getResource(), provider); - } - /** * Parse the {@code configuration} YAML and return the {@link OpenTelemetryConfigurationModel}. * diff --git a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/AutoConfiguredOpenTelemetrySdkAccessTest.java b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/AutoConfiguredOpenTelemetrySdkAccessTest.java deleted file mode 100644 index f5b0a16121c..00000000000 --- a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/AutoConfiguredOpenTelemetrySdkAccessTest.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.sdk.extension.incubator.fileconfig; - -import static org.assertj.core.api.Assertions.assertThatCode; - -import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException; -import java.lang.reflect.InvocationTargetException; -import org.junit.jupiter.api.Test; - -class AutoConfiguredOpenTelemetrySdkAccessTest { - - @Test - void classNotFoundException() { - assertThatCode( - () -> - AutoConfiguredOpenTelemetrySdkAccess.createWithFactory( - () -> { - Class.forName("foo"); - return null; - })) - .isInstanceOf(ConfigurationException.class) - .hasMessage( - "Error configuring from file. Is opentelemetry-sdk-extension-incubator on the classpath?"); - } - - @Test - void invocationTargetException() { - assertThatCode( - () -> - AutoConfiguredOpenTelemetrySdkAccess.createWithFactory( - () -> { - throw new InvocationTargetException(new RuntimeException("test exception")); - })) - .isInstanceOf(ConfigurationException.class) - .hasMessage("Unexpected error configuring from file") - .hasRootCauseMessage("test exception"); - } -} 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 a99b9884e71..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 @@ -18,7 +18,6 @@ import io.opentelemetry.common.ComponentLoader; import io.opentelemetry.internal.testing.CleanupExtension; import io.opentelemetry.sdk.OpenTelemetrySdk; -import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk; import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper; import io.opentelemetry.sdk.extension.incubator.ExtendedOpenTelemetrySdk; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel; @@ -195,25 +194,4 @@ void callAutoConfigureListeners_exceptionIsCaught() { spiHelper, OpenTelemetrySdk.builder().build())) .doesNotThrowAnyException(); } - - @Test - void createAutoConfiguredSdk() { - OpenTelemetryConfigurationModel model = new OpenTelemetryConfigurationModel(); - model.withFileFormat("1.0-rc.1"); - AutoConfiguredOpenTelemetrySdk sdk = - DeclarativeConfiguration.createAutoConfiguredSdk( - model, - // customizer is TestDeclarativeConfigurationCustomizerProvider - ComponentLoader.forClassLoader( - DeclarativeConfigurationCreateTest.class.getClassLoader())); - assertThat(sdk.toString()) - .contains( - "resource=Resource{schemaUrl=null, attributes={" - + "color=\"blue\", " - + "foo=\"bar\", " - + "service.name=\"unknown_service:java\", " - + "telemetry.sdk.language=\"java\", " - + "telemetry.sdk.name=\"opentelemetry\", " - + "telemetry.sdk.version=\""); - } } From 84e061bd889df1aa29e833eb15919589501a8e22 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Thu, 25 Sep 2025 14:18:38 +0200 Subject: [PATCH 8/9] comment --- .../extension/incubator/fileconfig/DeclarativeConfigContext.java | 1 + 1 file changed, 1 insertion(+) diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfigContext.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfigContext.java index 272641ce3a7..aecc9a6002e 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfigContext.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfigContext.java @@ -60,6 +60,7 @@ public void setMeterProvider(MeterProvider meterProvider) { } Resource getResource() { + // called via reflection from io.opentelemetry.sdk.autoconfigure.IncubatingUtil return resource; } From 1079cdc178a04fd6605fa07570b14735c6f848a0 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Mon, 29 Sep 2025 16:34:55 +0200 Subject: [PATCH 9/9] make sure resource is set when getting it (to help troubleshoot) --- .../fileconfig/DeclarativeConfigContext.java | 5 +++- .../DeclarativeConfigContextTest.java | 29 +++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfigContextTest.java diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfigContext.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfigContext.java index aecc9a6002e..a53eb1d13c5 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfigContext.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfigContext.java @@ -26,7 +26,7 @@ class DeclarativeConfigContext { private final SpiHelper spiHelper; private final List closeables = new ArrayList<>(); @Nullable private volatile MeterProvider meterProvider; - private Resource resource = Resource.empty(); + @Nullable private Resource resource = null; // Visible for testing DeclarativeConfigContext(SpiHelper spiHelper) { @@ -61,6 +61,9 @@ public void setMeterProvider(MeterProvider meterProvider) { Resource getResource() { // called via reflection from io.opentelemetry.sdk.autoconfigure.IncubatingUtil + if (resource == null) { + throw new DeclarativeConfigException("Resource has not been configured yet."); + } return resource; } diff --git a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfigContextTest.java b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfigContextTest.java new file mode 100644 index 00000000000..fb78ca28e9a --- /dev/null +++ b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfigContextTest.java @@ -0,0 +1,29 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.sdk.extension.incubator.fileconfig; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatCode; + +import io.opentelemetry.api.incubator.config.DeclarativeConfigException; +import io.opentelemetry.common.ComponentLoader; +import io.opentelemetry.sdk.resources.Resource; +import org.junit.jupiter.api.Test; + +class DeclarativeConfigContextTest { + + private final DeclarativeConfigContext context = + DeclarativeConfigContext.create( + ComponentLoader.forClassLoader(DeclarativeConfigContextTest.class.getClassLoader())); + + @Test + void resourceMustBeSetBeforeUse() { + assertThatCode(context::getResource).isInstanceOf(DeclarativeConfigException.class); + Resource resource = Resource.empty(); + context.setResource(resource); + assertThat(context.getResource()).isSameAs(resource); + } +}