Skip to content

Commit

Permalink
Fix native tests (#10685)
Browse files Browse the repository at this point in the history
Co-authored-by: Jean Bisutti <[email protected]>
Co-authored-by: Trask Stalnaker <[email protected]>
Co-authored-by: Lauri Tulmin <[email protected]>
  • Loading branch information
4 people authored Feb 29, 2024
1 parent f8c1094 commit c73bf8e
Show file tree
Hide file tree
Showing 9 changed files with 106 additions and 70 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,6 @@ dependencies {
compileOnly(project(":instrumentation-annotations"))

compileOnly(project(":instrumentation:resources:library"))
compileOnly(project(":instrumentation:spring:spring-boot-resources:library"))
annotationProcessor("com.google.auto.service:auto-service")
compileOnly("com.google.auto.service:auto-service-annotations")

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,14 @@
import io.opentelemetry.instrumentation.resources.ProcessRuntimeResourceProvider;
import io.opentelemetry.instrumentation.spring.autoconfigure.OpenTelemetryAutoConfiguration;
import io.opentelemetry.instrumentation.spring.autoconfigure.internal.SdkEnabled;
import io.opentelemetry.instrumentation.spring.resources.SpringBootServiceNameDetector;
import io.opentelemetry.instrumentation.spring.resources.SpringBootServiceVersionDetector;
import io.opentelemetry.sdk.autoconfigure.internal.EnvironmentResourceProvider;
import io.opentelemetry.sdk.autoconfigure.spi.ResourceProvider;
import java.util.Optional;
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.info.BuildProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
Expand All @@ -42,27 +42,15 @@ public ResourceProvider otelEnvironmentResourceProvider() {
}

@Bean
public ResourceProvider otelSpringResourceProvider() {
return new SpringResourceProvider();
public ResourceProvider otelSpringResourceProvider(Optional<BuildProperties> buildProperties) {
return new SpringResourceProvider(buildProperties);
}

@Bean
public ResourceProvider otelDistroVersionResourceProvider() {
return new DistroVersionResourceProvider();
}

@Bean
@ConditionalOnClass(SpringBootServiceNameDetector.class)
public ResourceProvider otelSpringBootServiceNameResourceProvider() {
return new SpringBootServiceNameDetector();
}

@Bean
@ConditionalOnClass(SpringBootServiceVersionDetector.class)
public ResourceProvider otelSpringBootServiceVersionResourceProvider() {
return new SpringBootServiceVersionDetector();
}

@Bean
@ConditionalOnClass(OsResource.class)
public ResourceProvider otelOsResourceProvider() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,16 +11,33 @@
import io.opentelemetry.sdk.autoconfigure.spi.ResourceProvider;
import io.opentelemetry.sdk.resources.Resource;
import io.opentelemetry.semconv.ResourceAttributes;
import java.util.Optional;
import org.springframework.boot.info.BuildProperties;

public class SpringResourceProvider implements ResourceProvider {

private final Optional<BuildProperties> buildProperties;

public SpringResourceProvider(Optional<BuildProperties> buildProperties) {
this.buildProperties = buildProperties;
}

@Override
public Resource createResource(ConfigProperties configProperties) {
AttributesBuilder attributesBuilder = Attributes.builder();
buildProperties
.map(BuildProperties::getName)
.ifPresent(v -> attributesBuilder.put(ResourceAttributes.SERVICE_NAME, v));

String springApplicationName = configProperties.getString("spring.application.name");
if (springApplicationName != null) {
attributesBuilder.put(ResourceAttributes.SERVICE_NAME, springApplicationName);
}

buildProperties
.map(BuildProperties::getVersion)
.ifPresent(v -> attributesBuilder.put(ResourceAttributes.SERVICE_VERSION, v));

return Resource.create(attributesBuilder.build());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@

package io.opentelemetry.instrumentation.spring.autoconfigure;

import static io.opentelemetry.semconv.ResourceAttributes.SERVICE_NAME;
import static org.assertj.core.api.Assertions.assertThat;

import io.opentelemetry.api.OpenTelemetry;
Expand Down Expand Up @@ -100,55 +99,6 @@ void initializeOpenTelemetryWithCustomProviders() {
.doesNotHaveBean("sdkLoggerProvider"));
}

@Test
@DisplayName(
"when spring.application.name is set value should be passed to service name attribute")
void shouldDetermineServiceNameBySpringApplicationName() {
this.contextRunner
.withPropertyValues("spring.application.name=myapp-backend")
.withConfiguration(
AutoConfigurations.of(
OtelResourceAutoConfiguration.class, OpenTelemetryAutoConfiguration.class))
.run(
context -> {
Resource otelResource = context.getBean("otelResource", Resource.class);

assertThat(otelResource.getAttribute(SERVICE_NAME)).isEqualTo("myapp-backend");
});
}

@Test
@DisplayName(
"when spring application name and otel service name are not set service name should be default")
void hasDefaultServiceName() {
this.contextRunner
.withConfiguration(
AutoConfigurations.of(
OtelResourceAutoConfiguration.class, OpenTelemetryAutoConfiguration.class))
.run(
context -> {
Resource otelResource = context.getBean("otelResource", Resource.class);

assertThat(otelResource.getAttribute(SERVICE_NAME)).isEqualTo("unknown_service:java");
});
}

@Test
@DisplayName("when otel service name is set it should be set as service name attribute")
void shouldDetermineServiceNameByOtelServiceName() {
this.contextRunner
.withConfiguration(
AutoConfigurations.of(
OtelResourceAutoConfiguration.class, OpenTelemetryAutoConfiguration.class))
.withPropertyValues("otel.resource.attributes.service.name=otel-name-backend")
.run(
context -> {
Resource otelResource = context.getBean("otelResource", Resource.class);

assertThat(otelResource.getAttribute(SERVICE_NAME)).isEqualTo("otel-name-backend");
});
}

@Test
@DisplayName("when otel attributes are set in properties they should be put in resource")
void shouldInitializeAttributes() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@

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

import static io.opentelemetry.semconv.ResourceAttributes.SERVICE_NAME;
import static io.opentelemetry.semconv.ResourceAttributes.SERVICE_VERSION;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.entry;

Expand All @@ -13,9 +15,12 @@
import io.opentelemetry.instrumentation.spring.autoconfigure.OpenTelemetryAutoConfiguration;
import io.opentelemetry.sdk.autoconfigure.spi.ResourceProvider;
import io.opentelemetry.sdk.autoconfigure.spi.internal.DefaultConfigProperties;
import io.opentelemetry.sdk.resources.Resource;
import java.util.Properties;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.boot.autoconfigure.AutoConfigurations;
import org.springframework.boot.info.BuildProperties;
import org.springframework.boot.test.context.runner.ApplicationContextRunner;

public class SpringResourceProviderTest {
Expand Down Expand Up @@ -54,4 +59,74 @@ void hasDefaultTypes() {
context ->
assertThat(context.getBean(OtelResourceProperties.class).getAttributes()).isEmpty());
}

@Test
@DisplayName(
"when spring.application.name is set value should be passed to service name attribute")
void shouldDetermineServiceNameBySpringApplicationName() {
this.contextRunner
.withPropertyValues("spring.application.name=myapp-backend")
.withConfiguration(
AutoConfigurations.of(
OtelResourceAutoConfiguration.class, OpenTelemetryAutoConfiguration.class))
.run(
context -> {
Resource otelResource = context.getBean("otelResource", Resource.class);

assertThat(otelResource.getAttribute(SERVICE_NAME)).isEqualTo("myapp-backend");
});
}

@Test
@DisplayName(
"when spring.application.name is set value should be passed to service name attribute")
void shouldDetermineServiceNameAndVersionBySpringApplicationVersion() {
Properties properties = new Properties();
properties.put("name", "demo");
properties.put("version", "0.3");
this.contextRunner
.withBean("buildProperties", BuildProperties.class, () -> new BuildProperties(properties))
.withConfiguration(
AutoConfigurations.of(
OtelResourceAutoConfiguration.class, OpenTelemetryAutoConfiguration.class))
.run(
context -> {
Resource otelResource = context.getBean("otelResource", Resource.class);

assertThat(otelResource.getAttribute(SERVICE_NAME)).isEqualTo("demo");
assertThat(otelResource.getAttribute(SERVICE_VERSION)).isEqualTo("0.3");
});
}

@Test
@DisplayName(
"when spring application name and otel service name are not set service name should be default")
void hasDefaultServiceName() {
this.contextRunner
.withConfiguration(
AutoConfigurations.of(
OtelResourceAutoConfiguration.class, OpenTelemetryAutoConfiguration.class))
.run(
context -> {
Resource otelResource = context.getBean("otelResource", Resource.class);

assertThat(otelResource.getAttribute(SERVICE_NAME)).isEqualTo("unknown_service:java");
});
}

@Test
@DisplayName("when otel service name is set it should be set as service name attribute")
void shouldDetermineServiceNameByOtelServiceName() {
this.contextRunner
.withConfiguration(
AutoConfigurations.of(
OtelResourceAutoConfiguration.class, OpenTelemetryAutoConfiguration.class))
.withPropertyValues("otel.resource.attributes.service.name=otel-name-backend")
.run(
context -> {
Resource otelResource = context.getBean("otelResource", Resource.class);

assertThat(otelResource.getAttribute(SERVICE_NAME)).isEqualTo("otel-name-backend");
});
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,8 @@
* <li>Check for --spring.application.name program argument via sun.java.command system property
* </ul>
*
* <p>Note: should not be used inside a spring application, where the spring.application.name is
* already available.
* <p>Note: The spring starter already includes provider in
* io.opentelemetry.instrumentation.spring.autoconfigure.resources.SpringResourceProvider
*/
@AutoService(ResourceProvider.class)
public class SpringBootServiceNameDetector implements ConditionalResourceProvider {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,10 @@
import java.util.Properties;
import java.util.logging.Logger;

/**
* Note: The spring starter already includes provider in
* io.opentelemetry.instrumentation.spring.autoconfigure.resources.SpringResourceProvider
*/
@AutoService(ResourceProvider.class)
public class SpringBootServiceVersionDetector implements ResourceProvider {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ dependencies {
api(project(":instrumentation:spring:spring-boot-autoconfigure"))
api(project(":instrumentation-annotations"))
implementation(project(":instrumentation:resources:library"))
implementation(project(":instrumentation:spring:spring-boot-resources:library"))
api("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi")
api("io.opentelemetry:opentelemetry-api")
api("io.opentelemetry:opentelemetry-exporter-logging")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

import io.opentelemetry.spring.smoketest.OtelSpringStarterSmokeTestApplication;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.DisabledInNativeImage;
import org.springframework.boot.test.context.SpringBootTest;

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

@Test
Expand Down

0 comments on commit c73bf8e

Please sign in to comment.