diff --git a/sentry_sdk/client.py b/sentry_sdk/client.py index e3821f48ca..fb14d8e36a 100644 --- a/sentry_sdk/client.py +++ b/sentry_sdk/client.py @@ -527,12 +527,21 @@ 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 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 = event.pop("_dropped_spans", 0) + spans_delta + 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()