Skip to content

Commit c73bf8e

Browse files
zeitlingerjeanbisuttitrasklaurit
authored
Fix native tests (#10685)
Co-authored-by: Jean Bisutti <[email protected]> Co-authored-by: Trask Stalnaker <[email protected]> Co-authored-by: Lauri Tulmin <[email protected]>
1 parent f8c1094 commit c73bf8e

File tree

9 files changed

+106
-70
lines changed

9 files changed

+106
-70
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

+4-16
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,14 @@
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;
2423
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
2524
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
2625
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
2726
import org.springframework.boot.context.properties.EnableConfigurationProperties;
27+
import org.springframework.boot.info.BuildProperties;
2828
import org.springframework.context.annotation.Bean;
2929
import org.springframework.context.annotation.Conditional;
3030
import org.springframework.context.annotation.Configuration;
@@ -42,27 +42,15 @@ public ResourceProvider otelEnvironmentResourceProvider() {
4242
}
4343

4444
@Bean
45-
public ResourceProvider otelSpringResourceProvider() {
46-
return new SpringResourceProvider();
45+
public ResourceProvider otelSpringResourceProvider(Optional<BuildProperties> buildProperties) {
46+
return new SpringResourceProvider(buildProperties);
4747
}
4848

4949
@Bean
5050
public ResourceProvider otelDistroVersionResourceProvider() {
5151
return new DistroVersionResourceProvider();
5252
}
5353

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-
6654
@Bean
6755
@ConditionalOnClass(OsResource.class)
6856
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

-50
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55

66
package io.opentelemetry.instrumentation.spring.autoconfigure;
77

8-
import static io.opentelemetry.semconv.ResourceAttributes.SERVICE_NAME;
98
import static org.assertj.core.api.Assertions.assertThat;
109

1110
import io.opentelemetry.api.OpenTelemetry;
@@ -100,55 +99,6 @@ void initializeOpenTelemetryWithCustomProviders() {
10099
.doesNotHaveBean("sdkLoggerProvider"));
101100
}
102101

103-
@Test
104-
@DisplayName(
105-
"when spring.application.name is set value should be passed to service name attribute")
106-
void shouldDetermineServiceNameBySpringApplicationName() {
107-
this.contextRunner
108-
.withPropertyValues("spring.application.name=myapp-backend")
109-
.withConfiguration(
110-
AutoConfigurations.of(
111-
OtelResourceAutoConfiguration.class, OpenTelemetryAutoConfiguration.class))
112-
.run(
113-
context -> {
114-
Resource otelResource = context.getBean("otelResource", Resource.class);
115-
116-
assertThat(otelResource.getAttribute(SERVICE_NAME)).isEqualTo("myapp-backend");
117-
});
118-
}
119-
120-
@Test
121-
@DisplayName(
122-
"when spring application name and otel service name are not set service name should be default")
123-
void hasDefaultServiceName() {
124-
this.contextRunner
125-
.withConfiguration(
126-
AutoConfigurations.of(
127-
OtelResourceAutoConfiguration.class, OpenTelemetryAutoConfiguration.class))
128-
.run(
129-
context -> {
130-
Resource otelResource = context.getBean("otelResource", Resource.class);
131-
132-
assertThat(otelResource.getAttribute(SERVICE_NAME)).isEqualTo("unknown_service:java");
133-
});
134-
}
135-
136-
@Test
137-
@DisplayName("when otel service name is set it should be set as service name attribute")
138-
void shouldDetermineServiceNameByOtelServiceName() {
139-
this.contextRunner
140-
.withConfiguration(
141-
AutoConfigurations.of(
142-
OtelResourceAutoConfiguration.class, OpenTelemetryAutoConfiguration.class))
143-
.withPropertyValues("otel.resource.attributes.service.name=otel-name-backend")
144-
.run(
145-
context -> {
146-
Resource otelResource = context.getBean("otelResource", Resource.class);
147-
148-
assertThat(otelResource.getAttribute(SERVICE_NAME)).isEqualTo("otel-name-backend");
149-
});
150-
}
151-
152102
@Test
153103
@DisplayName("when otel attributes are set in properties they should be put in resource")
154104
void shouldInitializeAttributes() {

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

+75
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55

66
package io.opentelemetry.instrumentation.spring.autoconfigure.resources;
77

8+
import static io.opentelemetry.semconv.ResourceAttributes.SERVICE_NAME;
9+
import static io.opentelemetry.semconv.ResourceAttributes.SERVICE_VERSION;
810
import static org.assertj.core.api.Assertions.assertThat;
911
import static org.assertj.core.api.Assertions.entry;
1012

@@ -13,9 +15,12 @@
1315
import io.opentelemetry.instrumentation.spring.autoconfigure.OpenTelemetryAutoConfiguration;
1416
import io.opentelemetry.sdk.autoconfigure.spi.ResourceProvider;
1517
import io.opentelemetry.sdk.autoconfigure.spi.internal.DefaultConfigProperties;
18+
import io.opentelemetry.sdk.resources.Resource;
19+
import java.util.Properties;
1620
import org.junit.jupiter.api.DisplayName;
1721
import org.junit.jupiter.api.Test;
1822
import org.springframework.boot.autoconfigure.AutoConfigurations;
23+
import org.springframework.boot.info.BuildProperties;
1924
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
2025

2126
public class SpringResourceProviderTest {
@@ -54,4 +59,74 @@ void hasDefaultTypes() {
5459
context ->
5560
assertThat(context.getBean(OtelResourceProperties.class).getAttributes()).isEmpty());
5661
}
62+
63+
@Test
64+
@DisplayName(
65+
"when spring.application.name is set value should be passed to service name attribute")
66+
void shouldDetermineServiceNameBySpringApplicationName() {
67+
this.contextRunner
68+
.withPropertyValues("spring.application.name=myapp-backend")
69+
.withConfiguration(
70+
AutoConfigurations.of(
71+
OtelResourceAutoConfiguration.class, OpenTelemetryAutoConfiguration.class))
72+
.run(
73+
context -> {
74+
Resource otelResource = context.getBean("otelResource", Resource.class);
75+
76+
assertThat(otelResource.getAttribute(SERVICE_NAME)).isEqualTo("myapp-backend");
77+
});
78+
}
79+
80+
@Test
81+
@DisplayName(
82+
"when spring.application.name is set value should be passed to service name attribute")
83+
void shouldDetermineServiceNameAndVersionBySpringApplicationVersion() {
84+
Properties properties = new Properties();
85+
properties.put("name", "demo");
86+
properties.put("version", "0.3");
87+
this.contextRunner
88+
.withBean("buildProperties", BuildProperties.class, () -> new BuildProperties(properties))
89+
.withConfiguration(
90+
AutoConfigurations.of(
91+
OtelResourceAutoConfiguration.class, OpenTelemetryAutoConfiguration.class))
92+
.run(
93+
context -> {
94+
Resource otelResource = context.getBean("otelResource", Resource.class);
95+
96+
assertThat(otelResource.getAttribute(SERVICE_NAME)).isEqualTo("demo");
97+
assertThat(otelResource.getAttribute(SERVICE_VERSION)).isEqualTo("0.3");
98+
});
99+
}
100+
101+
@Test
102+
@DisplayName(
103+
"when spring application name and otel service name are not set service name should be default")
104+
void hasDefaultServiceName() {
105+
this.contextRunner
106+
.withConfiguration(
107+
AutoConfigurations.of(
108+
OtelResourceAutoConfiguration.class, OpenTelemetryAutoConfiguration.class))
109+
.run(
110+
context -> {
111+
Resource otelResource = context.getBean("otelResource", Resource.class);
112+
113+
assertThat(otelResource.getAttribute(SERVICE_NAME)).isEqualTo("unknown_service:java");
114+
});
115+
}
116+
117+
@Test
118+
@DisplayName("when otel service name is set it should be set as service name attribute")
119+
void shouldDetermineServiceNameByOtelServiceName() {
120+
this.contextRunner
121+
.withConfiguration(
122+
AutoConfigurations.of(
123+
OtelResourceAutoConfiguration.class, OpenTelemetryAutoConfiguration.class))
124+
.withPropertyValues("otel.resource.attributes.service.name=otel-name-backend")
125+
.run(
126+
context -> {
127+
Resource otelResource = context.getBean("otelResource", Resource.class);
128+
129+
assertThat(otelResource.getAttribute(SERVICE_NAME)).isEqualTo("otel-name-backend");
130+
});
131+
}
57132
}

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")

smoke-tests-otel-starter/src/test/java/io/opentelemetry/smoketest/OtelSpringStarterDisabledSmokeTest.java

+4
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import io.opentelemetry.spring.smoketest.OtelSpringStarterSmokeTestApplication;
99
import org.junit.jupiter.api.Test;
10+
import org.junit.jupiter.api.condition.DisabledInNativeImage;
1011
import org.springframework.boot.test.context.SpringBootTest;
1112

1213
@SpringBootTest(
@@ -15,6 +16,9 @@
1516
OtelSpringStarterSmokeTest.TestConfiguration.class
1617
},
1718
properties = {"otel.sdk.disabled=true"})
19+
@DisabledInNativeImage // Without this the native tests in the OtelSpringStarterSmokeTest class will
20+
// fail with org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "TEST_TABLE"
21+
// already exists
1822
class OtelSpringStarterDisabledSmokeTest {
1923

2024
@Test

0 commit comments

Comments
 (0)