Skip to content

Commit 696ea96

Browse files
committed
support properties customizer and default properties
1 parent fdb0773 commit 696ea96

File tree

8 files changed

+95
-51
lines changed

8 files changed

+95
-51
lines changed

instrumentation/spring/spring-boot-autoconfigure/build.gradle.kts

-9
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,7 @@ group = "io.opentelemetry.instrumentation"
99
val versions: Map<String, String> by project
1010
val springBootVersion = versions["org.springframework.boot"]
1111

12-
configurations.all {
13-
resolutionStrategy {
14-
force("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure:1.36.0-SNAPSHOT")
15-
force("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi:1.36.0-SNAPSHOT")
16-
}
17-
}
18-
1912
dependencies {
20-
implementation("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure:1.36.0-SNAPSHOT")
21-
implementation("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi:1.36.0-SNAPSHOT")
2213
implementation("org.springframework.boot:spring-boot-autoconfigure:$springBootVersion")
2314
annotationProcessor("org.springframework.boot:spring-boot-autoconfigure-processor:$springBootVersion")
2415
annotationProcessor("org.springframework.boot:spring-boot-configuration-processor:$springBootVersion")

instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/OpenTelemetryAutoConfiguration.java

+12-19
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
import io.opentelemetry.instrumentation.spring.autoconfigure.resources.SpringResourceProvider;
1818
import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk;
1919
import io.opentelemetry.sdk.autoconfigure.internal.AutoConfigureUtil;
20-
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
2120
import io.opentelemetry.sdk.autoconfigure.spi.ResourceProvider;
2221
import java.util.Optional;
2322
import org.springframework.beans.factory.ObjectProvider;
@@ -30,7 +29,6 @@
3029
import org.springframework.context.annotation.Bean;
3130
import org.springframework.context.annotation.Configuration;
3231
import org.springframework.core.env.Environment;
33-
import org.springframework.expression.spel.standard.SpelExpressionParser;
3432

3533
/**
3634
* Create {@link io.opentelemetry.api.OpenTelemetry} bean if bean is missing.
@@ -61,21 +59,6 @@ public MapConverter mapConverter() {
6159
return new MapConverter();
6260
}
6361

64-
@Bean
65-
@ConditionalOnMissingBean
66-
ConfigProperties configProperties(
67-
Environment env,
68-
OtlpExporterProperties otlpExporterProperties,
69-
OtelResourceProperties resourceProperties,
70-
PropagationProperties propagationProperties) {
71-
return new SpringConfigProperties(
72-
env,
73-
new SpelExpressionParser(),
74-
otlpExporterProperties,
75-
resourceProperties,
76-
propagationProperties);
77-
}
78-
7962
@Bean
8063
public SpringComponentLoader springComponentLoader(ApplicationContext applicationContext) {
8164
return new SpringComponentLoader(applicationContext);
@@ -95,14 +78,24 @@ public ResourceProvider otelDistroVersionResourceProvider() {
9578
// If you change the bean name, also change it in the OpenTelemetryJdbcDriverAutoConfiguration
9679
// class
9780
public OpenTelemetry openTelemetry(
81+
Environment env,
82+
OtlpExporterProperties otlpExporterProperties,
83+
OtelResourceProperties resourceProperties,
84+
PropagationProperties propagationProperties,
9885
SpringComponentLoader componentLoader,
99-
ConfigProperties configProperties,
10086
ObjectProvider<OpenTelemetryInjector> openTelemetryConsumerProvider) {
10187

10288
OpenTelemetry openTelemetry =
10389
AutoConfigureUtil.setComponentLoader(
10490
AutoConfigureUtil.setConfigPropertiesCustomizer(
105-
AutoConfiguredOpenTelemetrySdk.builder(), c -> configProperties),
91+
AutoConfiguredOpenTelemetrySdk.builder(),
92+
c ->
93+
SpringConfigProperties.create(
94+
env,
95+
otlpExporterProperties,
96+
resourceProperties,
97+
propagationProperties,
98+
c)),
10699
componentLoader)
107100
.build()
108101
.getOpenTelemetrySdk();

instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/properties/SpringConfigProperties.java

+34-10
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import javax.annotation.Nullable;
1616
import org.springframework.core.env.Environment;
1717
import org.springframework.expression.ExpressionParser;
18+
import org.springframework.expression.spel.standard.SpelExpressionParser;
1819

1920
public class SpringConfigProperties implements ConfigProperties {
2021
private final Environment environment;
@@ -23,18 +24,37 @@ public class SpringConfigProperties implements ConfigProperties {
2324
private final OtlpExporterProperties otlpExporterProperties;
2425
private final OtelResourceProperties resourceProperties;
2526
private final PropagationProperties propagationProperties;
27+
private final ConfigProperties fallback;
2628

2729
public SpringConfigProperties(
2830
Environment environment,
2931
ExpressionParser parser,
3032
OtlpExporterProperties otlpExporterProperties,
3133
OtelResourceProperties resourceProperties,
32-
PropagationProperties propagationProperties) {
34+
PropagationProperties propagationProperties,
35+
ConfigProperties fallback) {
3336
this.environment = environment;
3437
this.parser = parser;
3538
this.otlpExporterProperties = otlpExporterProperties;
3639
this.resourceProperties = resourceProperties;
3740
this.propagationProperties = propagationProperties;
41+
this.fallback = fallback;
42+
}
43+
44+
// visible for testing
45+
public static ConfigProperties create(
46+
Environment env,
47+
OtlpExporterProperties otlpExporterProperties,
48+
OtelResourceProperties resourceProperties,
49+
PropagationProperties propagationProperties,
50+
ConfigProperties fallback) {
51+
return new SpringConfigProperties(
52+
env,
53+
new SpelExpressionParser(),
54+
otlpExporterProperties,
55+
resourceProperties,
56+
propagationProperties,
57+
fallback);
3858
}
3959

4060
@Nullable
@@ -46,31 +66,31 @@ public String getString(String name) {
4666
// in specification to default to `http/protobuf`
4767
return OtlpConfigUtil.PROTOCOL_HTTP_PROTOBUF;
4868
}
49-
return value;
69+
return or(value, fallback.getString(name));
5070
}
5171

5272
@Nullable
5373
@Override
5474
public Boolean getBoolean(String name) {
55-
return environment.getProperty(name, Boolean.class);
75+
return or(environment.getProperty(name, Boolean.class), fallback.getBoolean(name));
5676
}
5777

5878
@Nullable
5979
@Override
6080
public Integer getInt(String name) {
61-
return environment.getProperty(name, Integer.class);
81+
return or(environment.getProperty(name, Integer.class), fallback.getInt(name));
6282
}
6383

6484
@Nullable
6585
@Override
6686
public Long getLong(String name) {
67-
return environment.getProperty(name, Long.class);
87+
return or(environment.getProperty(name, Long.class), fallback.getLong(name));
6888
}
6989

7090
@Nullable
7191
@Override
7292
public Double getDouble(String name) {
73-
return environment.getProperty(name, Double.class);
93+
return or(environment.getProperty(name, Double.class), fallback.getDouble(name));
7494
}
7595

7696
@SuppressWarnings("unchecked")
@@ -80,16 +100,15 @@ public List<String> getList(String name) {
80100
return propagationProperties.getPropagators();
81101
}
82102

83-
List<String> value = environment.getProperty(name, List.class);
84-
return value == null ? Collections.emptyList() : value;
103+
return or(environment.getProperty(name, List.class), fallback.getList(name));
85104
}
86105

87106
@Nullable
88107
@Override
89108
public Duration getDuration(String name) {
90109
String value = getString(name);
91110
if (value == null) {
92-
return null;
111+
return fallback.getDuration(name);
93112
}
94113
return DefaultConfigProperties.createFromMap(Collections.singletonMap(name, value))
95114
.getDuration(name);
@@ -116,8 +135,13 @@ public Map<String, String> getMap(String name) {
116135

117136
String value = environment.getProperty(name);
118137
if (value == null) {
119-
return Collections.emptyMap();
138+
return fallback.getMap(name);
120139
}
121140
return (Map<String, String>) parser.parseExpression(value).getValue();
122141
}
142+
143+
@Nullable
144+
private static <T> T or(@Nullable T first, @Nullable T second) {
145+
return first != null ? first : second;
146+
}
123147
}

instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/properties/OtlpExporterPropertiesTest.java

+4-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@
1010

1111
import io.opentelemetry.instrumentation.spring.autoconfigure.OpenTelemetryAutoConfiguration;
1212
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
13+
import io.opentelemetry.sdk.autoconfigure.spi.internal.DefaultConfigProperties;
1314
import java.util.Arrays;
15+
import java.util.Collections;
1416
import java.util.stream.Stream;
1517
import org.junit.jupiter.api.DisplayName;
1618
import org.junit.jupiter.api.Test;
@@ -90,6 +92,7 @@ private static ConfigProperties getConfig(AssertableApplicationContext context)
9092
new SpelExpressionParser(),
9193
context.getBean(OtlpExporterProperties.class),
9294
new OtelResourceProperties(),
93-
new PropagationProperties());
95+
new PropagationProperties(),
96+
DefaultConfigProperties.createFromMap(Collections.emptyMap()));
9497
}
9598
}

instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/resources/SpringConfigPropertiesTest.java

+11-1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@
1212
import io.opentelemetry.instrumentation.spring.autoconfigure.properties.OtlpExporterProperties;
1313
import io.opentelemetry.instrumentation.spring.autoconfigure.properties.PropagationProperties;
1414
import io.opentelemetry.instrumentation.spring.autoconfigure.properties.SpringConfigProperties;
15+
import io.opentelemetry.sdk.autoconfigure.spi.internal.DefaultConfigProperties;
16+
import java.util.HashMap;
17+
import java.util.Map;
1518
import org.junit.jupiter.api.DisplayName;
1619
import org.junit.jupiter.api.Test;
1720
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
@@ -30,19 +33,26 @@ void shouldInitializeAttributesByMapInArow() {
3033
.run(
3134
context -> {
3235
Environment env = context.getBean("environment", Environment.class);
36+
Map<String, String> fallback = new HashMap<>();
37+
fallback.put("fallback", "fallbackVal");
38+
fallback.put("otel.springboot.test.map", "hidden");
39+
3340
SpringConfigProperties config =
3441
new SpringConfigProperties(
3542
env,
3643
new SpelExpressionParser(),
3744
new OtlpExporterProperties(),
3845
new OtelResourceProperties(),
39-
new PropagationProperties());
46+
new PropagationProperties(),
47+
DefaultConfigProperties.createFromMap(fallback));
4048

4149
assertThat(config.getMap("otel.springboot.test.map"))
4250
.contains(
4351
entry("environment", "dev"),
4452
entry("xyz", "foo"),
4553
entry("service.instance.id", "id-example"));
54+
55+
assertThat(config.getString("fallback")).isEqualTo("fallbackVal");
4656
});
4757
}
4858
}

instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/resources/SpringResourceProviderTest.java

+16-1
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,23 @@
99
import static io.opentelemetry.semconv.ResourceAttributes.SERVICE_VERSION;
1010

1111
import io.opentelemetry.instrumentation.spring.autoconfigure.OpenTelemetryAutoConfiguration;
12+
import io.opentelemetry.instrumentation.spring.autoconfigure.properties.OtelResourceProperties;
13+
import io.opentelemetry.instrumentation.spring.autoconfigure.properties.OtlpExporterProperties;
14+
import io.opentelemetry.instrumentation.spring.autoconfigure.properties.PropagationProperties;
15+
import io.opentelemetry.instrumentation.spring.autoconfigure.properties.SpringConfigProperties;
1216
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
17+
import io.opentelemetry.sdk.autoconfigure.spi.internal.DefaultConfigProperties;
1318
import io.opentelemetry.sdk.testing.assertj.AttributesAssert;
1419
import io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions;
20+
import java.util.Collections;
1521
import java.util.Properties;
1622
import org.junit.jupiter.api.DisplayName;
1723
import org.junit.jupiter.api.Test;
1824
import org.springframework.boot.autoconfigure.AutoConfigurations;
1925
import org.springframework.boot.info.BuildProperties;
2026
import org.springframework.boot.test.context.assertj.AssertableApplicationContext;
2127
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
28+
import org.springframework.core.env.Environment;
2229

2330
public class SpringResourceProviderTest {
2431

@@ -56,10 +63,18 @@ void shouldDetermineServiceNameAndVersionBySpringApplicationVersion() {
5663
}
5764

5865
private static AttributesAssert assertResourceAttributes(AssertableApplicationContext context) {
66+
ConfigProperties configProperties =
67+
SpringConfigProperties.create(
68+
context.getBean(Environment.class),
69+
new OtlpExporterProperties(),
70+
new OtelResourceProperties(),
71+
new PropagationProperties(),
72+
DefaultConfigProperties.createFromMap(Collections.emptyMap()));
73+
5974
return OpenTelemetryAssertions.assertThat(
6075
context
6176
.getBean(SpringResourceProvider.class)
62-
.createResource(context.getBean(ConfigProperties.class))
77+
.createResource(configProperties)
6378
.getAttributes());
6479
}
6580
}

smoke-tests-otel-starter/build.gradle.kts

-9
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,7 @@ otelJava {
1010
minJavaVersionSupported.set(JavaVersion.VERSION_17)
1111
}
1212

13-
configurations.all {
14-
resolutionStrategy {
15-
force("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure:1.36.0-SNAPSHOT")
16-
force("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi:1.36.0-SNAPSHOT")
17-
}
18-
}
19-
2013
dependencies {
21-
implementation("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure:1.36.0-SNAPSHOT")
22-
implementation("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi:1.36.0-SNAPSHOT")
2314
implementation("org.springframework.boot:spring-boot-starter-web")
2415
implementation("org.springframework.boot:spring-boot-starter-data-jdbc")
2516
implementation("com.h2database:h2")

smoke-tests-otel-starter/src/test/java/io/opentelemetry/smoketest/OtelSpringStarterSmokeTest.java

+18-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,12 @@
99

1010
import io.opentelemetry.api.common.AttributeKey;
1111
import io.opentelemetry.api.trace.SpanKind;
12+
import io.opentelemetry.instrumentation.spring.autoconfigure.properties.OtelResourceProperties;
13+
import io.opentelemetry.instrumentation.spring.autoconfigure.properties.OtlpExporterProperties;
14+
import io.opentelemetry.instrumentation.spring.autoconfigure.properties.PropagationProperties;
15+
import io.opentelemetry.instrumentation.spring.autoconfigure.properties.SpringConfigProperties;
1216
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
17+
import io.opentelemetry.sdk.autoconfigure.spi.internal.DefaultConfigProperties;
1318
import io.opentelemetry.sdk.autoconfigure.spi.logs.ConfigurableLogRecordExporterProvider;
1419
import io.opentelemetry.sdk.autoconfigure.spi.metrics.ConfigurableMetricExporterProvider;
1520
import io.opentelemetry.sdk.autoconfigure.spi.traces.ConfigurableSpanExporterProvider;
@@ -27,13 +32,15 @@
2732
import io.opentelemetry.semconv.SemanticAttributes;
2833
import io.opentelemetry.spring.smoketest.OtelSpringStarterSmokeTestApplication;
2934
import io.opentelemetry.spring.smoketest.OtelSpringStarterSmokeTestController;
35+
import java.util.Collections;
3036
import java.util.List;
3137
import org.junit.jupiter.api.Test;
3238
import org.springframework.beans.factory.annotation.Autowired;
3339
import org.springframework.boot.test.context.SpringBootTest;
3440
import org.springframework.boot.test.web.client.TestRestTemplate;
3541
import org.springframework.context.annotation.Bean;
3642
import org.springframework.context.annotation.Configuration;
43+
import org.springframework.core.env.Environment;
3744

3845
@SpringBootTest(
3946
classes = {
@@ -63,7 +70,10 @@ class OtelSpringStarterSmokeTest {
6370

6471
@Autowired private TestRestTemplate testRestTemplate;
6572

66-
@Autowired private ConfigProperties configProperties;
73+
@Autowired private Environment environment;
74+
@Autowired private PropagationProperties propagationProperties;
75+
@Autowired private OtelResourceProperties otelResourceProperties;
76+
@Autowired private OtlpExporterProperties otlpExporterProperties;
6777

6878
@Configuration(proxyBeanMethods = false)
6979
static class TestConfiguration {
@@ -116,6 +126,13 @@ public String getName() {
116126

117127
@Test
118128
void propertyConversion() {
129+
ConfigProperties configProperties =
130+
SpringConfigProperties.create(
131+
environment,
132+
otlpExporterProperties,
133+
otelResourceProperties,
134+
propagationProperties,
135+
DefaultConfigProperties.createFromMap(Collections.emptyMap()));
119136
assertThat(configProperties.getMap("otel.exporter.otlp.headers"))
120137
.containsEntry("a", "1")
121138
.containsEntry("b", "2");

0 commit comments

Comments
 (0)