Skip to content

Commit

Permalink
support properties customizer and default properties
Browse files Browse the repository at this point in the history
  • Loading branch information
zeitlinger committed Mar 11, 2024
1 parent fdb0773 commit 696ea96
Show file tree
Hide file tree
Showing 8 changed files with 95 additions and 51 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,16 +9,7 @@ group = "io.opentelemetry.instrumentation"
val versions: Map<String, String> by project
val springBootVersion = versions["org.springframework.boot"]

configurations.all {
resolutionStrategy {
force("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure:1.36.0-SNAPSHOT")
force("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi:1.36.0-SNAPSHOT")
}
}

dependencies {
implementation("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure:1.36.0-SNAPSHOT")
implementation("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi:1.36.0-SNAPSHOT")
implementation("org.springframework.boot:spring-boot-autoconfigure:$springBootVersion")
annotationProcessor("org.springframework.boot:spring-boot-autoconfigure-processor:$springBootVersion")
annotationProcessor("org.springframework.boot:spring-boot-configuration-processor:$springBootVersion")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
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;
Expand All @@ -30,7 +29,6 @@
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.expression.spel.standard.SpelExpressionParser;

/**
* Create {@link io.opentelemetry.api.OpenTelemetry} bean if bean is missing.
Expand Down Expand Up @@ -61,21 +59,6 @@ public MapConverter mapConverter() {
return new MapConverter();
}

@Bean
@ConditionalOnMissingBean
ConfigProperties configProperties(
Environment env,
OtlpExporterProperties otlpExporterProperties,
OtelResourceProperties resourceProperties,
PropagationProperties propagationProperties) {
return new SpringConfigProperties(
env,
new SpelExpressionParser(),
otlpExporterProperties,
resourceProperties,
propagationProperties);
}

@Bean
public SpringComponentLoader springComponentLoader(ApplicationContext applicationContext) {
return new SpringComponentLoader(applicationContext);
Expand All @@ -95,14 +78,24 @@ public ResourceProvider otelDistroVersionResourceProvider() {
// If you change the bean name, also change it in the OpenTelemetryJdbcDriverAutoConfiguration
// class
public OpenTelemetry openTelemetry(
Environment env,
OtlpExporterProperties otlpExporterProperties,
OtelResourceProperties resourceProperties,
PropagationProperties propagationProperties,
SpringComponentLoader componentLoader,
ConfigProperties configProperties,
ObjectProvider<OpenTelemetryInjector> openTelemetryConsumerProvider) {

OpenTelemetry openTelemetry =
AutoConfigureUtil.setComponentLoader(
AutoConfigureUtil.setConfigPropertiesCustomizer(
AutoConfiguredOpenTelemetrySdk.builder(), c -> configProperties),
AutoConfiguredOpenTelemetrySdk.builder(),
c ->
SpringConfigProperties.create(
env,
otlpExporterProperties,
resourceProperties,
propagationProperties,
c)),
componentLoader)
.build()
.getOpenTelemetrySdk();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import javax.annotation.Nullable;
import org.springframework.core.env.Environment;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;

public class SpringConfigProperties implements ConfigProperties {
private final Environment environment;
Expand All @@ -23,18 +24,37 @@ public class SpringConfigProperties implements ConfigProperties {
private final OtlpExporterProperties otlpExporterProperties;
private final OtelResourceProperties resourceProperties;
private final PropagationProperties propagationProperties;
private final ConfigProperties fallback;

public SpringConfigProperties(
Environment environment,
ExpressionParser parser,
OtlpExporterProperties otlpExporterProperties,
OtelResourceProperties resourceProperties,
PropagationProperties propagationProperties) {
PropagationProperties propagationProperties,
ConfigProperties fallback) {
this.environment = environment;
this.parser = parser;
this.otlpExporterProperties = otlpExporterProperties;
this.resourceProperties = resourceProperties;
this.propagationProperties = propagationProperties;
this.fallback = fallback;
}

// visible for testing
public static ConfigProperties create(
Environment env,
OtlpExporterProperties otlpExporterProperties,
OtelResourceProperties resourceProperties,
PropagationProperties propagationProperties,
ConfigProperties fallback) {
return new SpringConfigProperties(
env,
new SpelExpressionParser(),
otlpExporterProperties,
resourceProperties,
propagationProperties,
fallback);
}

@Nullable
Expand All @@ -46,31 +66,31 @@ public String getString(String name) {
// in specification to default to `http/protobuf`
return OtlpConfigUtil.PROTOCOL_HTTP_PROTOBUF;
}
return value;
return or(value, fallback.getString(name));
}

@Nullable
@Override
public Boolean getBoolean(String name) {
return environment.getProperty(name, Boolean.class);
return or(environment.getProperty(name, Boolean.class), fallback.getBoolean(name));
}

@Nullable
@Override
public Integer getInt(String name) {
return environment.getProperty(name, Integer.class);
return or(environment.getProperty(name, Integer.class), fallback.getInt(name));
}

@Nullable
@Override
public Long getLong(String name) {
return environment.getProperty(name, Long.class);
return or(environment.getProperty(name, Long.class), fallback.getLong(name));
}

@Nullable
@Override
public Double getDouble(String name) {
return environment.getProperty(name, Double.class);
return or(environment.getProperty(name, Double.class), fallback.getDouble(name));
}

@SuppressWarnings("unchecked")
Expand All @@ -80,16 +100,15 @@ public List<String> getList(String name) {
return propagationProperties.getPropagators();
}

List<String> value = environment.getProperty(name, List.class);
return value == null ? Collections.emptyList() : value;
return or(environment.getProperty(name, List.class), fallback.getList(name));
}

@Nullable
@Override
public Duration getDuration(String name) {
String value = getString(name);
if (value == null) {
return null;
return fallback.getDuration(name);
}
return DefaultConfigProperties.createFromMap(Collections.singletonMap(name, value))
.getDuration(name);
Expand All @@ -116,8 +135,13 @@ public Map<String, String> getMap(String name) {

String value = environment.getProperty(name);
if (value == null) {
return Collections.emptyMap();
return fallback.getMap(name);
}
return (Map<String, String>) parser.parseExpression(value).getValue();
}

@Nullable
private static <T> T or(@Nullable T first, @Nullable T second) {
return first != null ? first : second;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,9 @@

import io.opentelemetry.instrumentation.spring.autoconfigure.OpenTelemetryAutoConfiguration;
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
import io.opentelemetry.sdk.autoconfigure.spi.internal.DefaultConfigProperties;
import java.util.Arrays;
import java.util.Collections;
import java.util.stream.Stream;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
Expand Down Expand Up @@ -90,6 +92,7 @@ private static ConfigProperties getConfig(AssertableApplicationContext context)
new SpelExpressionParser(),
context.getBean(OtlpExporterProperties.class),
new OtelResourceProperties(),
new PropagationProperties());
new PropagationProperties(),
DefaultConfigProperties.createFromMap(Collections.emptyMap()));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@
import io.opentelemetry.instrumentation.spring.autoconfigure.properties.OtlpExporterProperties;
import io.opentelemetry.instrumentation.spring.autoconfigure.properties.PropagationProperties;
import io.opentelemetry.instrumentation.spring.autoconfigure.properties.SpringConfigProperties;
import io.opentelemetry.sdk.autoconfigure.spi.internal.DefaultConfigProperties;
import java.util.HashMap;
import java.util.Map;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
Expand All @@ -30,19 +33,26 @@ void shouldInitializeAttributesByMapInArow() {
.run(
context -> {
Environment env = context.getBean("environment", Environment.class);
Map<String, String> fallback = new HashMap<>();
fallback.put("fallback", "fallbackVal");
fallback.put("otel.springboot.test.map", "hidden");

SpringConfigProperties config =
new SpringConfigProperties(
env,
new SpelExpressionParser(),
new OtlpExporterProperties(),
new OtelResourceProperties(),
new PropagationProperties());
new PropagationProperties(),
DefaultConfigProperties.createFromMap(fallback));

assertThat(config.getMap("otel.springboot.test.map"))
.contains(
entry("environment", "dev"),
entry("xyz", "foo"),
entry("service.instance.id", "id-example"));

assertThat(config.getString("fallback")).isEqualTo("fallbackVal");
});
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,16 +9,23 @@
import static io.opentelemetry.semconv.ResourceAttributes.SERVICE_VERSION;

import io.opentelemetry.instrumentation.spring.autoconfigure.OpenTelemetryAutoConfiguration;
import io.opentelemetry.instrumentation.spring.autoconfigure.properties.OtelResourceProperties;
import io.opentelemetry.instrumentation.spring.autoconfigure.properties.OtlpExporterProperties;
import io.opentelemetry.instrumentation.spring.autoconfigure.properties.PropagationProperties;
import io.opentelemetry.instrumentation.spring.autoconfigure.properties.SpringConfigProperties;
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
import io.opentelemetry.sdk.autoconfigure.spi.internal.DefaultConfigProperties;
import io.opentelemetry.sdk.testing.assertj.AttributesAssert;
import io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions;
import java.util.Collections;
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;
import org.springframework.core.env.Environment;

public class SpringResourceProviderTest {

Expand Down Expand Up @@ -56,10 +63,18 @@ void shouldDetermineServiceNameAndVersionBySpringApplicationVersion() {
}

private static AttributesAssert assertResourceAttributes(AssertableApplicationContext context) {
ConfigProperties configProperties =
SpringConfigProperties.create(
context.getBean(Environment.class),
new OtlpExporterProperties(),
new OtelResourceProperties(),
new PropagationProperties(),
DefaultConfigProperties.createFromMap(Collections.emptyMap()));

return OpenTelemetryAssertions.assertThat(
context
.getBean(SpringResourceProvider.class)
.createResource(context.getBean(ConfigProperties.class))
.createResource(configProperties)
.getAttributes());
}
}
9 changes: 0 additions & 9 deletions smoke-tests-otel-starter/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -10,16 +10,7 @@ otelJava {
minJavaVersionSupported.set(JavaVersion.VERSION_17)
}

configurations.all {
resolutionStrategy {
force("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure:1.36.0-SNAPSHOT")
force("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi:1.36.0-SNAPSHOT")
}
}

dependencies {
implementation("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure:1.36.0-SNAPSHOT")
implementation("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi:1.36.0-SNAPSHOT")
implementation("org.springframework.boot:spring-boot-starter-web")
implementation("org.springframework.boot:spring-boot-starter-data-jdbc")
implementation("com.h2database:h2")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,12 @@

import io.opentelemetry.api.common.AttributeKey;
import io.opentelemetry.api.trace.SpanKind;
import io.opentelemetry.instrumentation.spring.autoconfigure.properties.OtelResourceProperties;
import io.opentelemetry.instrumentation.spring.autoconfigure.properties.OtlpExporterProperties;
import io.opentelemetry.instrumentation.spring.autoconfigure.properties.PropagationProperties;
import io.opentelemetry.instrumentation.spring.autoconfigure.properties.SpringConfigProperties;
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
import io.opentelemetry.sdk.autoconfigure.spi.internal.DefaultConfigProperties;
import io.opentelemetry.sdk.autoconfigure.spi.logs.ConfigurableLogRecordExporterProvider;
import io.opentelemetry.sdk.autoconfigure.spi.metrics.ConfigurableMetricExporterProvider;
import io.opentelemetry.sdk.autoconfigure.spi.traces.ConfigurableSpanExporterProvider;
Expand All @@ -27,13 +32,15 @@
import io.opentelemetry.semconv.SemanticAttributes;
import io.opentelemetry.spring.smoketest.OtelSpringStarterSmokeTestApplication;
import io.opentelemetry.spring.smoketest.OtelSpringStarterSmokeTestController;
import java.util.Collections;
import java.util.List;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.web.client.TestRestTemplate;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;

@SpringBootTest(
classes = {
Expand Down Expand Up @@ -63,7 +70,10 @@ class OtelSpringStarterSmokeTest {

@Autowired private TestRestTemplate testRestTemplate;

@Autowired private ConfigProperties configProperties;
@Autowired private Environment environment;
@Autowired private PropagationProperties propagationProperties;
@Autowired private OtelResourceProperties otelResourceProperties;
@Autowired private OtlpExporterProperties otlpExporterProperties;

@Configuration(proxyBeanMethods = false)
static class TestConfiguration {
Expand Down Expand Up @@ -116,6 +126,13 @@ public String getName() {

@Test
void propertyConversion() {
ConfigProperties configProperties =
SpringConfigProperties.create(
environment,
otlpExporterProperties,
otelResourceProperties,
propagationProperties,
DefaultConfigProperties.createFromMap(Collections.emptyMap()));
assertThat(configProperties.getMap("otel.exporter.otlp.headers"))
.containsEntry("a", "1")
.containsEntry("b", "2");
Expand Down

0 comments on commit 696ea96

Please sign in to comment.