Skip to content

Commit ce288b0

Browse files
Fix default service.name + simplify configuration using Otel AutoConfig SDK 1.10 ResourceProvider SPI improvements (enable specifying the classloader making it compatible with Maven Plexus) (#187)
1 parent 5869fd7 commit ce288b0

File tree

4 files changed

+94
-40
lines changed

4 files changed

+94
-40
lines changed

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

Lines changed: 20 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,14 @@
88
import io.opentelemetry.api.OpenTelemetry;
99
import io.opentelemetry.api.trace.Tracer;
1010
import io.opentelemetry.context.propagation.ContextPropagators;
11-
import io.opentelemetry.maven.semconv.MavenOtelSemanticAttributes;
1211
import io.opentelemetry.sdk.OpenTelemetrySdk;
1312
import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk;
14-
import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdkBuilder;
1513
import io.opentelemetry.sdk.common.CompletableResultCode;
16-
import io.opentelemetry.sdk.resources.Resource;
17-
import io.opentelemetry.semconv.resource.attributes.ResourceAttributes;
1814
import java.util.Collections;
15+
import java.util.Map;
1916
import java.util.concurrent.TimeUnit;
2017
import javax.annotation.Nullable;
21-
import org.apache.maven.rtinfo.RuntimeInformation;
2218
import org.codehaus.plexus.component.annotations.Component;
23-
import org.codehaus.plexus.component.annotations.Requirement;
2419
import org.codehaus.plexus.personality.plexus.lifecycle.phase.Disposable;
2520
import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable;
2621
import org.slf4j.Logger;
@@ -32,17 +27,16 @@ public final class OpenTelemetrySdkService implements Initializable, Disposable
3227

3328
private static final Logger logger = LoggerFactory.getLogger(OpenTelemetrySdkService.class);
3429

35-
@SuppressWarnings("NullAway") // Injected automatically to non-null
36-
@Requirement
37-
private RuntimeInformation runtimeInformation;
38-
3930
private OpenTelemetry openTelemetry = OpenTelemetry.noop();
4031
@Nullable private OpenTelemetrySdk openTelemetrySdk;
4132

4233
@Nullable private Tracer tracer;
4334

4435
private boolean mojosInstrumentationEnabled;
4536

37+
/** Visible for testing */
38+
@Nullable AutoConfiguredOpenTelemetrySdk autoConfiguredOpenTelemetrySdk;
39+
4640
/**
4741
* Note: the JVM shutdown hook defined by the {@code
4842
* io.opentelemetry.sdk.autoconfigure.TracerProviderConfiguration} v1.7.0 does NOT cause
@@ -76,42 +70,28 @@ public synchronized void dispose() {
7670
}
7771
this.openTelemetry = OpenTelemetry.noop();
7872

73+
this.autoConfiguredOpenTelemetrySdk = null;
7974
logger.debug("OpenTelemetry: OpenTelemetrySdkService disposed");
8075
}
8176

8277
@Override
8378
public void initialize() {
8479
logger.debug("OpenTelemetry: initialize OpenTelemetrySdkService...");
85-
AutoConfiguredOpenTelemetrySdkBuilder autoConfiguredSdkBuilder =
86-
AutoConfiguredOpenTelemetrySdk.builder();
87-
88-
// SDK CONFIGURATION PROPERTIES
89-
autoConfiguredSdkBuilder.addPropertiesSupplier(
90-
() -> {
91-
// Change default of "otel.traces.exporter" from "otlp" to "none"
92-
// The impacts are
93-
// * If no otel exporter settings are passed, then the Maven extension will not export
94-
// rather than exporting on OTLP GRPC to http://localhost:4317
95-
// * If OTEL_EXPORTER_OTLP_ENDPOINT is defined but OTEL_TRACES_EXPORTER is not, then don't
96-
// export
97-
return Collections.singletonMap("otel.traces.exporter", "none");
98-
});
99-
100-
// SDK RESOURCE
101-
// Don't use the `io.opentelemetry.sdk.autoconfigure.spi.ResourceProvider` framework because we
102-
// need to get the `RuntimeInformation` component injected by Plexus
103-
autoConfiguredSdkBuilder.addResourceCustomizer(
104-
(resource, configProperties) ->
105-
Resource.builder()
106-
.put(
107-
ResourceAttributes.SERVICE_NAME, MavenOtelSemanticAttributes.SERVICE_NAME_VALUE)
108-
.put(ResourceAttributes.SERVICE_VERSION, runtimeInformation.getMavenVersion())
109-
.putAll(resource)
110-
.build());
111-
112-
// BUILD SDK
113-
AutoConfiguredOpenTelemetrySdk autoConfiguredOpenTelemetrySdk =
114-
autoConfiguredSdkBuilder.build();
80+
81+
// Change default of "otel.traces.exporter" from "otlp" to "none"
82+
// The impacts are
83+
// * If no otel exporter settings are passed, then the Maven extension will not export
84+
// rather than exporting on OTLP GRPC to http://localhost:4317
85+
// * If OTEL_EXPORTER_OTLP_ENDPOINT is defined but OTEL_TRACES_EXPORTER is not, then don't
86+
// export
87+
Map<String, String> properties = Collections.singletonMap("otel.traces.exporter", "none");
88+
89+
this.autoConfiguredOpenTelemetrySdk =
90+
AutoConfiguredOpenTelemetrySdk.builder()
91+
.setServiceClassLoader(getClass().getClassLoader())
92+
.addPropertiesSupplier(() -> properties)
93+
.build();
94+
11595
if (logger.isDebugEnabled()) {
11696
logger.debug(
11797
"OpenTelemetry: OpenTelemetry SDK initialized with "
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.maven.resources;
7+
8+
import io.opentelemetry.maven.semconv.MavenOtelSemanticAttributes;
9+
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
10+
import io.opentelemetry.sdk.autoconfigure.spi.ResourceProvider;
11+
import io.opentelemetry.sdk.resources.Resource;
12+
import io.opentelemetry.semconv.resource.attributes.ResourceAttributes;
13+
import org.apache.maven.rtinfo.RuntimeInformation;
14+
import org.apache.maven.rtinfo.internal.DefaultRuntimeInformation;
15+
16+
public class MavenResourceProvider implements ResourceProvider {
17+
@Override
18+
public Resource createResource(ConfigProperties config) {
19+
// TODO verify if there is solution to retrieve the RuntimeInformation instance loaded by the
20+
// Maven Plexus Launcher
21+
RuntimeInformation runtimeInformation = new DefaultRuntimeInformation();
22+
return Resource.builder()
23+
.put(ResourceAttributes.SERVICE_NAME, MavenOtelSemanticAttributes.SERVICE_NAME_VALUE)
24+
.put(ResourceAttributes.SERVICE_VERSION, runtimeInformation.getMavenVersion())
25+
.build();
26+
}
27+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
io.opentelemetry.maven.resources.MavenResourceProvider
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.maven;
7+
8+
import static org.assertj.core.api.Assertions.assertThat;
9+
10+
import io.opentelemetry.api.GlobalOpenTelemetry;
11+
import io.opentelemetry.sdk.resources.Resource;
12+
import io.opentelemetry.semconv.resource.attributes.ResourceAttributes;
13+
import org.junit.jupiter.api.Test;
14+
15+
public class OpenTelemetrySdkServiceTest {
16+
17+
/** Verify default `service.name` */
18+
@Test
19+
public void testDefaultConfiguration() {
20+
testConfiguration("maven");
21+
}
22+
23+
/** Verify overwritten `service.name` */
24+
@Test
25+
public void testOverwrittenConfiguration() {
26+
System.setProperty("otel.service.name", "my-maven");
27+
try {
28+
testConfiguration("my-maven");
29+
} finally {
30+
System.clearProperty("otel.service.name");
31+
}
32+
}
33+
34+
void testConfiguration(String expectedServiceName) {
35+
OpenTelemetrySdkService openTelemetrySdkService = new OpenTelemetrySdkService();
36+
openTelemetrySdkService.initialize();
37+
try {
38+
Resource resource = openTelemetrySdkService.autoConfiguredOpenTelemetrySdk.getResource();
39+
assertThat(resource.getAttribute(ResourceAttributes.SERVICE_NAME))
40+
.isEqualTo(expectedServiceName);
41+
} finally {
42+
openTelemetrySdkService.dispose();
43+
GlobalOpenTelemetry.resetForTest();
44+
}
45+
}
46+
}

0 commit comments

Comments
 (0)