From db4e2e0bfe503759e407f787815b7b0ada306b65 Mon Sep 17 00:00:00 2001 From: robsunday Date: Wed, 11 Jun 2025 15:20:52 +0200 Subject: [PATCH 1/7] Resource set in the AutoConfiguredOpenTelemetrySdk object is now configured from the 'resource' YAML node --- .../sdk/autoconfigure/IncubatingUtil.java | 28 ++++++++++++++++--- .../fileconfig/DeclarativeConfiguration.java | 26 +++++++++++++++++ 2 files changed, 50 insertions(+), 4 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 a1280e241d4..cfbb3b37a84 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 @@ -48,15 +48,16 @@ static AutoConfiguredOpenTelemetrySdk configureFromFile( declarativeConfiguration.getMethod( "create", 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); ConfigProvider configProvider = (ConfigProvider) createFileConfigProvider.invoke(null, model); - // Note: can't access file configuration resource without reflection so setting a dummy - // resource - return AutoConfiguredOpenTelemetrySdk.create( - sdk, Resource.getDefault(), null, configProvider); + + Resource configuredResource = createResourceFromModel(model, componentLoader); + + return AutoConfiguredOpenTelemetrySdk.create(sdk, configuredResource, null, configProvider); } catch (FileNotFoundException e) { throw new ConfigurationException("Configuration file not found", e); } catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException e) { @@ -76,6 +77,25 @@ static AutoConfiguredOpenTelemetrySdk configureFromFile( } } + private static Resource createResourceFromModel( + Object openTelemetryConfigurationModel, ComponentLoader componentLoader) + throws NoSuchMethodException, + InvocationTargetException, + IllegalAccessException, + ClassNotFoundException { + Class declarativeConfigurationClass = + Class.forName( + "io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfiguration"); + Class configurationModelClass = + Class.forName( + "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel"); + + Method createResource = + declarativeConfigurationClass.getMethod( + "createResource", configurationModelClass, ComponentLoader.class); + return (Resource) createResource.invoke(null, openTelemetryConfigurationModel, componentLoader); + } + private static ConfigurationException toConfigurationException( DeclarativeConfigException exception) { String message = Objects.requireNonNull(exception.getMessage()); 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 b672f8e6790..bc534c0f28c 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 @@ -16,7 +16,9 @@ import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper; import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider; import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel; +import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ResourceModel; 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; @@ -109,7 +111,20 @@ public static OpenTelemetrySdk create(OpenTelemetryConfigurationModel configurat public static OpenTelemetrySdk create( OpenTelemetryConfigurationModel configurationModel, ComponentLoader componentLoader) { SpiHelper spiHelper = SpiHelper.create(componentLoader); + return create(configurationModel, spiHelper); + } + /** + * Interpret the {@code configurationModel} to create {@link OpenTelemetrySdk} instance + * corresponding to the configuration. + * + * @param configurationModel the configuration model + * @param spiHelper the component loader used to load {@link ComponentProvider} implementations + * @return the {@link OpenTelemetrySdk} + * @throws DeclarativeConfigException if unable to interpret + */ + public static OpenTelemetrySdk create( + OpenTelemetryConfigurationModel configurationModel, SpiHelper spiHelper) { DeclarativeConfigurationBuilder builder = new DeclarativeConfigurationBuilder(); for (DeclarativeConfigurationCustomizerProvider provider : @@ -205,6 +220,17 @@ public static Sampler createSampler(DeclarativeConfigProperties genericSamplerMo samplerModel); } + /** Create a {@link Resource} from the {@code resourceModel} representing the resource config. */ + public static Resource createResource( + OpenTelemetryConfigurationModel model, ComponentLoader componentLoader) { + ResourceModel resourceModel = model.getResource(); + if (resourceModel == null) { + return Resource.getDefault(); + } + return createAndMaybeCleanup( + ResourceFactory.getInstance(), SpiHelper.create(componentLoader), resourceModel); + } + private static YamlDeclarativeConfigProperties requireYamlDeclarativeConfigProperties( DeclarativeConfigProperties declarativeConfigProperties) { if (!(declarativeConfigProperties instanceof YamlDeclarativeConfigProperties)) { From d45b6a8ddc507a41f9201614c9ac473961de77e8 Mon Sep 17 00:00:00 2001 From: robsunday Date: Wed, 11 Jun 2025 15:42:50 +0200 Subject: [PATCH 2/7] Reverting some unnecessary changes. Improved createResource method --- .../sdk/autoconfigure/IncubatingUtil.java | 16 +++++++++++----- .../fileconfig/DeclarativeConfiguration.java | 16 +--------------- 2 files changed, 12 insertions(+), 20 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 cfbb3b37a84..f45558d004f 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 @@ -83,17 +83,23 @@ private static Resource createResourceFromModel( InvocationTargetException, IllegalAccessException, ClassNotFoundException { - Class declarativeConfigurationClass = - Class.forName( - "io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfiguration"); Class configurationModelClass = Class.forName( "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel"); + Method getResource = configurationModelClass.getMethod("getResource"); + Object resourceModel = getResource.invoke(openTelemetryConfigurationModel); + Class resourceModelClass = + Class.forName( + "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ResourceModel"); + Class declarativeConfigurationClass = + Class.forName( + "io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfiguration"); Method createResource = declarativeConfigurationClass.getMethod( - "createResource", configurationModelClass, ComponentLoader.class); - return (Resource) createResource.invoke(null, openTelemetryConfigurationModel, componentLoader); + "createResource", resourceModelClass, ComponentLoader.class); + + return (Resource) createResource.invoke(null, resourceModel, componentLoader); } private static ConfigurationException toConfigurationException( 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 bc534c0f28c..e4171553904 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 @@ -111,20 +111,7 @@ public static OpenTelemetrySdk create(OpenTelemetryConfigurationModel configurat public static OpenTelemetrySdk create( OpenTelemetryConfigurationModel configurationModel, ComponentLoader componentLoader) { SpiHelper spiHelper = SpiHelper.create(componentLoader); - return create(configurationModel, spiHelper); - } - /** - * Interpret the {@code configurationModel} to create {@link OpenTelemetrySdk} instance - * corresponding to the configuration. - * - * @param configurationModel the configuration model - * @param spiHelper the component loader used to load {@link ComponentProvider} implementations - * @return the {@link OpenTelemetrySdk} - * @throws DeclarativeConfigException if unable to interpret - */ - public static OpenTelemetrySdk create( - OpenTelemetryConfigurationModel configurationModel, SpiHelper spiHelper) { DeclarativeConfigurationBuilder builder = new DeclarativeConfigurationBuilder(); for (DeclarativeConfigurationCustomizerProvider provider : @@ -222,8 +209,7 @@ public static Sampler createSampler(DeclarativeConfigProperties genericSamplerMo /** Create a {@link Resource} from the {@code resourceModel} representing the resource config. */ public static Resource createResource( - OpenTelemetryConfigurationModel model, ComponentLoader componentLoader) { - ResourceModel resourceModel = model.getResource(); + ResourceModel resourceModel, ComponentLoader componentLoader) { if (resourceModel == null) { return Resource.getDefault(); } From 99826d37240e5c50b09b0a46df34e9d7e93c2333 Mon Sep 17 00:00:00 2001 From: robsunday Date: Wed, 11 Jun 2025 17:04:20 +0200 Subject: [PATCH 3/7] UT fix --- .../sdk/autoconfigure/DeclarativeConfigurationTest.java | 8 +++----- 1 file changed, 3 insertions(+), 5 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 345614ffc41..4ef50b86af4 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 @@ -113,6 +113,7 @@ void configFile_fileNotFound() { @Test void configFile_Valid() { + Resource expectedResource = Resource.getDefault().toBuilder().put("service.name", "test").build(); ConfigProperties config = DefaultConfigProperties.createFromMap( Collections.singletonMap("otel.experimental.config.file", configFilePath.toString())); @@ -120,8 +121,7 @@ void configFile_Valid() { OpenTelemetrySdk.builder() .setTracerProvider( SdkTracerProvider.builder() - .setResource( - Resource.getDefault().toBuilder().put("service.name", "test").build()) + .setResource(expectedResource) .addSpanProcessor(SimpleSpanProcessor.create(LoggingSpanExporter.create())) .build()) .build(); @@ -136,10 +136,8 @@ void configFile_Valid() { Assertions.assertThat(autoConfiguredOpenTelemetrySdk.getOpenTelemetrySdk().toString()) .isEqualTo(expectedSdk.toString()); - // AutoConfiguredOpenTelemetrySdk#getResource() is set to a dummy value when configuring from - // file Assertions.assertThat(autoConfiguredOpenTelemetrySdk.getResource()) - .isEqualTo(Resource.getDefault()); + .isEqualTo(expectedResource); verify(builder, times(1)).shutdownHook(autoConfiguredOpenTelemetrySdk.getOpenTelemetrySdk()); Assertions.assertThat(Runtime.getRuntime().removeShutdownHook(thread)).isTrue(); logCapturer.assertContains("Autoconfiguring from configuration file: " + configFilePath); From a23d196e0a34e0887cc16e2d4b0c6b96b6ff3db5 Mon Sep 17 00:00:00 2001 From: robsunday Date: Wed, 11 Jun 2025 17:08:48 +0200 Subject: [PATCH 4/7] spotless --- .../sdk/autoconfigure/DeclarativeConfigurationTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 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 4ef50b86af4..389232c192f 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 @@ -113,7 +113,8 @@ void configFile_fileNotFound() { @Test void configFile_Valid() { - Resource expectedResource = Resource.getDefault().toBuilder().put("service.name", "test").build(); + Resource expectedResource = + Resource.getDefault().toBuilder().put("service.name", "test").build(); ConfigProperties config = DefaultConfigProperties.createFromMap( Collections.singletonMap("otel.experimental.config.file", configFilePath.toString())); @@ -136,8 +137,7 @@ void configFile_Valid() { Assertions.assertThat(autoConfiguredOpenTelemetrySdk.getOpenTelemetrySdk().toString()) .isEqualTo(expectedSdk.toString()); - Assertions.assertThat(autoConfiguredOpenTelemetrySdk.getResource()) - .isEqualTo(expectedResource); + Assertions.assertThat(autoConfiguredOpenTelemetrySdk.getResource()).isEqualTo(expectedResource); verify(builder, times(1)).shutdownHook(autoConfiguredOpenTelemetrySdk.getOpenTelemetrySdk()); Assertions.assertThat(Runtime.getRuntime().removeShutdownHook(thread)).isTrue(); logCapturer.assertContains("Autoconfiguring from configuration file: " + configFilePath); From 6defc6d31e7241cb268a420ee34e21467cb406e2 Mon Sep 17 00:00:00 2001 From: robsunday Date: Fri, 13 Jun 2025 14:06:59 +0200 Subject: [PATCH 5/7] UT added --- .../DeclarativeConfigurationCreateTest.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) 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 2429ae150a2..96a893afa99 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 @@ -12,13 +12,17 @@ import com.linecorp.armeria.testing.junit5.server.SelfSignedCertificateExtension; import io.github.netmikey.logunit.api.LogCapturer; +import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.incubator.config.DeclarativeConfigException; import io.opentelemetry.internal.testing.CleanupExtension; import io.opentelemetry.sdk.OpenTelemetrySdk; +import io.opentelemetry.sdk.autoconfigure.internal.ComponentLoader; 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.ResourceModel; 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; @@ -173,4 +177,18 @@ void create_ModelCustomizer() { + "telemetry.sdk.name=\"opentelemetry\", " + "telemetry.sdk.version=\""); } + + @Test + void create_Resource() { + ResourceModel resourceModel = new ResourceModel(); + resourceModel.withAttributesList("service.name=TestService"); + ComponentLoader componentLoader = + SpiHelper.serviceComponentLoader(DeclarativeConfigurationCreateTest.class.getClassLoader()); + + Resource resource = DeclarativeConfiguration.createResource(resourceModel, componentLoader); + + assertThat(resource).isNotNull(); + assertThat(resource.getAttributes().get(AttributeKey.stringKey("service.name"))) + .isEqualTo("TestService"); + } } From 14f0b08e2f908fa08240bd08ae8f5c187643ebc5 Mon Sep 17 00:00:00 2001 From: robsunday Date: Fri, 20 Jun 2025 12:51:53 +0200 Subject: [PATCH 6/7] UT added --- .../DeclarativeConfigurationCreateTest.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) 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 96a893afa99..a222124eea7 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 @@ -191,4 +191,16 @@ void create_Resource() { assertThat(resource.getAttributes().get(AttributeKey.stringKey("service.name"))) .isEqualTo("TestService"); } + + @Test + void create_defaultResource() { + ComponentLoader componentLoader = + SpiHelper.serviceComponentLoader(DeclarativeConfigurationCreateTest.class.getClassLoader()); + + Resource resource = DeclarativeConfiguration.createResource(null, componentLoader); + + assertThat(resource).isNotNull(); + assertThat(resource.getAttributes().get(AttributeKey.stringKey("service.name"))) + .isEqualTo("unknown_service:java"); + } } From a0be1ff5918cd7a630290e94341422bc5422fd64 Mon Sep 17 00:00:00 2001 From: robsunday Date: Thu, 17 Jul 2025 10:57:33 +0200 Subject: [PATCH 7/7] Fix after merge --- .../fileconfig/DeclarativeConfigurationCreateTest.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) 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 962fbecf376..fe770966407 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 @@ -183,7 +183,8 @@ void create_Resource() { ResourceModel resourceModel = new ResourceModel(); resourceModel.withAttributesList("service.name=TestService"); ComponentLoader componentLoader = - SpiHelper.serviceComponentLoader(DeclarativeConfigurationCreateTest.class.getClassLoader()); + SpiHelper.create(DeclarativeConfigurationCreateTest.class.getClassLoader()) + .getComponentLoader(); Resource resource = DeclarativeConfiguration.createResource(resourceModel, componentLoader); @@ -195,7 +196,8 @@ void create_Resource() { @Test void create_defaultResource() { ComponentLoader componentLoader = - SpiHelper.serviceComponentLoader(DeclarativeConfigurationCreateTest.class.getClassLoader()); + SpiHelper.create(DeclarativeConfigurationCreateTest.class.getClassLoader()) + .getComponentLoader(); Resource resource = DeclarativeConfiguration.createResource(null, componentLoader);