Skip to content

Commit acabbc0

Browse files
authored
Configure OtlpGrpcSpanExporter bean (#148)
1 parent 48f4886 commit acabbc0

File tree

5 files changed

+47
-17
lines changed

5 files changed

+47
-17
lines changed

spring-boot-3-demo-app/build.gradle.kts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
plugins {
22
id("sb-ot-demo.java-conventions")
33
id("sb-ot-demo.docker")
4-
id("org.springframework.boot") version "3.2.5"
4+
id("org.springframework.boot") version "3.3.2"
55
id("io.freefair.lombok")
66
}
77

88
dependencies {
99
implementation(platform(project(":common-internal-bom")))
10-
implementation(platform("org.springdoc:springdoc-openapi:2.3.0"))
11-
implementation(platform("org.springframework.boot:spring-boot-dependencies:3.2.5"))
10+
implementation(platform("org.springdoc:springdoc-openapi:2.6.0"))
11+
implementation(platform("org.springframework.boot:spring-boot-dependencies:3.3.2"))
1212

1313
implementation("org.springframework.boot:spring-boot-starter-web")
1414
implementation("org.springframework.boot:spring-boot-starter-actuator")
Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,30 @@
11
package io.github.mfvanek.spring.boot3.test.config;
22

33
import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporter;
4-
import org.springframework.beans.factory.annotation.Value;
4+
import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporterBuilder;
5+
import org.springframework.boot.actuate.autoconfigure.tracing.otlp.OtlpAutoConfiguration;
6+
import org.springframework.boot.actuate.autoconfigure.tracing.otlp.OtlpProperties;
7+
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
8+
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
59
import org.springframework.context.annotation.Bean;
610
import org.springframework.context.annotation.Configuration;
711

812
import javax.annotation.Nonnull;
13+
import java.util.Locale;
914

15+
@AutoConfigureBefore(OtlpAutoConfiguration.class)
1016
@Configuration(proxyBeanMethods = false)
11-
public class OpenTelemetryConfig {
17+
class OpenTelemetryConfig {
1218

19+
// Waiting for https://github.com/spring-projects/spring-boot/pull/41213
1320
@Bean
14-
OtlpGrpcSpanExporter otelJaegerGrpcSpanExporter(
15-
@Value("${management.otlp.metrics.export.url}") final @Nonnull String endpoint) {
16-
return OtlpGrpcSpanExporter.builder()
17-
.setEndpoint(endpoint)
18-
.build();
21+
@ConditionalOnMissingBean(OtlpGrpcSpanExporter.class)
22+
OtlpGrpcSpanExporter otelJaegerGrpcSpanExporter(@Nonnull final OtlpProperties otlpProperties) {
23+
OtlpGrpcSpanExporterBuilder builder = OtlpGrpcSpanExporter.builder()
24+
.setEndpoint(otlpProperties.getEndpoint())
25+
.setTimeout(otlpProperties.getTimeout())
26+
.setCompression(String.valueOf(otlpProperties.getCompression()).toLowerCase(Locale.ROOT));
27+
otlpProperties.getHeaders().forEach(builder::addHeader);
28+
return builder.build();
1929
}
2030
}

spring-boot-3-demo-app/src/main/resources/application.yml

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -71,9 +71,9 @@ management:
7171
slo:
7272
http.server.requests: 1s
7373
health:
74-
livenessstate:
74+
livenessState:
7575
enabled: true
76-
readinessstate:
76+
readinessState:
7777
enabled: true
7878
prometheus:
7979
metrics:
@@ -88,9 +88,10 @@ management:
8888
sampling:
8989
probability: 1.0
9090
otlp:
91-
metrics:
92-
export:
93-
url: http://localhost:4317
91+
tracing:
92+
endpoint: http://localhost:4317
93+
compression: none
94+
timeout: 5s
9495

9596
springdoc:
9697
show-actuator: true
@@ -101,4 +102,4 @@ springdoc:
101102
spring:
102103
config.activate.on-profile: docker
103104
kafka.bootstrap-servers: kafka1:29092
104-
management.otlp.metrics.export.url: http://jaeger:4317
105+
management.otlp.tracing.endpoint: http://jaeger:4317

spring-boot-3-demo-app/src/test/java/io/github/mfvanek/spring/boot3/test/ApplicationTests.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,18 @@
11
package io.github.mfvanek.spring.boot3.test;
22

3+
import io.github.mfvanek.spring.boot3.test.support.JaegerInitializer;
34
import io.github.mfvanek.spring.boot3.test.support.TestBase;
45
import io.micrometer.observation.ObservationRegistry;
56
import io.micrometer.tracing.Span;
67
import io.micrometer.tracing.Tracer;
78
import io.micrometer.tracing.otel.bridge.OtelTracer;
9+
import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporter;
810
import org.junit.jupiter.api.Test;
911
import org.springframework.beans.factory.annotation.Autowired;
1012
import org.springframework.context.ApplicationContext;
1113

14+
import java.util.Locale;
15+
1216
import static org.assertj.core.api.Assertions.assertThat;
1317

1418
class ApplicationTests extends TestBase {
@@ -28,5 +32,13 @@ void contextLoads() {
2832
.isInstanceOf(OtelTracer.class)
2933
.satisfies(t -> assertThat(t.currentSpan())
3034
.isNotEqualTo(Span.NOOP));
35+
assertThat(applicationContext.getBean("otelJaegerGrpcSpanExporter"))
36+
.isNotNull()
37+
.isInstanceOf(OtlpGrpcSpanExporter.class)
38+
.hasToString(String.format(Locale.ROOT, "OtlpGrpcSpanExporter{exporterName=otlp, type=span, " +
39+
"endpoint=http://localhost:%d, " +
40+
"endpointPath=/opentelemetry.proto.collector.trace.v1.TraceService/Export, timeoutNanos=5000000000, " +
41+
"connectTimeoutNanos=10000000000, compressorEncoding=null, " +
42+
"headers=Headers{User-Agent=OBFUSCATED}}", JaegerInitializer.getFirstMappedPort()));
3143
}
3244
}

spring-boot-3-demo-app/src/test/java/io/github/mfvanek/spring/boot3/test/support/JaegerInitializer.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
import org.testcontainers.containers.GenericContainer;
77
import org.testcontainers.utility.DockerImageName;
88

9+
import javax.annotation.Nonnull;
10+
911
@SuppressWarnings("resource")
1012
public class JaegerInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
1113

@@ -19,7 +21,12 @@ public void initialize(final ConfigurableApplicationContext context) {
1921

2022
final String jaegerUrl = "http://localhost:" + JAEGER.getFirstMappedPort();
2123
TestPropertyValues.of(
22-
"management.otlp.metrics.export.url=" + jaegerUrl
24+
"management.otlp.tracing.endpoint=" + jaegerUrl
2325
).applyTo(context.getEnvironment());
2426
}
27+
28+
@Nonnull
29+
public static Integer getFirstMappedPort() {
30+
return JAEGER.getFirstMappedPort();
31+
}
2532
}

0 commit comments

Comments
 (0)