Skip to content

Commit ee61c7b

Browse files
Load OTelSDK config from environment variables and system properties. Fix #1416
1 parent 682ccd2 commit ee61c7b

File tree

2 files changed

+126
-35
lines changed

2 files changed

+126
-35
lines changed

maven-extension/src/main/java/io/opentelemetry/maven/OpenTelemetrySdkService.java

Lines changed: 53 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,12 @@
1111
import io.opentelemetry.maven.semconv.MavenOtelSemanticAttributes;
1212
import io.opentelemetry.sdk.OpenTelemetrySdk;
1313
import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk;
14+
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
15+
import io.opentelemetry.sdk.autoconfigure.spi.internal.DefaultConfigProperties;
1416
import io.opentelemetry.sdk.common.CompletableResultCode;
17+
import io.opentelemetry.sdk.resources.Resource;
1518
import java.io.Closeable;
19+
import java.util.Collections;
1620
import java.util.HashMap;
1721
import java.util.Locale;
1822
import java.util.Map;
@@ -36,6 +40,10 @@ public final class OpenTelemetrySdkService implements Closeable {
3640

3741
private final OpenTelemetrySdk openTelemetrySdk;
3842

43+
private Resource resource;
44+
45+
private ConfigProperties configProperties;
46+
3947
private final Tracer tracer;
4048

4149
private final boolean mojosInstrumentationEnabled;
@@ -47,26 +55,51 @@ public OpenTelemetrySdkService() {
4755
"OpenTelemetry: Initialize OpenTelemetrySdkService v{}...",
4856
MavenOtelSemanticAttributes.TELEMETRY_DISTRO_VERSION_VALUE);
4957

50-
// Change default of "otel.[traces,metrics,logs].exporter" from "otlp" to "none"
51-
// The impacts are
52-
// * If no otel exporter settings are passed, then the Maven extension will not export
53-
// rather than exporting on OTLP GRPC to http://localhost:4317
54-
// * If OTEL_EXPORTER_OTLP_ENDPOINT is defined but OTEL_[TRACES,METRICS,LOGS]_EXPORTER,
55-
// is not, then don't export
56-
Map<String, String> properties = new HashMap<>();
57-
properties.put("otel.traces.exporter", "none");
58-
properties.put("otel.metrics.exporter", "none");
59-
properties.put("otel.logs.exporter", "none");
60-
6158
AutoConfiguredOpenTelemetrySdk autoConfiguredOpenTelemetrySdk =
6259
AutoConfiguredOpenTelemetrySdk.builder()
6360
.setServiceClassLoader(getClass().getClassLoader())
64-
.addPropertiesSupplier(() -> properties)
61+
.addPropertiesCustomizer(configProperties -> {
62+
// Change default of "otel.[traces,metrics,logs].exporter" from "otlp" to "none"
63+
if (configProperties.getString("otel.exporter.otlp.endpoint") == null) {
64+
Map<String, String> properties = new HashMap<>();
65+
if (configProperties.getString("otel.exporter.otlp.traces.endpoint") == null) {
66+
properties.put("otel.traces.exporter", "none");
67+
}
68+
if (configProperties.getString("otel.exporter.otlp.metrics.endpoint") == null) {
69+
properties.put("otel.metrics.exporter", "none");
70+
}
71+
if (configProperties.getString("otel.exporter.otlp.logs.endpoint") == null) {
72+
properties.put("otel.logs.exporter", "none");
73+
}
74+
return properties;
75+
} else {
76+
return Collections.emptyMap();
77+
}
78+
})
79+
.addPropertiesCustomizer(config -> {
80+
// keep a reference to the computed config properties for future use in the extension
81+
this.configProperties = config;
82+
return Collections.emptyMap();
83+
})
84+
.addResourceCustomizer((res, configProperties) -> {
85+
// keep a reference to the computed Resource for future use in the extension
86+
this.resource = Resource.builder().putAll(res).build();
87+
return this.resource;
88+
})
6589
.disableShutdownHook()
6690
.build();
6791

92+
if (this.resource == null) {
93+
this.resource = Resource.empty();
94+
}
95+
if (this.configProperties == null) {
96+
this.configProperties = DefaultConfigProperties.createFromMap(Collections.emptyMap());
97+
}
98+
6899
this.openTelemetrySdk = autoConfiguredOpenTelemetrySdk.getOpenTelemetrySdk();
69100

101+
logger.debug("OpenTelemetry: OpenTelemetrySdkService initialized, resource:{}", resource);
102+
70103
Boolean mojoSpansEnabled = getBooleanConfig("otel.instrumentation.maven.mojo.enabled");
71104
this.mojosInstrumentationEnabled = mojoSpansEnabled == null || mojoSpansEnabled;
72105

@@ -97,6 +130,14 @@ public Tracer getTracer() {
97130
return this.tracer;
98131
}
99132

133+
public Resource getResource() {
134+
return resource;
135+
}
136+
137+
public ConfigProperties getConfigProperties() {
138+
return configProperties;
139+
}
140+
100141
/** Returns the {@link ContextPropagators} for this {@link OpenTelemetry}. */
101142
public ContextPropagators getPropagators() {
102143
return this.openTelemetrySdk.getPropagators();

maven-extension/src/test/java/io/opentelemetry/maven/OpenTelemetrySdkServiceTest.java

Lines changed: 73 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -5,42 +5,92 @@
55

66
package io.opentelemetry.maven;
77

8-
import org.junit.jupiter.api.Disabled;
8+
import static io.opentelemetry.api.common.AttributeKey.stringKey;
9+
import static org.assertj.core.api.Assertions.assertThat;
10+
11+
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
12+
import io.opentelemetry.sdk.resources.Resource;
913
import org.junit.jupiter.api.Test;
1014

1115
public class OpenTelemetrySdkServiceTest {
1216

13-
/** Verify default `service.name` */
17+
/** Verify default config */
1418
@Test
15-
@Disabled
1619
public void testDefaultConfiguration() {
17-
testConfiguration("maven");
20+
System.clearProperty("otel.exporter.otlp.endpoint");
21+
System.clearProperty("otel.service.name");
22+
System.clearProperty("otel.resource.attributes");
23+
try (OpenTelemetrySdkService openTelemetrySdkService = new OpenTelemetrySdkService()) {
24+
25+
Resource resource = openTelemetrySdkService.getResource();
26+
assertThat(resource.getAttribute(stringKey("service.name"))).isEqualTo("maven");
27+
28+
ConfigProperties configProperties = openTelemetrySdkService.getConfigProperties();
29+
assertThat(configProperties.getString("otel.exporter.otlp.endpoint")).isNull();
30+
assertThat(configProperties.getString("otel.traces.exporter")).isEqualTo("none");
31+
assertThat(configProperties.getString("otel.metrics.exporter")).isEqualTo("none");
32+
assertThat(configProperties.getString("otel.logs.exporter")).isEqualTo("none");
33+
}
1834
}
1935

20-
/** Verify overwritten `service.name` */
36+
/** Verify overwritten `service.name`,`key1` and `key2` */
2137
@Test
22-
@Disabled
23-
public void testOverwrittenConfiguration() {
38+
public void testOverwrittenResourceAttributes() {
2439
System.setProperty("otel.service.name", "my-maven");
25-
try {
26-
testConfiguration("my-maven");
40+
System.setProperty("otel.resource.attributes", "key1=val1,key2=val2");
41+
42+
try (OpenTelemetrySdkService openTelemetrySdkService = new OpenTelemetrySdkService()) {
43+
44+
Resource resource = openTelemetrySdkService.getResource();
45+
assertThat(resource.getAttribute(stringKey("service.name"))).isEqualTo("my-maven");
46+
assertThat(resource.getAttribute(stringKey("key1"))).isEqualTo("val1");
47+
assertThat(resource.getAttribute(stringKey("key2"))).isEqualTo("val2");
48+
49+
} finally {
50+
System.clearProperty("otel.service.name");
51+
System.clearProperty("otel.resource.attributes");
52+
}
53+
}
54+
55+
/** Verify overwritten `"otel.exporter.otlp.endpoint" */
56+
@Test
57+
public void testOverwrittenExporterConfiguration_1() {
58+
System.setProperty("otel.exporter.otlp.endpoint", "http://example.com:4318");
59+
60+
try (OpenTelemetrySdkService openTelemetrySdkService = new OpenTelemetrySdkService()) {
61+
62+
63+
ConfigProperties configProperties = openTelemetrySdkService.getConfigProperties();
64+
assertThat(configProperties.getString("otel.exporter.otlp.endpoint")).isEqualTo("http://example.com:4318");
65+
assertThat(configProperties.getString("otel.traces.exporter")).isNull();
66+
assertThat(configProperties.getString("otel.metrics.exporter")).isNull();
67+
assertThat(configProperties.getString("otel.logs.exporter")).isNull();
68+
2769
} finally {
28-
System.clearProperty("otel.service.name");
70+
System.clearProperty("otel.exporter.otlp.endpoint");
2971
}
3072
}
3173

32-
void testConfiguration(String expectedServiceName) {
33-
// OpenTelemetrySdkService openTelemetrySdkService = new OpenTelemetrySdkService();
34-
// openTelemetrySdkService.initialize();
35-
// try {
36-
// Resource resource =
37-
// openTelemetrySdkService.autoConfiguredOpenTelemetrySdk.getResource();
38-
// assertThat(resource.getAttribute(ResourceAttributes.SERVICE_NAME))
39-
// .isEqualTo(expectedServiceName);
40-
// } finally {
41-
// openTelemetrySdkService.dispose();
42-
// GlobalOpenTelemetry.resetForTest();
43-
// GlobalEventEmitterProvider.resetForTest();
44-
// }
74+
/** Verify overwritten `"otel.exporter.otlp.traces.endpoint" */
75+
@Test
76+
public void testOverwrittenExporterConfiguration_2() {
77+
System.clearProperty("otel.exporter.otlp.endpoint");
78+
System.setProperty("otel.exporter.otlp.traces.endpoint", "http://example.com:4318/v1/traces");
79+
System.setProperty("otel.exporter.otlp.traces.protocol", "http/protobuf");
80+
81+
try (OpenTelemetrySdkService openTelemetrySdkService = new OpenTelemetrySdkService()) {
82+
83+
ConfigProperties configProperties = openTelemetrySdkService.getConfigProperties();
84+
assertThat(configProperties.getString("otel.exporter.otlp.endpoint")).isNull();
85+
assertThat(configProperties.getString("otel.exporter.otlp.traces.endpoint")).isEqualTo("http://example.com:4318/v1/traces");
86+
assertThat(configProperties.getString("otel.traces.exporter")).isNull();
87+
assertThat(configProperties.getString("otel.metrics.exporter")).isEqualTo("none");
88+
assertThat(configProperties.getString("otel.logs.exporter")).isEqualTo("none");
89+
90+
} finally {
91+
System.clearProperty("otel.exporter.otlp.endpoint");
92+
System.clearProperty("otel.exporter.otlp.traces.endpoint");
93+
System.clearProperty("otel.exporter.otlp.traces.protocol");
94+
}
4595
}
4696
}

0 commit comments

Comments
 (0)