Skip to content

Commit cd6e4de

Browse files
authored
Add retries and compression while sending spans to OTLP collector (#288)
1 parent 61b7c83 commit cd6e4de

File tree

6 files changed

+37
-36
lines changed

6 files changed

+37
-36
lines changed

spring-boot-3-demo-app-kotlin/src/main/kotlin/io/github/mfvanek/spring/boot3/kotlin/test/config/OpenTelemetryConfig.kt

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,27 +7,29 @@
77

88
package io.github.mfvanek.spring.boot3.kotlin.test.config
99

10-
import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporter
11-
import jakarta.annotation.Nonnull
10+
import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporterBuilder
11+
import io.opentelemetry.sdk.common.export.RetryPolicy
12+
import org.springframework.beans.factory.annotation.Value
13+
import org.springframework.boot.actuate.autoconfigure.tracing.otlp.OtlpGrpcSpanExporterBuilderCustomizer
1214
import org.springframework.boot.actuate.autoconfigure.tracing.otlp.OtlpTracingAutoConfiguration
13-
import org.springframework.boot.actuate.autoconfigure.tracing.otlp.OtlpTracingProperties
1415
import org.springframework.boot.autoconfigure.AutoConfigureBefore
15-
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean
1616
import org.springframework.context.annotation.Bean
1717
import org.springframework.context.annotation.Configuration
1818

1919
@AutoConfigureBefore(OtlpTracingAutoConfiguration::class)
2020
@Configuration(proxyBeanMethods = false)
2121
class OpenTelemetryConfig {
22+
2223
@Bean
23-
@ConditionalOnMissingBean(OtlpGrpcSpanExporter::class)
24-
fun otelJaegerGrpcSpanExporter(@Nonnull otlpProperties: OtlpTracingProperties): OtlpGrpcSpanExporter {
25-
val builder = OtlpGrpcSpanExporter.builder()
26-
.setEndpoint(otlpProperties.endpoint)
27-
.setTimeout(otlpProperties.timeout)
28-
.setConnectTimeout(otlpProperties.connectTimeout)
29-
.setCompression(otlpProperties.compression.toString().lowercase())
30-
otlpProperties.headers.forEach { (key, value) -> builder.addHeader(key, value) }
31-
return builder.build()
24+
fun otelJaegerGrpcSpanExporterBuilderCustomizer(
25+
@Value("\${management.otlp.tracing.retry.max-attempts:2}") maxAttempts: Int
26+
): OtlpGrpcSpanExporterBuilderCustomizer {
27+
return OtlpGrpcSpanExporterBuilderCustomizer { builder: OtlpGrpcSpanExporterBuilder ->
28+
builder.setRetryPolicy(
29+
RetryPolicy.builder()
30+
.setMaxAttempts(maxAttempts)
31+
.build()
32+
)
33+
}
3234
}
3335
}

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,8 +119,10 @@ management:
119119
otlp:
120120
tracing:
121121
endpoint: http://localhost:4317
122-
compression: none
122+
compression: gzip
123+
transport: grpc
123124
timeout: 5s
125+
connect-timeout: 2s
124126

125127
springdoc:
126128
show-actuator: true

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ class ApplicationTests : TestBase() {
4141
}
4242
)
4343

44-
assertThat(applicationContext.getBean("otelJaegerGrpcSpanExporter"))
44+
assertThat(applicationContext.getBean("otlpGrpcSpanExporter"))
4545
.isNotNull
4646
.isInstanceOf(OtlpGrpcSpanExporter::class.java)
4747
.satisfies(
@@ -51,7 +51,7 @@ class ApplicationTests : TestBase() {
5151
String.format(
5252
Locale.ROOT,
5353
"""
54-
OtlpGrpcSpanExporter{exporterName=otlp, type=span, endpoint=http://localhost:%d, endpointPath=/opentelemetry.proto.collector.trace.v1.TraceService/Export, timeoutNanos=5000000000, connectTimeoutNanos=10000000000, compressorEncoding=null, headers=Headers{User-Agent=OBFUSCATED}, retryPolicy=RetryPolicy{maxAttempts=5, initialBackoff=PT1S, maxBackoff=PT5S, backoffMultiplier=1.5, retryExceptionPredicate=null},
54+
OtlpGrpcSpanExporter{exporterName=otlp, type=span, endpoint=http://localhost:%d, endpointPath=/opentelemetry.proto.collector.trace.v1.TraceService/Export, timeoutNanos=5000000000, connectTimeoutNanos=2000000000, compressorEncoding=gzip, headers=Headers{User-Agent=OBFUSCATED}, retryPolicy=RetryPolicy{maxAttempts=2, initialBackoff=PT1S, maxBackoff=PT5S, backoffMultiplier=1.5, retryExceptionPredicate=null},
5555
""".trimIndent(),
5656
JaegerInitializer.getFirstMappedPort()
5757
)

spring-boot-3-demo-app/src/main/java/io/github/mfvanek/spring/boot3/test/config/OpenTelemetryConfig.java

Lines changed: 11 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,31 +7,26 @@
77

88
package io.github.mfvanek.spring.boot3.test.config;
99

10-
import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporter;
11-
import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporterBuilder;
10+
import io.opentelemetry.sdk.common.export.RetryPolicy;
11+
import org.springframework.beans.factory.annotation.Value;
12+
import org.springframework.boot.actuate.autoconfigure.tracing.otlp.OtlpGrpcSpanExporterBuilderCustomizer;
1213
import org.springframework.boot.actuate.autoconfigure.tracing.otlp.OtlpTracingAutoConfiguration;
13-
import org.springframework.boot.actuate.autoconfigure.tracing.otlp.OtlpTracingProperties;
1414
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
15-
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
1615
import org.springframework.context.annotation.Bean;
1716
import org.springframework.context.annotation.Configuration;
1817

19-
import java.util.Locale;
20-
import javax.annotation.Nonnull;
21-
2218
@AutoConfigureBefore(OtlpTracingAutoConfiguration.class)
2319
@Configuration(proxyBeanMethods = false)
2420
class OpenTelemetryConfig {
2521

2622
@Bean
27-
@ConditionalOnMissingBean(OtlpGrpcSpanExporter.class)
28-
OtlpGrpcSpanExporter otelJaegerGrpcSpanExporter(@Nonnull final OtlpTracingProperties otlpProperties) {
29-
final OtlpGrpcSpanExporterBuilder builder = OtlpGrpcSpanExporter.builder()
30-
.setEndpoint(otlpProperties.getEndpoint())
31-
.setTimeout(otlpProperties.getTimeout())
32-
.setConnectTimeout(otlpProperties.getConnectTimeout())
33-
.setCompression(String.valueOf(otlpProperties.getCompression()).toLowerCase(Locale.ROOT));
34-
otlpProperties.getHeaders().forEach(builder::addHeader);
35-
return builder.build();
23+
OtlpGrpcSpanExporterBuilderCustomizer otelJaegerGrpcSpanExporterBuilderCustomizer(
24+
@Value("${management.otlp.tracing.retry.max-attempts:2}") int maxAttempts
25+
) {
26+
return builder -> builder.setRetryPolicy(
27+
RetryPolicy.builder()
28+
.setMaxAttempts(maxAttempts)
29+
.build()
30+
);
3631
}
3732
}

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,8 +119,10 @@ management:
119119
otlp:
120120
tracing:
121121
endpoint: http://localhost:4317
122-
compression: none
122+
compression: gzip
123+
transport: grpc
123124
timeout: 5s
125+
connect-timeout: 2s
124126

125127
springdoc:
126128
show-actuator: true

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,16 +43,16 @@ void contextLoads() {
4343
.isInstanceOf(OtelTracer.class)
4444
.satisfies(t -> assertThat(t.currentSpan())
4545
.isNotEqualTo(Span.NOOP));
46-
assertThat(applicationContext.getBean("otelJaegerGrpcSpanExporter"))
46+
assertThat(applicationContext.getBean("otlpGrpcSpanExporter"))
4747
.isNotNull()
4848
.isInstanceOf(OtlpGrpcSpanExporter.class)
4949
.satisfies(e -> assertThat(e.toString())
5050
.contains(String.format(Locale.ROOT, """
5151
OtlpGrpcSpanExporter{exporterName=otlp, type=span, endpoint=http://localhost:%d, \
5252
endpointPath=/opentelemetry.proto.collector.trace.v1.TraceService/Export, \
53-
timeoutNanos=5000000000, connectTimeoutNanos=10000000000, compressorEncoding=null, \
53+
timeoutNanos=5000000000, connectTimeoutNanos=2000000000, compressorEncoding=gzip, \
5454
headers=Headers{User-Agent=OBFUSCATED}, \
55-
retryPolicy=RetryPolicy{maxAttempts=5, initialBackoff=PT1S, maxBackoff=PT5S, backoffMultiplier=1.5, retryExceptionPredicate=null},""",
55+
retryPolicy=RetryPolicy{maxAttempts=2, initialBackoff=PT1S, maxBackoff=PT5S, backoffMultiplier=1.5, retryExceptionPredicate=null},""",
5656
JaegerInitializer.getFirstMappedPort())));
5757
}
5858

0 commit comments

Comments
 (0)