From 34b92776a0568f9b6ea1680d71b0a6f995c5879f Mon Sep 17 00:00:00 2001 From: Jack Berg Date: Fri, 20 Jun 2025 10:28:14 -0500 Subject: [PATCH 1/3] Update to declarative config 1.0-rc.1 --- .../DeclarativeConfigurationTest.java | 2 +- .../DeclarativeConfigurationTest.java | 4 +- sdk-extensions/incubator/build.gradle.kts | 2 +- .../OpenTelemetryConfigurationFactory.java | 8 +-- .../fileconfig/ServiceResourceDetector.java | 35 +++++++++++++ ...toconfigure.spi.internal.ComponentProvider | 1 + .../DeclarativeConfigurationCreateTest.java | 6 +-- .../DeclarativeConfigurationParseTest.java | 16 +++--- ...OpenTelemetryConfigurationFactoryTest.java | 49 +++++++++++++------ .../YamlDeclarativeConfigPropertiesTest.java | 4 +- 10 files changed, 93 insertions(+), 34 deletions(-) create mode 100644 sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/ServiceResourceDetector.java create mode 100644 sdk-extensions/incubator/src/main/resources/META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider diff --git a/sdk-extensions/autoconfigure/src/test/java/io/opentelemetry/sdk/autoconfigure/DeclarativeConfigurationTest.java b/sdk-extensions/autoconfigure/src/test/java/io/opentelemetry/sdk/autoconfigure/DeclarativeConfigurationTest.java index 85a6ab085f0..c5e6c15066d 100644 --- a/sdk-extensions/autoconfigure/src/test/java/io/opentelemetry/sdk/autoconfigure/DeclarativeConfigurationTest.java +++ b/sdk-extensions/autoconfigure/src/test/java/io/opentelemetry/sdk/autoconfigure/DeclarativeConfigurationTest.java @@ -23,7 +23,7 @@ class DeclarativeConfigurationTest { @Test void configFile(@TempDir Path tempDir) throws IOException { String yaml = - "file_format: \"0.4\"\n" + "file_format: \"1.0-rc.1\"\n" + "resource:\n" + " attributes:\n" + " - name: service.name\n" 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..f92c1027ccd 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 @@ -62,7 +62,7 @@ class DeclarativeConfigurationTest { @BeforeEach void setup() throws IOException { String yaml = - "file_format: \"0.4\"\n" + "file_format: \"1.0-rc.1\"\n" + "resource:\n" + " attributes:\n" + " - name: service.name\n" @@ -199,7 +199,7 @@ void configFile_setResultAsGlobalTrue() { @Test void configFile_Error(@TempDir Path tempDir) throws IOException { String yaml = - "file_format: \"0.4\"\n" + "file_format: \"1.0-rc.1\"\n" + "resource:\n" + " attributes:\n" + " - name: service.name\n" diff --git a/sdk-extensions/incubator/build.gradle.kts b/sdk-extensions/incubator/build.gradle.kts index 9ed2927a241..1bb858d699a 100644 --- a/sdk-extensions/incubator/build.gradle.kts +++ b/sdk-extensions/incubator/build.gradle.kts @@ -57,7 +57,7 @@ dependencies { // 7. deleteJs2pTmp - delete tmp directory // ... proceed with normal sourcesJar, compileJava, etc -val configurationTag = "0.4.0" +val configurationTag = "1.0.0-rc.1" val configurationRef = "refs/tags/v$configurationTag" // Replace with commit SHA to point to experiment with a specific commit val configurationRepoZip = "https://github.com/open-telemetry/opentelemetry-configuration/archive/$configurationRef.zip" val buildDirectory = layout.buildDirectory.asFile.get() 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 a64e0b07dec..5df10285343 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 @@ -11,11 +11,12 @@ import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel; import io.opentelemetry.sdk.resources.Resource; import java.util.Objects; +import java.util.regex.Pattern; final class OpenTelemetryConfigurationFactory implements Factory { - private static final String CURRENT_SUPPORTED_FILE_FORMAT = "0.4"; + private static final Pattern SUPPORTED_FILE_FORMATS = Pattern.compile("^(0.4)|(1.0(-rc.\\d*)?)$"); private static final OpenTelemetryConfigurationFactory INSTANCE = new OpenTelemetryConfigurationFactory(); @@ -30,9 +31,10 @@ static OpenTelemetryConfigurationFactory getInstance() { public OpenTelemetrySdk create( OpenTelemetryConfigurationModel model, DeclarativeConfigContext context) { OpenTelemetrySdkBuilder builder = OpenTelemetrySdk.builder(); - if (!CURRENT_SUPPORTED_FILE_FORMAT.equals(model.getFileFormat())) { + String fileFormat = model.getFileFormat(); + if (fileFormat == null || !SUPPORTED_FILE_FORMATS.matcher(fileFormat).matches()) { throw new DeclarativeConfigException( - "Unsupported file format. Supported formats include: " + CURRENT_SUPPORTED_FILE_FORMAT); + "Unsupported file format. Supported formats include 0.4, 1.0*"); } if (Objects.equals(Boolean.TRUE, model.getDisabled())) { diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/ServiceResourceDetector.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/ServiceResourceDetector.java new file mode 100644 index 00000000000..8b3352d981a --- /dev/null +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/ServiceResourceDetector.java @@ -0,0 +1,35 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.sdk.extension.incubator.fileconfig; + +import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; +import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; +import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider; +import io.opentelemetry.sdk.autoconfigure.spi.internal.DefaultConfigProperties; +import io.opentelemetry.sdk.resources.Resource; +import java.util.Collections; + +public class ServiceResourceDetector implements ComponentProvider { + @Override + public Class getType() { + return Resource.class; + } + + @Override + public String getName() { + return "service"; + } + + @Override + public Resource create(DeclarativeConfigProperties config) { + ConfigProperties properties = DefaultConfigProperties.create(Collections.emptyMap()); + String serviceName = properties.getString("otel.service.name"); + if (serviceName != null) { + return Resource.builder().put("service.name", serviceName).build(); + } + return Resource.empty(); + } +} diff --git a/sdk-extensions/incubator/src/main/resources/META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider b/sdk-extensions/incubator/src/main/resources/META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider new file mode 100644 index 00000000000..a1a361a5f37 --- /dev/null +++ b/sdk-extensions/incubator/src/main/resources/META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider @@ -0,0 +1 @@ +io.opentelemetry.sdk.extension.incubator.fileconfig.ServiceResourceDetector 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..62ee0782860 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 @@ -106,7 +106,7 @@ void parseAndCreate_Exception_CleansUpPartials() { // exporter with OTLP exporter, following by invalid batch exporter which references invalid // exporter "foo". String yaml = - "file_format: \"0.4\"\n" + "file_format: \"1.0-rc.1\"\n" + "logger_provider:\n" + " processors:\n" + " - batch:\n" @@ -133,7 +133,7 @@ void parseAndCreate_Exception_CleansUpPartials() { @Test void parseAndCreate_EmptyComponentProviderConfig() { String yaml = - "file_format: \"0.4\"\n" + "file_format: \"1.0-rc.1\"\n" + "logger_provider:\n" + " processors:\n" + " - test:\n" @@ -151,7 +151,7 @@ void parseAndCreate_EmptyComponentProviderConfig() { @Test void create_ModelCustomizer() { OpenTelemetryConfigurationModel model = new OpenTelemetryConfigurationModel(); - model.withFileFormat("0.4"); + model.withFileFormat("1.0-rc.1"); model.withTracerProvider( new TracerProviderModel() .withProcessors( diff --git a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfigurationParseTest.java b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfigurationParseTest.java index 32a8ad878bc..0147cf8b687 100644 --- a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfigurationParseTest.java +++ b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfigurationParseTest.java @@ -113,7 +113,7 @@ void parse_BadInputStream() { void parse_KitchenSinkExampleFile() throws IOException { OpenTelemetryConfigurationModel expected = new OpenTelemetryConfigurationModel(); - expected.withFileFormat("0.4"); + expected.withFileFormat("1.0-rc.1"); expected.withDisabled(false); expected.withLogLevel("info"); @@ -171,9 +171,9 @@ void parse_KitchenSinkExampleFile() throws IOException { new ExperimentalResourceDetectorModel() .withAdditionalProperty("host", null), new ExperimentalResourceDetectorModel() - .withAdditionalProperty("os", null), + .withAdditionalProperty("process", null), new ExperimentalResourceDetectorModel() - .withAdditionalProperty("process", null)))) + .withAdditionalProperty("service", null)))) .withSchemaUrl("https://opentelemetry.io/schemas/1.16.0"); expected.withResource(resource); @@ -705,7 +705,7 @@ void parse_KitchenSinkExampleFile() throws IOException { OpenTelemetryConfigurationModel config = DeclarativeConfiguration.parse(configExampleFile); // General config - assertThat(config.getFileFormat()).isEqualTo("0.4"); + assertThat(config.getFileFormat()).isEqualTo("1.0-rc.1"); assertThat(config.getResource()).isEqualTo(resource); assertThat(config.getAttributeLimits()).isEqualTo(attributeLimits); assertThat(config.getPropagator()).isEqualTo(propagator); @@ -770,7 +770,7 @@ void parse_KitchenSinkExampleFile() throws IOException { @Test void parse_nullValuesParsedToEmptyObjects() { String objectPlaceholderString = - "file_format: \"0.4\"\n" + "file_format: \"1.0-rc.1\"\n" + "tracer_provider:\n" + " processors:\n" + " - batch:\n" @@ -788,7 +788,7 @@ void parse_nullValuesParsedToEmptyObjects() { new ByteArrayInputStream(objectPlaceholderString.getBytes(StandardCharsets.UTF_8))); String noOjbectPlaceholderString = - "file_format: \"0.4\"\n" + "file_format: \"1.0-rc.1\"\n" + "tracer_provider:\n" + " processors:\n" + " - batch:\n" @@ -986,7 +986,7 @@ private static Map mapOf(Map.Entry... entries) { @Test void read_WithEnvironmentVariables() { String yaml = - "file_format: \"0.4\"\n" + "file_format: \"1.0-rc.1\"\n" + "tracer_provider:\n" + " processors:\n" + " - batch:\n" @@ -1005,7 +1005,7 @@ void read_WithEnvironmentVariables() { assertThat(model) .isEqualTo( new OpenTelemetryConfigurationModel() - .withFileFormat("0.4") + .withFileFormat("1.0-rc.1") .withTracerProvider( new TracerProviderModel() .withProcessors( diff --git a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/OpenTelemetryConfigurationFactoryTest.java b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/OpenTelemetryConfigurationFactoryTest.java index 16ec2c284d2..961fe87d696 100644 --- a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/OpenTelemetryConfigurationFactoryTest.java +++ b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/OpenTelemetryConfigurationFactoryTest.java @@ -7,6 +7,7 @@ import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; import static io.opentelemetry.sdk.trace.samplers.Sampler.alwaysOn; +import static org.assertj.core.api.Assertions.assertThatCode; import static org.assertj.core.api.Assertions.assertThatThrownBy; import io.opentelemetry.api.baggage.propagation.W3CBaggagePropagator; @@ -63,8 +64,12 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; +import java.util.stream.Stream; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; class OpenTelemetryConfigurationFactoryTest { @@ -74,23 +79,39 @@ class OpenTelemetryConfigurationFactoryTest { new DeclarativeConfigContext( SpiHelper.create(OpenTelemetryConfigurationFactoryTest.class.getClassLoader())); - @Test - void create_InvalidFileFormat() { - List testCases = - Arrays.asList( - new OpenTelemetryConfigurationModel(), - new OpenTelemetryConfigurationModel().withFileFormat("1")); + @ParameterizedTest + @MethodSource("fileFormatArgs") + void create_FileFormat(String fileFormat, boolean isValid) { + OpenTelemetryConfigurationModel model = + new OpenTelemetryConfigurationModel().withFileFormat(fileFormat); - List closeables = new ArrayList<>(); - for (OpenTelemetryConfigurationModel testCase : testCases) { + if (isValid) { + assertThatCode(() -> OpenTelemetryConfigurationFactory.getInstance().create(model, context)) + .doesNotThrowAnyException(); + } else { assertThatThrownBy( - () -> OpenTelemetryConfigurationFactory.getInstance().create(testCase, context)) + () -> OpenTelemetryConfigurationFactory.getInstance().create(model, context)) .isInstanceOf(DeclarativeConfigException.class) - .hasMessage("Unsupported file format. Supported formats include: 0.4"); - cleanup.addCloseables(closeables); + .hasMessage("Unsupported file format. Supported formats include 0.4, 1.0*"); } } + private static Stream fileFormatArgs() { + return Stream.of( + // Invalid file formats + Arguments.of(null, false), + Arguments.of("0.3", false), + Arguments.of("a0.4", false), + Arguments.of("0.4a", false), + Arguments.of("foo", false), + Arguments.of("1.0-rc.a", false), + // Valid file formats + Arguments.of("0.4", true), + Arguments.of("1.0-rc.1", true), + Arguments.of("1.0-rc.2", true), + Arguments.of("1.0", true)); + } + @Test void create_Defaults() { List closeables = new ArrayList<>(); @@ -99,7 +120,7 @@ void create_Defaults() { OpenTelemetrySdk sdk = OpenTelemetryConfigurationFactory.getInstance() - .create(new OpenTelemetryConfigurationModel().withFileFormat("0.4"), context); + .create(new OpenTelemetryConfigurationModel().withFileFormat("1.0-rc.1"), context); cleanup.addCloseable(sdk); cleanup.addCloseables(closeables); @@ -116,7 +137,7 @@ void create_Disabled() { OpenTelemetryConfigurationFactory.getInstance() .create( new OpenTelemetryConfigurationModel() - .withFileFormat("0.4") + .withFileFormat("1.0-rc.1") .withDisabled(true) // Logger provider configuration should be ignored since SDK is disabled .withLoggerProvider( @@ -210,7 +231,7 @@ void create_Configured() { OpenTelemetryConfigurationFactory.getInstance() .create( new OpenTelemetryConfigurationModel() - .withFileFormat("0.4") + .withFileFormat("1.0-rc.1") .withPropagator( new PropagatorModel() .withCompositeList("tracecontext,baggage,ottrace,b3multi,b3,jaeger")) diff --git a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/YamlDeclarativeConfigPropertiesTest.java b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/YamlDeclarativeConfigPropertiesTest.java index 7f1c3cb3ccc..82a2d384759 100644 --- a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/YamlDeclarativeConfigPropertiesTest.java +++ b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/YamlDeclarativeConfigPropertiesTest.java @@ -22,7 +22,7 @@ class YamlDeclarativeConfigPropertiesTest { private static final String extendedSchema = - "file_format: \"0.4\"\n" + "file_format: \"1.0-rc.1\"\n" + "disabled: false\n" + "\n" + "resource:\n" @@ -69,7 +69,7 @@ void setup() { @Test void configurationSchema() { // Validate can read declarative configuration schema properties - assertThat(structuredConfigProps.getString("file_format")).isEqualTo("0.4"); + assertThat(structuredConfigProps.getString("file_format")).isEqualTo("1.0-rc.1"); DeclarativeConfigProperties resourceProps = structuredConfigProps.getStructured("resource"); assertThat(resourceProps).isNotNull(); List resourceAttributesList = From 5e929d3658d4f85d181ab5a5e3ecded12a7ef483 Mon Sep 17 00:00:00 2001 From: Jack Berg Date: Fri, 20 Jun 2025 14:51:04 -0500 Subject: [PATCH 2/3] Service detector sets service.instance.id --- .../fileconfig/ServiceResourceDetector.java | 11 +++- .../ServiceResourceDetectorTest.java | 64 +++++++++++++++++++ 2 files changed, 73 insertions(+), 2 deletions(-) create mode 100644 sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/ServiceResourceDetectorTest.java diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/ServiceResourceDetector.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/ServiceResourceDetector.java index 8b3352d981a..739fb2f59b8 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/ServiceResourceDetector.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/ServiceResourceDetector.java @@ -10,7 +10,9 @@ import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider; import io.opentelemetry.sdk.autoconfigure.spi.internal.DefaultConfigProperties; import io.opentelemetry.sdk.resources.Resource; +import io.opentelemetry.sdk.resources.ResourceBuilder; import java.util.Collections; +import java.util.UUID; public class ServiceResourceDetector implements ComponentProvider { @Override @@ -25,11 +27,16 @@ public String getName() { @Override public Resource create(DeclarativeConfigProperties config) { + ResourceBuilder builder = Resource.builder(); + ConfigProperties properties = DefaultConfigProperties.create(Collections.emptyMap()); String serviceName = properties.getString("otel.service.name"); if (serviceName != null) { - return Resource.builder().put("service.name", serviceName).build(); + builder.put("service.name", serviceName).build(); } - return Resource.empty(); + + builder.put("service.instance.id", UUID.randomUUID().toString()); + + return builder.build(); } } diff --git a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/ServiceResourceDetectorTest.java b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/ServiceResourceDetectorTest.java new file mode 100644 index 00000000000..4778fe1b614 --- /dev/null +++ b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/ServiceResourceDetectorTest.java @@ -0,0 +1,64 @@ +/* + * 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.common.AttributeKey; +import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; +import io.opentelemetry.sdk.resources.Resource; +import java.util.Objects; +import java.util.UUID; +import org.junit.jupiter.api.Test; +import org.junitpioneer.jupiter.ClearSystemProperty; + +class ServiceResourceDetectorTest { + + @Test + void getTypeAndName() { + ServiceResourceDetector detector = new ServiceResourceDetector(); + + assertThat(detector.getType()).isEqualTo(Resource.class); + assertThat(detector.getName()).isEqualTo("service"); + } + + @Test + @ClearSystemProperty(key = "otel.service.name") + void create_SystemPropertySet() { + System.setProperty("otel.service.name", "test"); + + assertThat(new ServiceResourceDetector().create(DeclarativeConfigProperties.empty())) + .satisfies( + resource -> { + Attributes attributes = resource.getAttributes(); + assertThat(attributes.get(AttributeKey.stringKey("service.name"))).isEqualTo("test"); + assertThatCode( + () -> + UUID.fromString( + Objects.requireNonNull( + attributes.get(AttributeKey.stringKey("service.instance.id"))))) + .doesNotThrowAnyException(); + }); + } + + @Test + void create_NoSystemProperty() { + assertThat(new ServiceResourceDetector().create(DeclarativeConfigProperties.empty())) + .satisfies( + resource -> { + Attributes attributes = resource.getAttributes(); + assertThat(attributes.get(AttributeKey.stringKey("service.name"))).isNull(); + assertThatCode( + () -> + UUID.fromString( + Objects.requireNonNull( + attributes.get(AttributeKey.stringKey("service.instance.id"))))) + .doesNotThrowAnyException(); + }); + } +} From 6facb27626c1e7241819d1bd5502e9556fa9f646 Mon Sep 17 00:00:00 2001 From: Jack Berg Date: Tue, 24 Jun 2025 14:14:11 -0500 Subject: [PATCH 3/3] PR feedback --- .../OpenTelemetryConfigurationFactory.java | 2 ++ .../fileconfig/ServiceResourceDetector.java | 13 +++++++++++-- .../OpenTelemetryConfigurationFactoryTest.java | 2 ++ 3 files changed, 15 insertions(+), 2 deletions(-) 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 5df10285343..313e5d50b76 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 @@ -36,6 +36,8 @@ public OpenTelemetrySdk create( throw new DeclarativeConfigException( "Unsupported file format. Supported formats include 0.4, 1.0*"); } + // TODO(jack-berg): log warning if version is not exact match, which may result in unexpected + // behavior for experimental properties. if (Objects.equals(Boolean.TRUE, model.getDisabled())) { return builder.build(); diff --git a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/ServiceResourceDetector.java b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/ServiceResourceDetector.java index 739fb2f59b8..a8077032ec7 100644 --- a/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/ServiceResourceDetector.java +++ b/sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/ServiceResourceDetector.java @@ -5,6 +5,7 @@ package io.opentelemetry.sdk.extension.incubator.fileconfig; +import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties; import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider; @@ -15,6 +16,14 @@ import java.util.UUID; public class ServiceResourceDetector implements ComponentProvider { + + private static final AttributeKey SERVICE_NAME = AttributeKey.stringKey("service.name"); + private static final AttributeKey SERVICE_INSTANCE_ID = + AttributeKey.stringKey("service.instance.id"); + + // multiple calls to this resource provider should return the same value + private static final String RANDOM_SERVICE_INSTANCE_ID = UUID.randomUUID().toString(); + @Override public Class getType() { return Resource.class; @@ -32,10 +41,10 @@ public Resource create(DeclarativeConfigProperties config) { ConfigProperties properties = DefaultConfigProperties.create(Collections.emptyMap()); String serviceName = properties.getString("otel.service.name"); if (serviceName != null) { - builder.put("service.name", serviceName).build(); + builder.put(SERVICE_NAME, serviceName).build(); } - builder.put("service.instance.id", UUID.randomUUID().toString()); + builder.put(SERVICE_INSTANCE_ID, RANDOM_SERVICE_INSTANCE_ID); return builder.build(); } diff --git a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/OpenTelemetryConfigurationFactoryTest.java b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/OpenTelemetryConfigurationFactoryTest.java index 961fe87d696..ba535627c0a 100644 --- a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/OpenTelemetryConfigurationFactoryTest.java +++ b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/OpenTelemetryConfigurationFactoryTest.java @@ -105,6 +105,8 @@ private static Stream fileFormatArgs() { Arguments.of("0.4a", false), Arguments.of("foo", false), Arguments.of("1.0-rc.a", false), + Arguments.of("1.0.0", false), + Arguments.of("1.0.3", false), // Valid file formats Arguments.of("0.4", true), Arguments.of("1.0-rc.1", true),