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 df2686ece55..5beee82f3d4 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,16 +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, 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); + 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) { @@ -77,6 +77,31 @@ static AutoConfiguredOpenTelemetrySdk configureFromFile( } } + private static Resource createResourceFromModel( + Object openTelemetryConfigurationModel, ComponentLoader componentLoader) + throws NoSuchMethodException, + InvocationTargetException, + IllegalAccessException, + ClassNotFoundException { + 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", resourceModelClass, ComponentLoader.class); + + return (Resource) createResource.invoke(null, resourceModel, componentLoader); + } + private static ConfigurationException toConfigurationException( DeclarativeConfigException exception) { String message = Objects.requireNonNull(exception.getMessage()); 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 a29a9f581d1..464e2b137ea 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 @@ -115,6 +115,8 @@ 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())); @@ -122,8 +124,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(); @@ -138,9 +139,7 @@ void configFile_Valid() { assertThat(autoConfiguredOpenTelemetrySdk.getOpenTelemetrySdk().toString()) .isEqualTo(expectedSdk.toString()); - // AutoConfiguredOpenTelemetrySdk#getResource() is set to a dummy value when configuring from - // file - assertThat(autoConfiguredOpenTelemetrySdk.getResource()).isEqualTo(Resource.getDefault()); + assertThat(autoConfiguredOpenTelemetrySdk.getResource()).isEqualTo(expectedResource); 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 a4b336b8b94..96c8b363af6 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; @@ -210,6 +212,16 @@ public static Sampler createSampler(DeclarativeConfigProperties genericSamplerMo samplerModel); } + /** Create a {@link Resource} from the {@code resourceModel} representing the resource config. */ + public static Resource createResource( + ResourceModel resourceModel, ComponentLoader componentLoader) { + if (resourceModel == null) { + return Resource.getDefault(); + } + return createAndMaybeCleanup( + ResourceFactory.getInstance(), SpiHelper.create(componentLoader), resourceModel); + } + private static YamlDeclarativeConfigProperties requireYamlDeclarativeConfigProperties( DeclarativeConfigProperties declarativeConfigProperties) { if (!(declarativeConfigProperties instanceof YamlDeclarativeConfigProperties)) { 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 b72c0bc8ebe..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 @@ -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.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.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,32 @@ 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.create(DeclarativeConfigurationCreateTest.class.getClassLoader()) + .getComponentLoader(); + + Resource resource = DeclarativeConfiguration.createResource(resourceModel, componentLoader); + + assertThat(resource).isNotNull(); + assertThat(resource.getAttributes().get(AttributeKey.stringKey("service.name"))) + .isEqualTo("TestService"); + } + + @Test + void create_defaultResource() { + ComponentLoader componentLoader = + SpiHelper.create(DeclarativeConfigurationCreateTest.class.getClassLoader()) + .getComponentLoader(); + + Resource resource = DeclarativeConfiguration.createResource(null, componentLoader); + + assertThat(resource).isNotNull(); + assertThat(resource.getAttributes().get(AttributeKey.stringKey("service.name"))) + .isEqualTo("unknown_service:java"); + } }