Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 14 additions & 5 deletions sentry_sdk/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
)
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unfinished spans incorrectly reported as buffer overflow

Medium Severity

The _dropped_spans event field contains both spans dropped due to buffer overflow AND unfinished spans (those without a timestamp), but the new code reports all of them with reason "buffer_overflow". In tracing.py, _dropped_spans is calculated as len_diff + self._span_recorder.dropped_spans, where len_diff counts unfinished spans. Only self._span_recorder.dropped_spans represents actual buffer overflow. This causes unfinished spans to be incorrectly categorized in client reports.

Fix in Cursor Fix in Web


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:
Expand Down
20 changes: 20 additions & 0 deletions tests/tracing/test_misc.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down
Loading