Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
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>
  • Loading branch information
adinauer and claude committed Apr 1, 2026
commit 572dc2dbd64301e7c3d3240f4673c1fbc6a31df6
2 changes: 2 additions & 0 deletions sentry-spring-boot-jakarta/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ dependencies {
compileOnly(projects.sentryGraphql)
compileOnly(projects.sentryGraphql22)
compileOnly(projects.sentryQuartz)
compileOnly(libs.spring.kafka3)
compileOnly(Config.Libs.springWeb)
compileOnly(Config.Libs.springWebflux)
compileOnly(libs.context.propagation)
Expand Down Expand Up @@ -90,6 +91,7 @@ dependencies {
testImplementation(libs.springboot3.starter)
testImplementation(libs.springboot3.starter.aop)
testImplementation(libs.springboot3.starter.graphql)
testImplementation(libs.spring.kafka3)
testImplementation(libs.springboot3.starter.quartz)
testImplementation(libs.springboot3.starter.security)
testImplementation(libs.springboot3.starter.test)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@
import io.sentry.spring.jakarta.checkin.SentryQuartzConfiguration;
import io.sentry.spring.jakarta.exception.SentryCaptureExceptionParameterPointcutConfiguration;
import io.sentry.spring.jakarta.exception.SentryExceptionParameterAdviceConfiguration;
import io.sentry.spring.jakarta.kafka.SentryKafkaConsumerBeanPostProcessor;
import io.sentry.spring.jakarta.kafka.SentryKafkaProducerBeanPostProcessor;
import io.sentry.spring.jakarta.opentelemetry.SentryOpenTelemetryAgentWithoutAutoInitConfiguration;
import io.sentry.spring.jakarta.opentelemetry.SentryOpenTelemetryNoAgentConfiguration;
import io.sentry.spring.jakarta.tracing.CombinedTransactionNameProvider;
Expand Down Expand Up @@ -75,6 +77,7 @@
import org.springframework.core.annotation.Order;
import org.springframework.core.env.Environment;
import org.springframework.graphql.execution.DataFetcherExceptionResolverAdapter;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.client.RestClient;
Expand Down Expand Up @@ -246,6 +249,26 @@ static class SentryCacheConfiguration {
}
}

@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(KafkaTemplate.class)
@ConditionalOnProperty(name = "sentry.enable-queue-tracing", havingValue = "true")
@Open
static class SentryKafkaQueueConfiguration {

@Bean
public static @NotNull SentryKafkaProducerBeanPostProcessor
sentryKafkaProducerBeanPostProcessor() {
SentryIntegrationPackageStorage.getInstance().addIntegration("SpringKafka");
return new SentryKafkaProducerBeanPostProcessor();
}

@Bean
public static @NotNull SentryKafkaConsumerBeanPostProcessor
sentryKafkaConsumerBeanPostProcessor() {
return new SentryKafkaConsumerBeanPostProcessor();
}
}

@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(ProceedingJoinPoint.class)
@ConditionalOnProperty(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package io.sentry.spring.boot.jakarta

import io.sentry.spring.jakarta.kafka.SentryKafkaConsumerBeanPostProcessor
import io.sentry.spring.jakarta.kafka.SentryKafkaProducerBeanPostProcessor
import kotlin.test.Test
import org.assertj.core.api.Assertions.assertThat
import org.springframework.boot.autoconfigure.AutoConfigurations
import org.springframework.boot.test.context.runner.ApplicationContextRunner

class SentryKafkaAutoConfigurationTest {
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should we add a test for the case when KafkaTemplate is not on the classpath but queue tracing is enabled?


private val contextRunner =
ApplicationContextRunner()
.withConfiguration(AutoConfigurations.of(SentryAutoConfiguration::class.java))
.withPropertyValues(
"sentry.dsn=http://key@localhost/proj",
"sentry.traces-sample-rate=1.0",
"sentry.shutdownTimeoutMillis=0",
"sentry.sessionFlushTimeoutMillis=0",
"sentry.flushTimeoutMillis=0",
"sentry.readTimeoutMillis=50",
"sentry.connectionTimeoutMillis=50",
"sentry.send-modules=false",
"sentry.debug=false",
)

@Test
fun `registers Kafka BPPs when queue tracing is enabled`() {
contextRunner.withPropertyValues("sentry.enable-queue-tracing=true").run { context ->
assertThat(context).hasSingleBean(SentryKafkaProducerBeanPostProcessor::class.java)
assertThat(context).hasSingleBean(SentryKafkaConsumerBeanPostProcessor::class.java)
}
}

@Test
fun `does not register Kafka BPPs when queue tracing is disabled`() {
contextRunner.run { context ->
assertThat(context).doesNotHaveBean(SentryKafkaProducerBeanPostProcessor::class.java)
assertThat(context).doesNotHaveBean(SentryKafkaConsumerBeanPostProcessor::class.java)
}
}

@Test
fun `does not register Kafka BPPs when queue tracing is explicitly false`() {
contextRunner.withPropertyValues("sentry.enable-queue-tracing=false").run { context ->
assertThat(context).doesNotHaveBean(SentryKafkaProducerBeanPostProcessor::class.java)
assertThat(context).doesNotHaveBean(SentryKafkaConsumerBeanPostProcessor::class.java)
}
}
}
Loading