Skip to content

Commit a514298

Browse files
committed
add missing declarative config resource providers
1 parent 62175ca commit a514298

File tree

13 files changed

+256
-7
lines changed

13 files changed

+256
-7
lines changed

instrumentation/resources/library/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@ dependencies {
88
compileOnly("io.opentelemetry:opentelemetry-api-incubator")
99
implementation("io.opentelemetry:opentelemetry-sdk-common")
1010
implementation("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi")
11+
implementation("io.opentelemetry:opentelemetry-sdk-extension-incubator")
1112
implementation("io.opentelemetry.semconv:opentelemetry-semconv")
1213

1314
annotationProcessor("com.google.auto.service:auto-service")
1415
compileOnly("com.google.auto.service:auto-service-annotations")
1516
testCompileOnly("com.google.auto.service:auto-service-annotations")
16-
testImplementation("io.opentelemetry:opentelemetry-sdk-extension-incubator")
1717

1818
testImplementation("org.junit.jupiter:junit-jupiter-api")
1919
}

instrumentation/resources/library/src/main/java/io/opentelemetry/instrumentation/resources/AttributeResourceProvider.java

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import java.util.Set;
2121
import java.util.function.Function;
2222
import java.util.stream.Collectors;
23+
import javax.annotation.Nullable;
2324

