From 6d91bdc07ab60cbcc78dd3b3091c97f446ce02eb Mon Sep 17 00:00:00 2001 From: Alexander Dinauer Date: Fri, 10 Apr 2026 12:37:27 +0200 Subject: [PATCH] fix(spring-jakarta): Guard entire span lifecycle in Kafka producer interceptor Wrap all span operations (startChild, setData, injectHeaders, finish) in a single try-catch so instrumentation can never break the customer's Kafka send. The record is always returned regardless of any exception in Sentry code. Co-Authored-By: Claude --- .../kafka/SentryProducerInterceptor.java | 27 ++++++++++--------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/sentry-spring-jakarta/src/main/java/io/sentry/spring/jakarta/kafka/SentryProducerInterceptor.java b/sentry-spring-jakarta/src/main/java/io/sentry/spring/jakarta/kafka/SentryProducerInterceptor.java index 916fcceb26..4caa4a8b54 100644 --- a/sentry-spring-jakarta/src/main/java/io/sentry/spring/jakarta/kafka/SentryProducerInterceptor.java +++ b/sentry-spring-jakarta/src/main/java/io/sentry/spring/jakarta/kafka/SentryProducerInterceptor.java @@ -53,25 +53,26 @@ public SentryProducerInterceptor(final @NotNull IScopes scopes) { return record; } - final @NotNull SpanOptions spanOptions = new SpanOptions(); - spanOptions.setOrigin(TRACE_ORIGIN); - final @NotNull ISpan span = activeSpan.startChild("queue.publish", record.topic(), spanOptions); - if (span.isNoOp()) { - return record; - } + try { + final @NotNull SpanOptions spanOptions = new SpanOptions(); + spanOptions.setOrigin(TRACE_ORIGIN); + final @NotNull ISpan span = + activeSpan.startChild("queue.publish", record.topic(), spanOptions); + if (span.isNoOp()) { + return record; + } - span.setData(SpanDataConvention.MESSAGING_SYSTEM, "kafka"); - span.setData(SpanDataConvention.MESSAGING_DESTINATION_NAME, record.topic()); + span.setData(SpanDataConvention.MESSAGING_SYSTEM, "kafka"); + span.setData(SpanDataConvention.MESSAGING_DESTINATION_NAME, record.topic()); - try { injectHeaders(record.headers(), span); + + span.setStatus(SpanStatus.OK); + span.finish(); } catch (Throwable ignored) { - // Header injection must not break the send + // Instrumentation must never break the customer's Kafka send } - span.setStatus(SpanStatus.OK); - span.finish(); - return record; }