From adf85ebfd9f3f389459e862f41acc3024148ae66 Mon Sep 17 00:00:00 2001 From: Alexander Dinauer Date: Tue, 21 Apr 2026 12:46:20 +0200 Subject: [PATCH] ref(kafka): [Queue Instrumentation 20] Log Kafka instrumentation failures MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previously `SentryKafkaProducerInterceptor.onSend(...)` and `SentryKafkaConsumerTracing` silently swallowed any `Throwable` thrown while instrumenting a Kafka record. That protects customer Kafka I/O from breakage, but makes instrumentation bugs invisible. Log each caught `Throwable` to the SDK logger at `SentryLevel.ERROR` (matching the existing pattern in `RequestPayloadExtractor`) before continuing the fail-open path: - `SentryKafkaProducerInterceptor`: producer span creation / header injection - `SentryKafkaConsumerTracing`: scope fork + `makeCurrent`, transaction start, transaction finish No behavior change for customer callbacks or Kafka send/receive: the catches still swallow the throwable, they now just surface it via the SDK's own logger. `SentryKafkaRecordInterceptor` (Spring) was reviewed and intentionally left as-is — it does not wrap its instrumentation in `catch (Throwable)` blocks, so there is nothing silent to log. The `NumberFormatException` branches on malformed `sentry-task-enqueued-time` headers are expected input, not instrumentation faults, and remain silent. --- .../kafka/SentryKafkaConsumerTracing.java | 19 ++++++++++++++++--- .../kafka/SentryKafkaProducerInterceptor.java | 8 ++++++-- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/sentry-kafka/src/main/java/io/sentry/kafka/SentryKafkaConsumerTracing.java b/sentry-kafka/src/main/java/io/sentry/kafka/SentryKafkaConsumerTracing.java index 1c85634b10..deaa41c5ee 100644 --- a/sentry-kafka/src/main/java/io/sentry/kafka/SentryKafkaConsumerTracing.java +++ b/sentry-kafka/src/main/java/io/sentry/kafka/SentryKafkaConsumerTracing.java @@ -6,6 +6,7 @@ import io.sentry.ISentryLifecycleToken; import io.sentry.ITransaction; import io.sentry.ScopesAdapter; +import io.sentry.SentryLevel; import io.sentry.SentryTraceHeader; import io.sentry.SpanDataConvention; import io.sentry.SpanStatus; @@ -83,7 +84,11 @@ U withTracingImpl( try { forkedScopes = scopes.forkedRootScopes(CREATOR); lifecycleToken = forkedScopes.makeCurrent(); - } catch (Throwable ignored) { + } catch (Throwable t) { + scopes + .getOptions() + .getLogger() + .log(SentryLevel.ERROR, "Failed to fork scopes for Kafka consumer tracing.", t); return callable.call(); } @@ -175,7 +180,11 @@ private boolean isIgnored() { } return transaction; - } catch (Throwable ignored) { + } catch (Throwable t) { + scopes + .getOptions() + .getLogger() + .log(SentryLevel.ERROR, "Failed to start Kafka consumer tracing transaction.", t); return null; } } @@ -194,8 +203,12 @@ private void finishTransaction( transaction.setThrowable(throwable); } transaction.finish(); - } catch (Throwable ignored) { + } catch (Throwable t) { // Instrumentation must never break customer processing. + scopes + .getOptions() + .getLogger() + .log(SentryLevel.ERROR, "Failed to finish Kafka consumer tracing transaction.", t); } } diff --git a/sentry-kafka/src/main/java/io/sentry/kafka/SentryKafkaProducerInterceptor.java b/sentry-kafka/src/main/java/io/sentry/kafka/SentryKafkaProducerInterceptor.java index 89e621a3a3..81c62cabdc 100644 --- a/sentry-kafka/src/main/java/io/sentry/kafka/SentryKafkaProducerInterceptor.java +++ b/sentry-kafka/src/main/java/io/sentry/kafka/SentryKafkaProducerInterceptor.java @@ -5,6 +5,7 @@ import io.sentry.IScopes; import io.sentry.ISpan; import io.sentry.ScopesAdapter; +import io.sentry.SentryLevel; import io.sentry.SentryTraceHeader; import io.sentry.SpanDataConvention; import io.sentry.SpanOptions; @@ -71,8 +72,11 @@ public SentryKafkaProducerInterceptor( span.setStatus(SpanStatus.OK); span.finish(); - } catch (Throwable ignored) { - // Instrumentation must never break the customer's Kafka send. + } catch (Throwable t) { + scopes + .getOptions() + .getLogger() + .log(SentryLevel.ERROR, "Failed to instrument Kafka producer record.", t); } return record;