Skip to content

Commit d4fd64a

Browse files
committed
add distro
1 parent fb975cc commit d4fd64a

File tree

6 files changed

+150
-10
lines changed

6 files changed

+150
-10
lines changed

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

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,18 +22,23 @@
2222
import io.opentelemetry.instrumentation.spring.autoconfigure.internal.properties.OtelSpringProperties;
2323
import io.opentelemetry.instrumentation.spring.autoconfigure.internal.properties.OtlpExporterProperties;
2424
import io.opentelemetry.instrumentation.spring.autoconfigure.internal.properties.SpringConfigProperties;
25+
import io.opentelemetry.instrumentation.spring.autoconfigure.internal.resources.DistroComponentProvider;
2526
import io.opentelemetry.instrumentation.spring.autoconfigure.internal.resources.DistroVersionResourceProvider;
27+
import io.opentelemetry.instrumentation.spring.autoconfigure.internal.resources.ResourceCustomizerProvider;
2628
import io.opentelemetry.instrumentation.spring.autoconfigure.internal.resources.SpringResourceProvider;
2729
import io.opentelemetry.sdk.OpenTelemetrySdk;
2830
import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk;
2931
import io.opentelemetry.sdk.autoconfigure.internal.AutoConfigureUtil;
3032
import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper;
3133
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
3234
import io.opentelemetry.sdk.autoconfigure.spi.ResourceProvider;
35+
import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider;
3336
import io.opentelemetry.sdk.autoconfigure.spi.internal.DefaultConfigProperties;
3437
import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfiguration;
38+
import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfigurationCustomizerProvider;
3539
import io.opentelemetry.sdk.extension.incubator.fileconfig.SdkConfigProvider;
3640
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel;
41+
import io.opentelemetry.sdk.resources.Resource;
3742
import java.io.IOException;
3843
import java.util.Collections;
3944
import java.util.List;
@@ -72,16 +77,8 @@ public OpenTelemetryAutoConfiguration() {}
7277
@Configuration
7378
@Conditional(OtelEnabled.class)
7479
@ConditionalOnMissingBean(OpenTelemetry.class)
80+
@SuppressWarnings("OtelPrivateConstructorForUtilityClass")
7581
static class OpenTelemetrySdkConfig {
76-
@Bean
77-
public ResourceProvider otelSpringResourceProvider(Optional<BuildProperties> buildProperties) {
78-
return new SpringResourceProvider(buildProperties);
79-
}
80-
81-
@Bean
82-
public ResourceProvider otelDistroVersionResourceProvider() {
83-
return new DistroVersionResourceProvider();
84-
}
8582

8683
@Configuration
8784
@EnableConfigurationProperties({
@@ -92,6 +89,17 @@ public ResourceProvider otelDistroVersionResourceProvider() {
9289
@Conditional(DeclarativeConfigDisabled.class)
9390
static class PropertiesConfig {
9491

92+
@Bean
93+
public ResourceProvider otelSpringResourceProvider(
94+
Optional<BuildProperties> buildProperties) {
95+
return new SpringResourceProvider(buildProperties);
96+
}
97+
98+
@Bean
99+
public ResourceProvider otelDistroVersionResourceProvider() {
100+
return new DistroVersionResourceProvider();
101+
}
102+
95103
@Bean
96104
@ConfigurationPropertiesBinding
97105
OtelMapConverter otelMapConverter() {
@@ -185,6 +193,16 @@ public ConfigProperties otelProperties(ConfigProvider configProvider) {
185193
return new DeclarativeConfigPropertiesBridgeBuilder()
186194
.buildFromInstrumentationConfig(configProvider.getInstrumentationConfig());
187195
}
196+
197+
@Bean
198+
public DeclarativeConfigurationCustomizerProvider distroConfigurationCustomizerProvider() {
199+
return new ResourceCustomizerProvider();
200+
}
201+
202+
@Bean
203+
public ComponentProvider<Resource> distroComponentProvider() {
204+
return new DistroComponentProvider();
205+
}
188206
}
189207
}
190208

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.instrumentation.spring.autoconfigure.internal.resources;
7+
8+
import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties;
9+
import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider;
10+
import io.opentelemetry.sdk.resources.Resource;
11+
12+
/**
13+
* This class is internal and is hence not for public use. Its APIs are unstable and can change at
14+
* any time.
15+
*/
16+
@SuppressWarnings("rawtypes")
17+
public class DistroComponentProvider implements ComponentProvider<Resource> {
18+
19+
@Override
20+
public Class<Resource> getType() {
21+
return Resource.class;
22+
}
23+
24+
@Override
25+
public String getName() {
26+
return "opentelemetry-spring-boot-starter";
27+
}
28+
29+
@Override
30+
public Resource create(DeclarativeConfigProperties config) {
31+
return DistroVersionResourceProvider.get();
32+
}
33+
}

instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/resources/DistroVersionResourceProvider.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@ public class DistroVersionResourceProvider implements ResourceProvider {
2828

2929
@Override
3030
public Resource createResource(ConfigProperties config) {
31+
return get();
32+
}
33+
34+
static Resource get() {
3135
return Resource.create(
3236
Attributes.of(
3337
TELEMETRY_DISTRO_NAME,
Lines changed: 63 additions & 0 deletions
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.spring.autoconfigure.internal.resources;
7+
8+
import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfigurationCustomizer;
9+
import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfigurationCustomizerProvider;
10+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalResourceDetectionModel;
11+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalResourceDetectorModel;
12+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ResourceModel;
13+
import java.util.Collections;
14+
import java.util.List;
15+
import java.util.Objects;
16+
import java.util.Set;
17+
import java.util.stream.Collectors;
18+
19+
/**
20+
* This class is internal and is hence not for public use. Its APIs are unstable and can change at
21+
* any time.
22+
*/
23+
public class ResourceCustomizerProvider implements DeclarativeConfigurationCustomizerProvider {
24+
25+
// opentelemetry-javaagent-distribution: adds "distro.name" and "distro.version" attributes
26+
// (DistroComponentProvider in this package)
27+
private static final List<String> REQUIRED_DETECTORS =
28+
Collections.singletonList("opentelemetry-spring-boot-starter");
29+
30+
@Override
31+
public void customize(DeclarativeConfigurationCustomizer customizer) {
32+
customizer.addModelCustomizer(
33+
model -> {
34+
ResourceModel resource = model.getResource();
35+
if (resource == null) {
36+
resource = new ResourceModel();
37+
model.withResource(resource);
38+
}
39+
ExperimentalResourceDetectionModel detectionModel = resource.getDetectionDevelopment();
40+
if (detectionModel == null) {
41+
detectionModel = new ExperimentalResourceDetectionModel();
42+
resource.withDetectionDevelopment(detectionModel);
43+
}
44+
List<ExperimentalResourceDetectorModel> detectors =
45+
Objects.requireNonNull(detectionModel.getDetectors());
46+
Set<String> names =
47+
detectors.stream()
48+
.flatMap(detector -> detector.getAdditionalProperties().keySet().stream())
49+
.collect(Collectors.toSet());
50+
51+
for (String name : REQUIRED_DETECTORS) {
52+
if (!names.contains(name)) {
53+
ExperimentalResourceDetectorModel detector = new ExperimentalResourceDetectorModel();
54+
detector.getAdditionalProperties().put(name, null);
55+
// add first (the least precedence)
56+
// so that the user can add a differently named detector that takes precedence
57+
detectors.add(0, detector);
58+
}
59+
}
60+
return model;
61+
});
62+
}
63+
}

smoke-tests-otel-starter/spring-boot-2/src/testDeclarativeConfig/java/io/opentelemetry/spring/smoketest/OtelSpringStarterSmokeTest.java

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,14 @@
55

66
package io.opentelemetry.spring.smoketest;
77

8+
import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies;
9+
810
import io.opentelemetry.api.trace.SpanKind;
911
import io.opentelemetry.semconv.HttpAttributes;
1012
import io.opentelemetry.semconv.ServiceAttributes;
13+
import io.opentelemetry.semconv.incubating.ServiceIncubatingAttributes;
14+
import io.opentelemetry.semconv.incubating.TelemetryIncubatingAttributes;
15+
import org.assertj.core.api.AbstractCharSequenceAssert;
1116
import org.junit.jupiter.api.Test;
1217
import org.springframework.beans.factory.annotation.Autowired;
1318
import org.springframework.beans.factory.annotation.Value;
@@ -54,7 +59,21 @@ void restTemplate() {
5459
ServiceAttributes.SERVICE_NAME,
5560
"declarative-config-spring-boot-2")),
5661
span ->
57-
span.hasKind(SpanKind.SERVER).hasAttribute(HttpAttributes.HTTP_ROUTE, "/ping"),
62+
span.hasKind(SpanKind.SERVER)
63+
.hasResourceSatisfying(
64+
r ->
65+
r.hasAttribute(
66+
TelemetryIncubatingAttributes.TELEMETRY_DISTRO_NAME,
67+
"opentelemetry-spring-boot-starter")
68+
.hasAttribute(
69+
satisfies(
70+
TelemetryIncubatingAttributes.TELEMETRY_DISTRO_VERSION,
71+
AbstractCharSequenceAssert::isNotBlank))
72+
.hasAttribute(
73+
satisfies(
74+
ServiceIncubatingAttributes.SERVICE_INSTANCE_ID,
75+
AbstractCharSequenceAssert::isNotBlank)))
76+
.hasAttribute(HttpAttributes.HTTP_ROUTE, "/ping"),
5877
AbstractSpringStarterSmokeTest::withSpanAssert));
5978
}
6079
}

smoke-tests-otel-starter/spring-boot-2/src/testDeclarativeConfig/resources/application.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@ otel:
22
# "file_format" serves as opt-in to the new file format
33
file_format: "1.0-rc.1"
44
resource:
5+
detection/development:
6+
detectors:
7+
- service:
58
attributes:
69
- name: service.name
710
value: declarative-config-spring-boot-2

0 commit comments

Comments
 (0)