diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/EmbeddedConfigFile.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/EmbeddedConfigFile.java index 5fce4844f7af..b2222baf489f 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/EmbeddedConfigFile.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/EmbeddedConfigFile.java @@ -46,24 +46,20 @@ class EmbeddedConfigFile { private EmbeddedConfigFile() {} static OpenTelemetryConfigurationModel extractModel(ConfigurableEnvironment environment) { - Map props = extractSpringProperties(environment); + Map props = extractSpringProperties(environment); return convertToOpenTelemetryConfigurationModel(props); } - private static Map extractSpringProperties(ConfigurableEnvironment environment) { + private static Map extractSpringProperties(ConfigurableEnvironment environment) { MutablePropertySources propertySources = environment.getPropertySources(); - Map props = new HashMap<>(); + Map props = new HashMap<>(); for (PropertySource propertySource : propertySources) { if (propertySource instanceof EnumerablePropertySource) { for (String propertyName : ((EnumerablePropertySource) propertySource).getPropertyNames()) { if (propertyName.startsWith("otel.")) { - Object property = propertySource.getProperty(propertyName); - // Resolve ${} placeholders in String values while preserving types for others - if (property instanceof String) { - property = environment.resolvePlaceholders((String) property); - } + String property = environment.getProperty(propertyName); if (Objects.equals(property, "")) { property = null; // spring returns empty string for yaml null } @@ -100,7 +96,7 @@ private static Map extractSpringProperties(ConfigurableEnvironme } static OpenTelemetryConfigurationModel convertToOpenTelemetryConfigurationModel( - Map flatProps) { + Map flatProps) { Map nested = convertFlatPropsToNested(flatProps); return getObjectMapper().convertValue(nested, OpenTelemetryConfigurationModel.class); @@ -116,12 +112,12 @@ static ObjectMapper getObjectMapper() { * ["one", "two"]}}}} */ @SuppressWarnings("unchecked") - static Map convertFlatPropsToNested(Map flatProps) { + static Map convertFlatPropsToNested(Map flatProps) { Map result = new HashMap<>(); - for (Map.Entry entry : flatProps.entrySet()) { + for (Map.Entry entry : flatProps.entrySet()) { String key = entry.getKey(); - Object value = entry.getValue(); + String value = entry.getValue(); // Split the key by dots String[] parts = key.split("\\."); diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/OpenTelemetryAutoConfiguration.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/OpenTelemetryAutoConfiguration.java index af79bfbc6154..cf3f4d445225 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/OpenTelemetryAutoConfiguration.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/OpenTelemetryAutoConfiguration.java @@ -8,6 +8,7 @@ import static java.util.Objects.requireNonNull; import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.api.incubator.ExtendedOpenTelemetry; import io.opentelemetry.api.incubator.config.ConfigProvider; import io.opentelemetry.api.trace.TracerProvider; import io.opentelemetry.common.ComponentLoader; @@ -61,7 +62,7 @@ import org.springframework.core.env.Environment; /** - * Create {@link io.opentelemetry.api.OpenTelemetry} bean if bean is missing. + * Create {@link OpenTelemetry} bean if bean is missing. * *

Adds span exporter beans to the active tracer provider. * @@ -172,12 +173,12 @@ public OpenTelemetry openTelemetry( model, new OpenTelemetrySdkComponentLoader(applicationContext)); Runtime.getRuntime().addShutdownHook(new Thread(sdk::close)); logStart(); - return sdk; + return new SpringOpenTelemetrySdk(sdk, SpringConfigProvider.create(model)); } @Bean - public ConfigProvider configProvider(OpenTelemetryConfigurationModel model) { - return SpringConfigProvider.create(model); + public ConfigProvider configProvider(OpenTelemetry openTelemetry) { + return ((ExtendedOpenTelemetry) openTelemetry).getConfigProvider(); } /** diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/EmbeddedConfigFileTest.java b/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/EmbeddedConfigFileTest.java index 201fda267d22..2396a1147ad3 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/EmbeddedConfigFileTest.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/EmbeddedConfigFileTest.java @@ -16,7 +16,7 @@ class EmbeddedConfigFileTest { @Test void convertFlatPropsToNested_simpleProperties() { - Map flatProps = new HashMap<>(); + Map flatProps = new HashMap<>(); flatProps.put("resource.service.name", "my-service"); flatProps.put("traces.exporter", "otlp"); @@ -55,7 +55,7 @@ void convertFlatPropsToNested_simpleProperties() { @Test void convertFlatPropsToNested_arrayProperties() { - Map flatProps = new HashMap<>(); + Map flatProps = new HashMap<>(); flatProps.put("instrumentation.java.list[0]", "one"); flatProps.put("instrumentation.java.list[1]", "two"); flatProps.put("instrumentation.java.list[2]", "three"); @@ -89,7 +89,7 @@ void convertFlatPropsToNested_arrayProperties() { @Test void convertFlatPropsToNested_mixedPropertiesAndArrays() { - Map flatProps = new HashMap<>(); + Map flatProps = new HashMap<>(); flatProps.put("resource.service.name", "test-service"); flatProps.put("resource.attributes[0]", "key1=value1"); flatProps.put("resource.attributes[1]", "key2=value2"); @@ -124,7 +124,7 @@ void convertFlatPropsToNested_mixedPropertiesAndArrays() { @Test void convertFlatPropsToNested_emptyMap() { - Map flatProps = new HashMap<>(); + Map flatProps = new HashMap<>(); Map result = EmbeddedConfigFile.convertFlatPropsToNested(flatProps); @@ -133,7 +133,7 @@ void convertFlatPropsToNested_emptyMap() { @Test void convertFlatPropsToNested_singleLevelProperty() { - Map flatProps = new HashMap<>(); + Map flatProps = new HashMap<>(); flatProps.put("enabled", "true"); Map result = EmbeddedConfigFile.convertFlatPropsToNested(flatProps); @@ -143,7 +143,7 @@ void convertFlatPropsToNested_singleLevelProperty() { @Test void convertFlatPropsToNested_arrayWithGaps() { - Map flatProps = new HashMap<>(); + Map flatProps = new HashMap<>(); flatProps.put("list[0]", "first"); flatProps.put("list[2]", "third"); @@ -161,7 +161,7 @@ void convertFlatPropsToNested_arrayWithGaps() { @Test void convertFlatPropsToNested_deeplyNestedProperties() { - Map flatProps = new HashMap<>(); + Map flatProps = new HashMap<>(); flatProps.put("a.b.c.d.e", "deep-value"); Map result = EmbeddedConfigFile.convertFlatPropsToNested(flatProps); @@ -183,7 +183,7 @@ void convertFlatPropsToNested_deeplyNestedProperties() { @Test void convertFlatPropsToNested_nestedArrays() { - Map flatProps = new HashMap<>(); + Map flatProps = new HashMap<>(); flatProps.put("outer[0].inner[0]", "value1"); flatProps.put("outer[0].inner[1]", "value2"); flatProps.put("outer[1].inner[0]", "value3"); diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/testDeclarativeConfig/java/io/opentelemetry/instrumentation/spring/autoconfigure/DeclarativeConfigTest.java b/instrumentation/spring/spring-boot-autoconfigure/src/testDeclarativeConfig/java/io/opentelemetry/instrumentation/spring/autoconfigure/DeclarativeConfigTest.java index 7bb5b53f5832..efddae60625f 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/testDeclarativeConfig/java/io/opentelemetry/instrumentation/spring/autoconfigure/DeclarativeConfigTest.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/testDeclarativeConfig/java/io/opentelemetry/instrumentation/spring/autoconfigure/DeclarativeConfigTest.java @@ -66,9 +66,13 @@ void initializeProvidersAndOpenTelemetry() { assertThat(c.getDeclarativeConfig("foo")) .isNotNull() .satisfies( - instrumentationConfig -> - assertThat(instrumentationConfig.getString("bar")) - .isEqualTo("baz")))); + instrumentationConfig -> { + assertThat(instrumentationConfig.getString("string_key")) + .isEqualTo("string_value"); + assertThat(instrumentationConfig.getBoolean("bool_key")).isTrue(); + assertThat(instrumentationConfig.getLong("int_key")) + .isEqualTo(42); + }))); } @Test diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/testDeclarativeConfig/resources/application.yaml b/instrumentation/spring/spring-boot-autoconfigure/src/testDeclarativeConfig/resources/application.yaml index 455ea6b8d568..f0a0de4cfffb 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/testDeclarativeConfig/resources/application.yaml +++ b/instrumentation/spring/spring-boot-autoconfigure/src/testDeclarativeConfig/resources/application.yaml @@ -14,4 +14,7 @@ otel: instrumentation/development: java: foo: - bar: baz + string_key: string_value + int_key: 42 + bool_key: true +