2425
/**
2526
* An easier alternative to {@link io.opentelemetry.sdk.autoconfigure.spi.ResourceProvider}, which
@@ -45,7 +46,6 @@ public <T> AttributeBuilder add(AttributeKey<T> key, Function<D, Optional<T>> ge
4546
}
4647

4748
private Set<AttributeKey<?>> filteredKeys;
48-
4949
private final Map<AttributeKey<Object>, Function<D, Optional<?>>> attributeGetters =
5050
new HashMap<>();
5151

@@ -66,16 +66,25 @@ public final boolean shouldApply(ConfigProperties config, Resource existing) {
6666

6767
@Override
6868
public final Resource createResource(ConfigProperties config) {
69+
return create(filteredKeys);
70+
}
71+
72+
@SuppressWarnings({"unchecked", "rawtypes"})
73+
public final Resource createUnconditional() {
74+
return create((Set) attributeGetters.keySet());
75+
}
76+
77+
private Resource create(@Nullable Set<AttributeKey<?>> keys) {
78+
if (keys == null) {
79+
throw new IllegalStateException("shouldApply should be called first");
80+
}
6981
return attributeProvider
7082
.readData()
7183
.map(
7284
data -> {
73-
if (filteredKeys == null) {
74-
throw new IllegalStateException("shouldApply should be called first");
75-
}
7685
AttributesBuilder builder = Attributes.builder();
7786
attributeGetters.entrySet().stream()
78-
.filter(e -> filteredKeys.contains(e.getKey()))
87+
.filter(e -> keys.contains(e.getKey()))
7988
.forEach(
8089
e ->
8190
e.getValue()

instrumentation/resources/library/src/main/java/io/opentelemetry/instrumentation/resources/JarServiceNameDetector.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,10 @@ private JarServiceNameDetector(Supplier<Optional<Path>> jarPathSupplier) {
4646

4747
@Override
4848
public Resource createResource(ConfigProperties config) {
49+
return create();
50+
}
51+
52+
public Resource create() {
4953
return jarPathSupplier
5054
.get()
5155
.map(
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.instrumentation.resources.internal;
7+
8+
import com.google.auto.service.AutoService;
9+
import io.opentelemetry.instrumentation.resources.JarServiceNameDetector;
10+
import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider;
11+
12+
/**
13+
* Declarative config host resource provider.
14+
*
15+
* <p>This class is internal and is hence not for public use. Its APIs are unstable and can change
16+
* at any time.
17+
*/
18+
@SuppressWarnings("rawtypes")
19+
@AutoService(ComponentProvider.class)
20+
public class JarResourceComponentProvider extends ResourceComponentProvider {
21+
public JarResourceComponentProvider() {
22+
super("jar", () -> new JarServiceNameDetector().create());
23+
}
24+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.instrumentation.resources.internal;
7+
8+
import com.google.auto.service.AutoService;
9+
import io.opentelemetry.instrumentation.resources.ManifestResourceProvider;
10+
import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider;
11+
12+
/**
13+
* Declarative config host resource provider.
14+
*
15+
* <p>This class is internal and is hence not for public use. Its APIs are unstable and can change
16+
* at any time.
17+
*/
18+
@SuppressWarnings("rawtypes")
19+
@AutoService(ComponentProvider.class)
20+
public class ManifestResourceComponentProvider extends ResourceComponentProvider {
21+
public ManifestResourceComponentProvider() {
22+
super("manifest", () -> new ManifestResourceProvider().createUnconditional());
23+
}
24+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.instrumentation.resources.internal;
7+
8+
import com.google.auto.service.AutoService;
9+
import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfigurationCustomizer;
10+
import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfigurationCustomizerProvider;
11+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalResourceDetectionModel;
12+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalResourceDetectorModel;
13+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ResourceModel;
14+
import java.util.Arrays;
15+
import java.util.List;
16+
import java.util.Objects;
17+
import java.util.Set;
18+
import java.util.stream.Collectors;
19+
20+
/**
21+
* Adds essential resource detectors to the resource model in declarative configuration, if they are
22+
* not already present.
23+
*
24+
* <p>This class is internal and is hence not for public use. Its APIs are unstable and can change
25+
* at any time.
26+
*/
27+
@AutoService(DeclarativeConfigurationCustomizerProvider.class)
28+
public class ResourceCustomizerProvider implements DeclarativeConfigurationCustomizerProvider {
29+
30+
private static final List<String> NEEDED_DETECTORS = Arrays.asList("distribution", "service");
31+
32+
@Override
33+
public void customize(DeclarativeConfigurationCustomizer customizer) {
34+
customizer.addModelCustomizer(
35+
model -> {
36+
ResourceModel resource = model.getResource();
37+
if (resource == null) {
38+
resource = new ResourceModel();
39+
model.withResource(resource);
40+
}
41+
ExperimentalResourceDetectionModel detectionModel = resource.getDetectionDevelopment();
42+
if (detectionModel == null) {
43+
detectionModel = new ExperimentalResourceDetectionModel();
44+
resource.withDetectionDevelopment(detectionModel);
45+
}
46+
List<ExperimentalResourceDetectorModel> detectors =
47+
Objects.requireNonNull(detectionModel.getDetectors());
48+
Set<String> names =
49+
detectors.stream()
50+
.flatMap(detector -> detector.getAdditionalProperties().keySet().stream())
51+
.collect(Collectors.toSet());
52+
53+
for (String name : NEEDED_DETECTORS) {
54+
if (!names.contains(name)) {
55+
ExperimentalResourceDetectorModel detector = new ExperimentalResourceDetectorModel();
56+
detector.getAdditionalProperties().put(name, null);
57+
detectors.add(detector);
58+
}
59+
}
60+
return model;
61+
});
62+
}
63+
}

instrumentation/resources/library/src/test/java/io/opentelemetry/instrumentation/resources/ManifestResourceProviderTest.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,12 @@ Collection<DynamicTest> createResource() {
9696
assertThat(resource.getAttribute(SERVICE_NAME)).isEqualTo(t.expectedName);
9797
assertThat(resource.getAttribute(SERVICE_VERSION))
9898
.isEqualTo(t.expectedVersion);
99+
100+
if (t.existing.getAttributes().isEmpty()) {
101+
// component provider does not consider existing resource
102+
assertThat(provider.createUnconditional().getAttributes())
103+
.isEqualTo(resource.getAttributes());
104+
}
99105
}))
100106
.collect(Collectors.toList());
101107
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.instrumentation.resources.internal;
7+
8+
import static org.assertj.core.api.Assertions.assertThat;
9+
10+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel;
11+
import io.opentelemetry.testing.internal.jackson.core.JsonProcessingException;
12+
import io.opentelemetry.testing.internal.jackson.databind.ObjectMapper;
13+
import org.junit.jupiter.api.Test;
14+
15+
class ResourceCustomizerProviderTest {
16+
17+
private final ObjectMapper objectMapper = new ObjectMapper();
18+
19+
@Test
20+
void customize() {
21+
new ResourceCustomizerProvider()
22+
.customize(
23+
customizer -> {
24+
OpenTelemetryConfigurationModel configurationModel =
25+
customizer.apply(new OpenTelemetryConfigurationModel());
26+
27+
try {
28+
assertThat(objectMapper.writeValueAsString(configurationModel.getResource()))
29+
.isEqualTo(
30+
"{\"attributes\":[],\"detectionDevelopment\":{\"attributes\":null,\"detectors\":["
31+
+ "{\"additionalProperties\":{\"distribution\":null}},"
32+
+ "{\"additionalProperties\":{\"service\":null}}]},"
33+
+ "\"schemaUrl\":null,\"attributesList\":null}");
34+
} catch (JsonProcessingException e) {
35+
throw new AssertionError(e);
36+
}
37+
});
38+
}
39+
}

instrumentation/spring/spring-boot-resources/javaagent/src/main/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceNameDetector.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,10 @@ public SpringBootServiceNameDetector() {
7171

7272
@Override
7373
public Resource createResource(ConfigProperties config) {
74+
return create();
75+
}
7476

77+
Resource create() {
7578
logger.log(FINER, "Performing Spring Boot service name auto-detection...");
7679
// Note: The order should be consistent with the order of Spring matching, but noting
7780
// that we have "first one wins" while Spring has "last one wins".

instrumentation/spring/spring-boot-resources/javaagent/src/main/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceVersionDetector.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,10 @@ public SpringBootServiceVersionDetector() {
4141

4242
@Override
4343
public Resource createResource(ConfigProperties config) {
44+
return create();
45+
}
46+
47+
Resource create() {
4448
return getServiceVersionFromBuildInfo()
4549
.map(
4650
version -> {

0 commit comments

Comments
 (0)