Skip to content
Merged
Prev Previous commit
Next Next commit
fix rebase
  • Loading branch information
zeitlinger committed Mar 11, 2024
commit f8de9ed477da7af058158de6f9a79be6d17dbcff
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,16 @@
import io.opentelemetry.instrumentation.spring.autoconfigure.resources.DistroVersionResourceProvider;
import io.opentelemetry.instrumentation.spring.autoconfigure.resources.SpringResourceProvider;
import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk;
import io.opentelemetry.sdk.autoconfigure.internal.AutoConfigureUtil;
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
import io.opentelemetry.sdk.autoconfigure.spi.ResourceProvider;
import java.util.Optional;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.ConfigurationPropertiesBinding;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.info.BuildProperties;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
Expand Down Expand Up @@ -79,8 +82,8 @@ public SpringComponentLoader springComponentLoader(ApplicationContext applicatio
}

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

@Bean
Expand All @@ -97,9 +100,10 @@ public OpenTelemetry openTelemetry(
ObjectProvider<OpenTelemetryInjector> openTelemetryConsumerProvider) {

OpenTelemetry openTelemetry =
AutoConfiguredOpenTelemetrySdk.builder()
.setConfig(configProperties)
.setComponentLoader(componentLoader)
AutoConfigureUtil.setComponentLoader(
AutoConfigureUtil.setConfigPropertiesCustomizer(
AutoConfiguredOpenTelemetrySdk.builder(), c -> configProperties),
componentLoader)
.build()
.getOpenTelemetrySdk();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,6 @@

import io.opentelemetry.sdk.autoconfigure.internal.ComponentLoader;
import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper;
import io.opentelemetry.sdk.autoconfigure.spi.Ordered;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
import org.springframework.context.ApplicationContext;
Expand All @@ -35,20 +33,4 @@ public <T> Iterable<T> load(Class<T> spiClass) {
spi.addAll(beans);
return spi;
}

@Override
public <T extends Ordered> List<T> loadOrdered(Class<T> spiClass) {
List<T> result = spiHelper.loadOrdered(spiClass);

// don't use the Ordered annotation, because users have to implement the order method anyways
List<T> beans =
applicationContext.getBeanProvider(spiClass).stream()
.sorted(Comparator.comparing(Ordered::order))
.collect(Collectors.toList());

// (user provided) beans have a higher priority, e.g. to replace a resource from a resource
// provider
result.addAll(beans);
return result;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,64 +7,36 @@

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;

import com.google.common.collect.ImmutableMap;
import io.opentelemetry.api.common.AttributeKey;
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 io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
import io.opentelemetry.sdk.testing.assertj.AttributesAssert;
import io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions;
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.assertj.AssertableApplicationContext;
import org.springframework.boot.test.context.runner.ApplicationContextRunner;

public class SpringResourceProviderTest {

private final ApplicationContextRunner contextRunner =
new ApplicationContextRunner()
.withPropertyValues(
"otel.traces.exporter=none", "otel.metrics.exporter=none", "otel.logs.exporter=none")
.withConfiguration(AutoConfigurations.of(OpenTelemetryAutoConfiguration.class));

@Test
@DisplayName("when attributes are SET should set OtelResourceProperties with given attributes")
void hasAttributes() {

this.contextRunner.run(
context -> {
ResourceProvider resource =
context.getBean("otelSpringResourceProvider", ResourceProvider.class);

assertThat(
resource
.createResource(
DefaultConfigProperties.createFromMap(
ImmutableMap.of("spring.application.name", "backend")))
.getAttributes()
.asMap())
.contains(entry(AttributeKey.stringKey("service.name"), "backend"));
});
}

@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");
});
context ->
assertResourceAttributes(context).containsEntry(SERVICE_NAME, "myapp-backend"));
}

@Test
Expand All @@ -76,47 +48,18 @@ void shouldDetermineServiceNameAndVersionBySpringApplicationVersion() {
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");
});
context ->
assertResourceAttributes(context)
.containsEntry(SERVICE_NAME, "demo")
.containsEntry(SERVICE_VERSION, "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");
});
private static AttributesAssert assertResourceAttributes(AssertableApplicationContext context) {
return OpenTelemetryAssertions.assertThat(
context
.getBean(SpringResourceProvider.class)
.createResource(context.getBean(ConfigProperties.class))
.getAttributes());
}
}