Skip to content

Commit 572dc2d

Browse files
adinauerclaude
andcommitted
feat(spring-boot-jakarta): Add Kafka queue auto-configuration
Register SentryKafkaProducerBeanPostProcessor and SentryKafkaConsumerBeanPostProcessor when spring-kafka is on the classpath and sentry.enable-queue-tracing=true. Follows the same pattern as SentryCacheConfiguration. Co-Authored-By: Claude <noreply@anthropic.com>
1 parent 1f00027 commit 572dc2d

File tree

3 files changed

+75
-0
lines changed

3 files changed

+75
-0
lines changed

sentry-spring-boot-jakarta/build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ dependencies {
4040
compileOnly(projects.sentryGraphql)
4141
compileOnly(projects.sentryGraphql22)
4242
compileOnly(projects.sentryQuartz)
43+
compileOnly(libs.spring.kafka3)
4344
compileOnly(Config.Libs.springWeb)
4445
compileOnly(Config.Libs.springWebflux)
4546
compileOnly(libs.context.propagation)
@@ -90,6 +91,7 @@ dependencies {
9091
testImplementation(libs.springboot3.starter)
9192
testImplementation(libs.springboot3.starter.aop)
9293
testImplementation(libs.springboot3.starter.graphql)
94+
testImplementation(libs.spring.kafka3)
9395
testImplementation(libs.springboot3.starter.quartz)
9496
testImplementation(libs.springboot3.starter.security)
9597
testImplementation(libs.springboot3.starter.test)

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

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@
3131
import io.sentry.spring.jakarta.checkin.SentryQuartzConfiguration;
3232
import io.sentry.spring.jakarta.exception.SentryCaptureExceptionParameterPointcutConfiguration;
3333
import io.sentry.spring.jakarta.exception.SentryExceptionParameterAdviceConfiguration;
34+
import io.sentry.spring.jakarta.kafka.SentryKafkaConsumerBeanPostProcessor;
35+
import io.sentry.spring.jakarta.kafka.SentryKafkaProducerBeanPostProcessor;
3436
import io.sentry.spring.jakarta.opentelemetry.SentryOpenTelemetryAgentWithoutAutoInitConfiguration;
3537
import io.sentry.spring.jakarta.opentelemetry.SentryOpenTelemetryNoAgentConfiguration;
3638
import io.sentry.spring.jakarta.tracing.CombinedTransactionNameProvider;
@@ -75,6 +77,7 @@
7577
import org.springframework.core.annotation.Order;
7678
import org.springframework.core.env.Environment;
7779
import org.springframework.graphql.execution.DataFetcherExceptionResolverAdapter;
80+
import org.springframework.kafka.core.KafkaTemplate;
7881
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
7982
import org.springframework.security.core.context.SecurityContextHolder;
8083
import org.springframework.web.client.RestClient;
@@ -246,6 +249,26 @@ static class SentryCacheConfiguration {
246249
}
247250
}
248251

252+
@Configuration(proxyBeanMethods = false)
253+
@ConditionalOnClass(KafkaTemplate.class)
254+
@ConditionalOnProperty(name = "sentry.enable-queue-tracing", havingValue = "true")
255+
@Open
256+
static class SentryKafkaQueueConfiguration {
257+
258+
@Bean
259+
public static @NotNull SentryKafkaProducerBeanPostProcessor
260+
sentryKafkaProducerBeanPostProcessor() {
261+
SentryIntegrationPackageStorage.getInstance().addIntegration("SpringKafka");
262+
return new SentryKafkaProducerBeanPostProcessor();
263+
}
264+
265+
@Bean
266+
public static @NotNull SentryKafkaConsumerBeanPostProcessor
267+
sentryKafkaConsumerBeanPostProcessor() {
268+
return new SentryKafkaConsumerBeanPostProcessor();
269+
}
270+
}
271+
249272
@Configuration(proxyBeanMethods = false)
250273
@ConditionalOnClass(ProceedingJoinPoint.class)
251274
@ConditionalOnProperty(
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package io.sentry.spring.boot.jakarta
2+
3+
import io.sentry.spring.jakarta.kafka.SentryKafkaConsumerBeanPostProcessor
4+
import io.sentry.spring.jakarta.kafka.SentryKafkaProducerBeanPostProcessor
5+
import kotlin.test.Test
6+
import org.assertj.core.api.Assertions.assertThat
7+
import org.springframework.boot.autoconfigure.AutoConfigurations
8+
import org.springframework.boot.test.context.runner.ApplicationContextRunner
9+
10+
class SentryKafkaAutoConfigurationTest {
11+
12+
private val contextRunner =
13+
ApplicationContextRunner()
14+
.withConfiguration(AutoConfigurations.of(SentryAutoConfiguration::class.java))
15+
.withPropertyValues(
16+
"sentry.dsn=http://key@localhost/proj",
17+
"sentry.traces-sample-rate=1.0",
18+
"sentry.shutdownTimeoutMillis=0",
19+
"sentry.sessionFlushTimeoutMillis=0",
20+
"sentry.flushTimeoutMillis=0",
21+
"sentry.readTimeoutMillis=50",
22+
"sentry.connectionTimeoutMillis=50",
23+
"sentry.send-modules=false",
24+
"sentry.debug=false",
25+
)
26+
27+
@Test
28+
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+
}
33+
}
34+
35+
@Test
36+
fun `does not register Kafka BPPs when queue tracing is disabled`() {
37+
contextRunner.run { context ->
38+
assertThat(context).doesNotHaveBean(SentryKafkaProducerBeanPostProcessor::class.java)
39+
assertThat(context).doesNotHaveBean(SentryKafkaConsumerBeanPostProcessor::class.java)
40+
}
41+
}
42+
43+
@Test
44+
fun `does not register Kafka BPPs when queue tracing is explicitly false`() {
45+
contextRunner.withPropertyValues("sentry.enable-queue-tracing=false").run { context ->
46+
assertThat(context).doesNotHaveBean(SentryKafkaProducerBeanPostProcessor::class.java)
47+
assertThat(context).doesNotHaveBean(SentryKafkaConsumerBeanPostProcessor::class.java)
48+
}
49+
}
50+
}

0 commit comments

Comments
 (0)