Skip to content

Commit 8709349

Browse files
committed
spring starter shouldn't depend on spring-boot-resources, which uses snake yaml, which doesn't work with graal native
1 parent a98a2c2 commit 8709349

File tree

7 files changed

+53
-20
lines changed

7 files changed

+53
-20
lines changed

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

-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ dependencies {
4646
compileOnly(project(":instrumentation-annotations"))
4747

4848
compileOnly(project(":instrumentation:resources:library"))
49-
compileOnly(project(":instrumentation:spring:spring-boot-resources:library"))
5049
annotationProcessor("com.google.auto.service:auto-service")
5150
compileOnly("com.google.auto.service:auto-service-annotations")
5251

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

+6-16
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,15 @@
1717
import io.opentelemetry.instrumentation.resources.ProcessRuntimeResourceProvider;
1818
import io.opentelemetry.instrumentation.spring.autoconfigure.OpenTelemetryAutoConfiguration;
1919
import io.opentelemetry.instrumentation.spring.autoconfigure.internal.SdkEnabled;
20-
import io.opentelemetry.instrumentation.spring.resources.SpringBootServiceNameDetector;
21-
import io.opentelemetry.instrumentation.spring.resources.SpringBootServiceVersionDetector;
2220
import io.opentelemetry.sdk.autoconfigure.internal.EnvironmentResourceProvider;
2321
import io.opentelemetry.sdk.autoconfigure.spi.ResourceProvider;
22+
import java.util.Optional;
23+
import org.springframework.beans.factory.annotation.Autowired;
2424
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
2525
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
2626
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
2727
import org.springframework.boot.context.properties.EnableConfigurationProperties;
28+
import org.springframework.boot.info.BuildProperties;
2829
import org.springframework.context.annotation.Bean;
2930
import org.springframework.context.annotation.Conditional;
3031
import org.springframework.context.annotation.Configuration;
@@ -42,27 +43,16 @@ public ResourceProvider otelEnvironmentResourceProvider() {
4243
}
4344

4445
@Bean
45-
public ResourceProvider otelSpringResourceProvider() {
46-
return new SpringResourceProvider();
46+
public ResourceProvider otelSpringResourceProvider(
47+
@Autowired(required = false) BuildProperties buildProperties) {
48+
return new SpringResourceProvider(Optional.ofNullable(buildProperties));
4749
}
4850

4951
@Bean
5052
public ResourceProvider otelDistroVersionResourceProvider() {
5153
return new DistroVersionResourceProvider();
5254
}
5355

54-
@Bean
55-
@ConditionalOnClass(SpringBootServiceNameDetector.class)
56-
public ResourceProvider otelSpringBootServiceNameResourceProvider() {
57-
return new SpringBootServiceNameDetector();
58-
}
59-
60-
@Bean
61-
@ConditionalOnClass(SpringBootServiceVersionDetector.class)
62-
public ResourceProvider otelSpringBootServiceVersionResourceProvider() {
63-
return new SpringBootServiceVersionDetector();
64-
}
65-
6656
@Bean
6757
@ConditionalOnClass(OsResource.class)
6858
public ResourceProvider otelOsResourceProvider() {

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

+17
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,33 @@
1111
import io.opentelemetry.sdk.autoconfigure.spi.ResourceProvider;
1212
import io.opentelemetry.sdk.resources.Resource;
1313
import io.opentelemetry.semconv.ResourceAttributes;
14+
import java.util.Optional;
15+
import org.springframework.boot.info.BuildProperties;
1416

1517
public class SpringResourceProvider implements ResourceProvider {
1618

19+
private final Optional<BuildProperties> buildProperties;
20+
21+
public SpringResourceProvider(Optional<BuildProperties> buildProperties) {
22+
this.buildProperties = buildProperties;
23+
}
24+
1725
@Override
1826
public Resource createResource(ConfigProperties configProperties) {
1927
AttributesBuilder attributesBuilder = Attributes.builder();
28+
buildProperties
29+
.map(BuildProperties::getName)
30+
.ifPresent(v -> attributesBuilder.put(ResourceAttributes.SERVICE_NAME, v));
31+
2032
String springApplicationName = configProperties.getString("spring.application.name");
2133
if (springApplicationName != null) {
2234
attributesBuilder.put(ResourceAttributes.SERVICE_NAME, springApplicationName);
2335
}
36+
37+
buildProperties
38+
.map(BuildProperties::getVersion)
39+
.ifPresent(v -> attributesBuilder.put(ResourceAttributes.SERVICE_VERSION, v));
40+
2441
return Resource.create(attributesBuilder.build());
2542
}
2643
}

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

+24
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
package io.opentelemetry.instrumentation.spring.autoconfigure;
77

88
import static io.opentelemetry.semconv.ResourceAttributes.SERVICE_NAME;
9+
import static io.opentelemetry.semconv.ResourceAttributes.SERVICE_VERSION;
910
import static org.assertj.core.api.Assertions.assertThat;
1011

1112
import io.opentelemetry.api.OpenTelemetry;
@@ -16,9 +17,11 @@
1617
import io.opentelemetry.sdk.metrics.SdkMeterProvider;
1718
import io.opentelemetry.sdk.resources.Resource;
1819
import io.opentelemetry.sdk.trace.SdkTracerProvider;
20+
import java.util.Properties;
1921
import org.junit.jupiter.api.DisplayName;
2022
import org.junit.jupiter.api.Test;
2123
import org.springframework.boot.autoconfigure.AutoConfigurations;
24+
import org.springframework.boot.info.BuildProperties;
2225
import org.springframework.boot.test.context.TestConfiguration;
2326
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
2427
import org.springframework.context.annotation.Bean;
@@ -117,6 +120,27 @@ void shouldDetermineServiceNameBySpringApplicationName() {
117120
});
118121
}
119122

123+
@Test
124+
@DisplayName(
125+
"when spring.application.name is set value should be passed to service name attribute")
126+
void shouldDetermineServiceNameAndVersionBySpringApplicationVersion() {
127+
Properties properties = new Properties();
128+
properties.put("name", "demo");
129+
properties.put("version", "0.3");
130+
this.contextRunner
131+
.withBean("buildProperties", BuildProperties.class, () -> new BuildProperties(properties))
132+
.withConfiguration(
133+
AutoConfigurations.of(
134+
OtelResourceAutoConfiguration.class, OpenTelemetryAutoConfiguration.class))
135+
.run(
136+
context -> {
137+
Resource otelResource = context.getBean("otelResource", Resource.class);
138+
139+
assertThat(otelResource.getAttribute(SERVICE_NAME)).isEqualTo("demo");
140+
assertThat(otelResource.getAttribute(SERVICE_VERSION)).isEqualTo("0.3");
141+
});
142+
}
143+
120144
@Test
121145
@DisplayName(
122146
"when spring application name and otel service name are not set service name should be default")

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,8 @@
4646
* <li>Check for --spring.application.name program argument via sun.java.command system property
4747
* </ul>
4848
*
49-
* <p>Note: should not be used inside a spring application, where the spring.application.name is
50-
* already available.
49+
* <p>Note: The spring starter already includes provider in
50+
* io.opentelemetry.instrumentation.spring.autoconfigure.resources.SpringResourceProvider
5151
*/
5252
@AutoService(ResourceProvider.class)
5353
public class SpringBootServiceNameDetector implements ConditionalResourceProvider {

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

+4
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@
1818
import java.util.Properties;
1919
import java.util.logging.Logger;
2020

21+
/**
22+
* Note: The spring starter already includes provider in
23+
* io.opentelemetry.instrumentation.spring.autoconfigure.resources.SpringResourceProvider
24+
*/
2125
@AutoService(ResourceProvider.class)
2226
public class SpringBootServiceVersionDetector implements ResourceProvider {
2327

instrumentation/spring/starters/spring-boot-starter/build.gradle.kts

-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ dependencies {
1414
api(project(":instrumentation:spring:spring-boot-autoconfigure"))
1515
api(project(":instrumentation-annotations"))
1616
implementation(project(":instrumentation:resources:library"))
17-
implementation(project(":instrumentation:spring:spring-boot-resources:library"))
1817
api("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi")
1918
api("io.opentelemetry:opentelemetry-api")
2019
api("io.opentelemetry:opentelemetry-exporter-logging")

0 commit comments

Comments
 (0)