Skip to content

Commit ce2ea96

Browse files
committed
fix(spring-boot-jakarta): Disable Sentry Kafka instrumentation when OTel is active
Skip registration of SentryKafkaProducerBeanPostProcessor and SentryKafkaConsumerBeanPostProcessor when a Sentry OpenTelemetry integration (agent or agentless) is on the classpath. OpenTelemetry provides its own Kafka instrumentation, so Sentry's would create duplicate spans.
1 parent 10a5c63 commit ce2ea96

File tree

2 files changed

+27
-6
lines changed

2 files changed

+27
-6
lines changed

sentry-spring-boot-jakarta/src/main/java/io/sentry/spring/boot/jakarta/SentryAutoConfiguration.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,7 @@ static class SentryCacheConfiguration {
252252
@Configuration(proxyBeanMethods = false)
253253
@ConditionalOnClass(KafkaTemplate.class)
254254
@ConditionalOnProperty(name = "sentry.enable-queue-tracing", havingValue = "true")
255+
@ConditionalOnMissingClass("io.sentry.opentelemetry.SentryAutoConfigurationCustomizerProvider")
255256
@Open
256257
static class SentryKafkaQueueConfiguration {
257258

sentry-spring-boot-jakarta/src/test/kotlin/io/sentry/spring/boot/jakarta/SentryKafkaAutoConfigurationTest.kt

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
package io.sentry.spring.boot.jakarta
22

3+
import io.sentry.opentelemetry.SentryAutoConfigurationCustomizerProvider
34
import io.sentry.spring.jakarta.kafka.SentryKafkaConsumerBeanPostProcessor
45
import io.sentry.spring.jakarta.kafka.SentryKafkaProducerBeanPostProcessor
56
import kotlin.test.Test
67
import org.assertj.core.api.Assertions.assertThat
78
import org.springframework.boot.autoconfigure.AutoConfigurations
9+
import org.springframework.boot.test.context.FilteredClassLoader
810
import org.springframework.boot.test.context.runner.ApplicationContextRunner
911

1012
class SentryKafkaAutoConfigurationTest {
@@ -24,25 +26,43 @@ class SentryKafkaAutoConfigurationTest {
2426
"sentry.debug=false",
2527
)
2628

29+
/** Hide the OTel customizer so conditions evaluate as "no OTel present". */
30+
private val noOtelClassLoader =
31+
FilteredClassLoader(SentryAutoConfigurationCustomizerProvider::class.java)
32+
2733
@Test
2834
fun `registers Kafka BPPs when queue tracing is enabled`() {
29-
contextRunner.withPropertyValues("sentry.enable-queue-tracing=true").run { context ->
30-
assertThat(context).hasSingleBean(SentryKafkaProducerBeanPostProcessor::class.java)
31-
assertThat(context).hasSingleBean(SentryKafkaConsumerBeanPostProcessor::class.java)
32-
}
35+
contextRunner
36+
.withClassLoader(noOtelClassLoader)
37+
.withPropertyValues("sentry.enable-queue-tracing=true")
38+
.run { context ->
39+
assertThat(context).hasSingleBean(SentryKafkaProducerBeanPostProcessor::class.java)
40+
assertThat(context).hasSingleBean(SentryKafkaConsumerBeanPostProcessor::class.java)
41+
}
3342
}
3443

3544
@Test
3645
fun `does not register Kafka BPPs when queue tracing is disabled`() {
37-
contextRunner.run { context ->
46+
contextRunner.withClassLoader(noOtelClassLoader).run { context ->
3847
assertThat(context).doesNotHaveBean(SentryKafkaProducerBeanPostProcessor::class.java)
3948
assertThat(context).doesNotHaveBean(SentryKafkaConsumerBeanPostProcessor::class.java)
4049
}
4150
}
4251

4352
@Test
4453
fun `does not register Kafka BPPs when queue tracing is explicitly false`() {
45-
contextRunner.withPropertyValues("sentry.enable-queue-tracing=false").run { context ->
54+
contextRunner
55+
.withClassLoader(noOtelClassLoader)
56+
.withPropertyValues("sentry.enable-queue-tracing=false")
57+
.run { context ->
58+
assertThat(context).doesNotHaveBean(SentryKafkaProducerBeanPostProcessor::class.java)
59+
assertThat(context).doesNotHaveBean(SentryKafkaConsumerBeanPostProcessor::class.java)
60+
}
61+
}
62+
63+
@Test
64+
fun `does not register Kafka BPPs when OpenTelemetry integration is present`() {
65+
contextRunner.withPropertyValues("sentry.enable-queue-tracing=true").run { context ->
4666
assertThat(context).doesNotHaveBean(SentryKafkaProducerBeanPostProcessor::class.java)
4767
assertThat(context).doesNotHaveBean(SentryKafkaConsumerBeanPostProcessor::class.java)
4868
}

0 commit comments

Comments
 (0)