Skip to content

Commit 93855e7

Browse files
authored
fix: Send client reports for span recorder overflow (#5310)
### Description We weren't emitting client reports for spans dropped because they were over the span recorder limit. Disclaimer: vibe coded but refactored and live tested by hand Tested 3 times with an app with `max_spans=3` and 10 spans in a transaction <img width="1336" height="410" alt="Screenshot 2026-01-14 at 14 41 08" src="https://github.com/user-attachments/assets/f1c0add8-7d56-427b-aa3c-0e25e917038f" /> #### Issues Closes #5308 #### Reminders - Please add tests to validate your changes, and lint your code using `tox -e linters`. - Add GH Issue ID _&_ Linear ID (if applicable) - PR title should use [conventional commit](https://develop.sentry.dev/engineering-practices/commit-messages/#type) style (`feat:`, `fix:`, `ref:`, `meta:`) - For external contributors: [CONTRIBUTING.md](https://github.com/getsentry/sentry-python/blob/master/CONTRIBUTING.md), [Sentry SDK development docs](https://develop.sentry.dev/sdk/), [Discord community](https://discord.gg/Ww9hbqr)
1 parent 0cbb9cb commit 93855e7

File tree

2 files changed

+34
-5
lines changed

2 files changed

+34
-5
lines changed

sentry_sdk/client.py

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -527,12 +527,21 @@ def _prepare_event(
527527
spans_delta = spans_before - len(
528528
cast(List[Dict[str, object]], event.get("spans", []))
529529
)
530-
if is_transaction and spans_delta > 0 and self.transport is not None:
531-
self.transport.record_lost_event(
532-
"event_processor", data_category="span", quantity=spans_delta
533-
)
530+
span_recorder_dropped_spans: int = event.pop("_dropped_spans", 0)
531+
532+
if is_transaction and self.transport is not None:
533+
if spans_delta > 0:
534+
self.transport.record_lost_event(
535+
"event_processor", data_category="span", quantity=spans_delta
536+
)
537+
if span_recorder_dropped_spans > 0:
538+
self.transport.record_lost_event(
539+
"buffer_overflow",
540+
data_category="span",
541+
quantity=span_recorder_dropped_spans,
542+
)
534543

535-
dropped_spans: int = event.pop("_dropped_spans", 0) + spans_delta
544+
dropped_spans: int = span_recorder_dropped_spans + spans_delta
536545
if dropped_spans > 0:
537546
previous_total_spans = spans_before + dropped_spans
538547
if scope._n_breadcrumbs_truncated > 0:

tests/tracing/test_misc.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,26 @@ def test_span_trimming(sentry_init, capture_events):
3737
assert "dropped_spans" not in event
3838

3939

40+
def test_span_trimming_produces_client_report(
41+
sentry_init, capture_events, capture_record_lost_event_calls
42+
):
43+
sentry_init(traces_sample_rate=1.0, _experiments={"max_spans": 3})
44+
events = capture_events()
45+
record_lost_event_calls = capture_record_lost_event_calls()
46+
47+
with start_transaction(name="hi"):
48+
for i in range(10):
49+
with start_span(op="foo{}".format(i)):
50+
pass
51+
52+
(event,) = events
53+
54+
assert len(event["spans"]) == 3
55+
56+
# 7 spans were dropped (10 total - 3 kept = 7 dropped)
57+
assert ("buffer_overflow", "span", None, 7) in record_lost_event_calls
58+
59+
4060
def test_span_data_scrubbing_and_trimming(sentry_init, capture_events):
4161
sentry_init(traces_sample_rate=1.0, _experiments={"max_spans": 3})
4262
events = capture_events()

0 commit comments

Comments
 (0)