From 57d00bdc0fb5ba0802f90b08e2fe3a48d1ca1e77 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Thu, 15 Feb 2024 21:11:11 +0100 Subject: [PATCH] fix otel.properties in spring boot starter (#10559) --- .../OpenTelemetryAutoConfiguration.java | 14 +++++++--- .../DeprecatedPropagationProperties.java | 26 +++++++++++++++++++ .../PropagationAutoConfiguration.java | 4 +-- .../propagators/PropagationProperties.java | 15 +++++------ .../resources/SpringConfigProperties.java | 9 ++++++- .../otlp/OtlpExporterPropertiesTest.java | 4 ++- .../PropagationPropertiesTest.java | 5 ++-- .../resources/SpringConfigPropertiesTest.java | 6 ++++- .../src/main/resources/application.properties | 1 - .../src/main/resources/application.yaml | 7 +++++ .../smoketest/OtelSpringStarterSmokeTest.java | 11 ++++++++ 11 files changed, 83 insertions(+), 19 deletions(-) create mode 100644 instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/propagators/DeprecatedPropagationProperties.java delete mode 100644 smoke-tests-otel-starter/src/main/resources/application.properties create mode 100644 smoke-tests-otel-starter/src/main/resources/application.yaml 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 75a15faa11e2..a0e84875ae0d 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 @@ -13,6 +13,7 @@ import io.opentelemetry.instrumentation.spring.autoconfigure.exporters.otlp.OtlpMetricExporterAutoConfiguration; import io.opentelemetry.instrumentation.spring.autoconfigure.exporters.otlp.OtlpSpanExporterAutoConfiguration; import io.opentelemetry.instrumentation.spring.autoconfigure.internal.MapConverter; +import io.opentelemetry.instrumentation.spring.autoconfigure.propagators.PropagationProperties; import io.opentelemetry.instrumentation.spring.autoconfigure.resources.OtelResourceAutoConfiguration; import io.opentelemetry.instrumentation.spring.autoconfigure.resources.SpringConfigProperties; import io.opentelemetry.sdk.OpenTelemetrySdk; @@ -57,7 +58,11 @@ *

Updates the sampler probability for the configured {@link TracerProvider}. */ @Configuration -@EnableConfigurationProperties({SamplerProperties.class, OtlpExporterProperties.class}) +@EnableConfigurationProperties({ + SamplerProperties.class, + OtlpExporterProperties.class, + PropagationProperties.class +}) public class OpenTelemetryAutoConfiguration { public OpenTelemetryAutoConfiguration() {} @@ -96,8 +101,11 @@ static class Metric {} @Bean @ConditionalOnMissingBean ConfigProperties configProperties( - Environment env, OtlpExporterProperties otlpExporterProperties) { - return new SpringConfigProperties(env, new SpelExpressionParser(), otlpExporterProperties); + Environment env, + OtlpExporterProperties otlpExporterProperties, + PropagationProperties propagationProperties) { + return new SpringConfigProperties( + env, new SpelExpressionParser(), otlpExporterProperties, propagationProperties); } @Bean(destroyMethod = "") // SDK components are shutdown from the OpenTelemetry instance diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/propagators/DeprecatedPropagationProperties.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/propagators/DeprecatedPropagationProperties.java new file mode 100644 index 000000000000..0645e1d5a336 --- /dev/null +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/propagators/DeprecatedPropagationProperties.java @@ -0,0 +1,26 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.spring.autoconfigure.propagators; + +import java.util.Arrays; +import java.util.List; +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** Configuration for propagators. */ +@ConfigurationProperties(prefix = "otel.propagation") +@Deprecated // use otel.propagators instead +public final class DeprecatedPropagationProperties { + + private List type = Arrays.asList("tracecontext", "baggage"); + + public List getType() { + return type; + } + + public void setType(List type) { + this.type = type; + } +} diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/propagators/PropagationAutoConfiguration.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/propagators/PropagationAutoConfiguration.java index 7bf656efefba..42a59349343e 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/propagators/PropagationAutoConfiguration.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/propagators/PropagationAutoConfiguration.java @@ -22,7 +22,7 @@ /** Configures {@link ContextPropagators} bean for propagation. */ @Configuration -@EnableConfigurationProperties(PropagationProperties.class) +@EnableConfigurationProperties(DeprecatedPropagationProperties.class) @AutoConfigureBefore(OpenTelemetryAutoConfiguration.class) @ConditionalOnProperty(prefix = "otel.propagation", name = "enabled", matchIfMissing = true) @SuppressWarnings("deprecation") @@ -44,7 +44,7 @@ static class PropagatorsConfiguration { @Bean TextMapPropagator compositeTextMapPropagator( BeanFactory beanFactory, - PropagationProperties properties, + DeprecatedPropagationProperties properties, ConfigProperties configProperties) { return CompositeTextMapPropagatorFactory.getCompositeTextMapPropagator( beanFactory, configProperties.getList("otel.propagators", properties.getType())); diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/propagators/PropagationProperties.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/propagators/PropagationProperties.java index ccc873b43578..6c4ed8f92420 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/propagators/PropagationProperties.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/propagators/PropagationProperties.java @@ -5,22 +5,21 @@ package io.opentelemetry.instrumentation.spring.autoconfigure.propagators; -import java.util.Arrays; +import java.util.Collections; import java.util.List; import org.springframework.boot.context.properties.ConfigurationProperties; /** Configuration for propagators. */ -@ConfigurationProperties(prefix = "otel.propagation") -@Deprecated // use otel.propagators instead +@ConfigurationProperties(prefix = "otel") public final class PropagationProperties { - private List type = Arrays.asList("tracecontext", "baggage"); + private List propagators = Collections.emptyList(); - public List getType() { - return type; + public List getPropagators() { + return propagators; } - public void setType(List type) { - this.type = type; + public void setPropagators(List propagators) { + this.propagators = propagators; } } diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/resources/SpringConfigProperties.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/resources/SpringConfigProperties.java index 95c9ca90fff1..42a137f892fe 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/resources/SpringConfigProperties.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/resources/SpringConfigProperties.java @@ -7,6 +7,7 @@ import io.opentelemetry.exporter.otlp.internal.OtlpConfigUtil; import io.opentelemetry.instrumentation.spring.autoconfigure.exporters.otlp.OtlpExporterProperties; +import io.opentelemetry.instrumentation.spring.autoconfigure.propagators.PropagationProperties; import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import io.opentelemetry.sdk.autoconfigure.spi.internal.DefaultConfigProperties; import java.time.Duration; @@ -22,14 +23,17 @@ public class SpringConfigProperties implements ConfigProperties { private final ExpressionParser parser; private final OtlpExporterProperties otlpExporterProperties; + private final PropagationProperties propagationProperties; public SpringConfigProperties( Environment environment, ExpressionParser parser, - OtlpExporterProperties otlpExporterProperties) { + OtlpExporterProperties otlpExporterProperties, + PropagationProperties propagationProperties) { this.environment = environment; this.parser = parser; this.otlpExporterProperties = otlpExporterProperties; + this.propagationProperties = propagationProperties; } @Nullable @@ -71,6 +75,9 @@ public Double getDouble(String name) { @SuppressWarnings("unchecked") @Override public List getList(String name) { + if (name.equals("otel.propagators")) { + return propagationProperties.getPropagators(); + } List value = environment.getProperty(name, List.class); return value == null ? Collections.emptyList() : value; } diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/exporters/otlp/OtlpExporterPropertiesTest.java b/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/exporters/otlp/OtlpExporterPropertiesTest.java index 8d61a4e7d4ae..32bd23f56478 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/exporters/otlp/OtlpExporterPropertiesTest.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/exporters/otlp/OtlpExporterPropertiesTest.java @@ -9,6 +9,7 @@ import static org.assertj.core.api.Assertions.entry; import io.opentelemetry.instrumentation.spring.autoconfigure.OpenTelemetryAutoConfiguration; +import io.opentelemetry.instrumentation.spring.autoconfigure.propagators.PropagationProperties; import io.opentelemetry.instrumentation.spring.autoconfigure.resources.OtelResourceAutoConfiguration; import io.opentelemetry.instrumentation.spring.autoconfigure.resources.SpringConfigProperties; import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; @@ -90,6 +91,7 @@ private static ConfigProperties getConfig(AssertableApplicationContext context) return new SpringConfigProperties( context.getBean("environment", Environment.class), new SpelExpressionParser(), - context.getBean(OtlpExporterProperties.class)); + context.getBean(OtlpExporterProperties.class), + new PropagationProperties()); } } diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/propagators/PropagationPropertiesTest.java b/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/propagators/PropagationPropertiesTest.java index d41c08280769..78176f7a1395 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/propagators/PropagationPropertiesTest.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/propagators/PropagationPropertiesTest.java @@ -31,7 +31,8 @@ void hasType() { .withPropertyValues("otel.propagation.type=xray,b3") .run( context -> { - PropagationProperties propertiesBean = context.getBean(PropagationProperties.class); + DeprecatedPropagationProperties propertiesBean = + context.getBean(DeprecatedPropagationProperties.class); assertThat(propertiesBean.getType()).isEqualTo(Arrays.asList("xray", "b3")); }); @@ -43,7 +44,7 @@ void hasDefaultTypes() { this.contextRunner.run( context -> - assertThat(context.getBean(PropagationProperties.class).getType()) + assertThat(context.getBean(DeprecatedPropagationProperties.class).getType()) .containsExactly("tracecontext", "baggage")); } } diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/resources/SpringConfigPropertiesTest.java b/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/resources/SpringConfigPropertiesTest.java index 779b974db8ad..40cef893c54f 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/resources/SpringConfigPropertiesTest.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/resources/SpringConfigPropertiesTest.java @@ -9,6 +9,7 @@ import static org.assertj.core.api.Assertions.entry; import io.opentelemetry.instrumentation.spring.autoconfigure.exporters.otlp.OtlpExporterProperties; +import io.opentelemetry.instrumentation.spring.autoconfigure.propagators.PropagationProperties; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.runner.ApplicationContextRunner; @@ -29,7 +30,10 @@ void shouldInitializeAttributesByMapInArow() { Environment env = context.getBean("environment", Environment.class); SpringConfigProperties config = new SpringConfigProperties( - env, new SpelExpressionParser(), new OtlpExporterProperties()); + env, + new SpelExpressionParser(), + new OtlpExporterProperties(), + new PropagationProperties()); assertThat(config.getMap("otel.springboot.test.map")) .contains( diff --git a/smoke-tests-otel-starter/src/main/resources/application.properties b/smoke-tests-otel-starter/src/main/resources/application.properties deleted file mode 100644 index 66a3ed1f49a0..000000000000 --- a/smoke-tests-otel-starter/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ -otel.instrumentation.logback-appender.experimental.capture-code-attributes=true diff --git a/smoke-tests-otel-starter/src/main/resources/application.yaml b/smoke-tests-otel-starter/src/main/resources/application.yaml new file mode 100644 index 000000000000..3404552d2198 --- /dev/null +++ b/smoke-tests-otel-starter/src/main/resources/application.yaml @@ -0,0 +1,7 @@ +otel: + instrumentation: + logback-appender: + experimental: + capture-code-attributes: true + propagators: + - b3 diff --git a/smoke-tests-otel-starter/src/test/java/io/opentelemetry/smoketest/OtelSpringStarterSmokeTest.java b/smoke-tests-otel-starter/src/test/java/io/opentelemetry/smoketest/OtelSpringStarterSmokeTest.java index d7da4bd906a2..814b6aeb3040 100644 --- a/smoke-tests-otel-starter/src/test/java/io/opentelemetry/smoketest/OtelSpringStarterSmokeTest.java +++ b/smoke-tests-otel-starter/src/test/java/io/opentelemetry/smoketest/OtelSpringStarterSmokeTest.java @@ -8,6 +8,7 @@ import static org.assertj.core.api.Assertions.assertThat; import io.opentelemetry.api.trace.SpanKind; +import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import io.opentelemetry.sdk.logs.data.LogRecordData; import io.opentelemetry.sdk.logs.export.LogRecordExporter; import io.opentelemetry.sdk.metrics.data.AggregationTemporality; @@ -54,6 +55,8 @@ class OtelSpringStarterSmokeTest { @Autowired private TestRestTemplate testRestTemplate; + @Autowired private ConfigProperties configProperties; + @Configuration(proxyBeanMethods = false) static class TestConfiguration { @Bean @@ -72,6 +75,14 @@ public LogRecordExporter logRecordExporter() { } } + @Test + void propertyConversion() { + assertThat(configProperties.getMap("otel.exporter.otlp.headers")) + .containsEntry("a", "1") + .containsEntry("b", "2"); + assertThat(configProperties.getList("otel.propagators")).containsExactly("b3"); + } + @Test void shouldSendTelemetry() throws InterruptedException {