From 59a68d0e800d6c75283123ca8cee5add51a2117b Mon Sep 17 00:00:00 2001 From: Ivana Kellyer Date: Wed, 14 Jan 2026 14:26:57 +0100 Subject: [PATCH 1/2] fix: Send client reports for span recorder overflow --- sentry_sdk/client.py | 14 +++++++++++++- tests/tracing/test_misc.py | 20 ++++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/sentry_sdk/client.py b/sentry_sdk/client.py index e3821f48ca..409ce6551f 100644 --- a/sentry_sdk/client.py +++ b/sentry_sdk/client.py @@ -532,7 +532,19 @@ def _prepare_event( "event_processor", data_category="span", quantity=spans_delta ) - dropped_spans: int = event.pop("_dropped_spans", 0) + spans_delta + span_recorder_dropped_spans: int = event.pop("_dropped_spans", 0) + if ( + is_transaction + and span_recorder_dropped_spans > 0 + and self.transport is not None + ): + self.transport.record_lost_event( + "buffer_overflow", + data_category="span", + quantity=span_recorder_dropped_spans, + ) + + dropped_spans: int = span_recorder_dropped_spans + spans_delta if dropped_spans > 0: previous_total_spans = spans_before + dropped_spans if scope._n_breadcrumbs_truncated > 0: diff --git a/tests/tracing/test_misc.py b/tests/tracing/test_misc.py index e1de847102..619fff913b 100644 --- a/tests/tracing/test_misc.py +++ b/tests/tracing/test_misc.py @@ -37,6 +37,26 @@ def test_span_trimming(sentry_init, capture_events): assert "dropped_spans" not in event +def test_span_trimming_produces_client_report( + sentry_init, capture_events, capture_record_lost_event_calls +): + sentry_init(traces_sample_rate=1.0, _experiments={"max_spans": 3}) + events = capture_events() + record_lost_event_calls = capture_record_lost_event_calls() + + with start_transaction(name="hi"): + for i in range(10): + with start_span(op="foo{}".format(i)): + pass + + (event,) = events + + assert len(event["spans"]) == 3 + + # 7 spans were dropped (10 total - 3 kept = 7 dropped) + assert ("buffer_overflow", "span", None, 7) in record_lost_event_calls + + def test_span_data_scrubbing_and_trimming(sentry_init, capture_events): sentry_init(traces_sample_rate=1.0, _experiments={"max_spans": 3}) events = capture_events() From e853aa4e4a5786948b3d581d30a111d7b403161a Mon Sep 17 00:00:00 2001 From: Ivana Kellyer Date: Wed, 14 Jan 2026 14:33:03 +0100 Subject: [PATCH 2/2] ref --- sentry_sdk/client.py | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/sentry_sdk/client.py b/sentry_sdk/client.py index 409ce6551f..fb14d8e36a 100644 --- a/sentry_sdk/client.py +++ b/sentry_sdk/client.py @@ -527,22 +527,19 @@ def _prepare_event( spans_delta = spans_before - len( cast(List[Dict[str, object]], event.get("spans", [])) ) - if is_transaction and spans_delta > 0 and self.transport is not None: - self.transport.record_lost_event( - "event_processor", data_category="span", quantity=spans_delta - ) - span_recorder_dropped_spans: int = event.pop("_dropped_spans", 0) - if ( - is_transaction - and span_recorder_dropped_spans > 0 - and self.transport is not None - ): - self.transport.record_lost_event( - "buffer_overflow", - data_category="span", - quantity=span_recorder_dropped_spans, - ) + + if is_transaction and self.transport is not None: + if spans_delta > 0: + self.transport.record_lost_event( + "event_processor", data_category="span", quantity=spans_delta + ) + if span_recorder_dropped_spans > 0: + self.transport.record_lost_event( + "buffer_overflow", + data_category="span", + quantity=span_recorder_dropped_spans, + ) dropped_spans: int = span_recorder_dropped_spans + spans_delta if dropped_spans > 0: