Skip to content

Commit d72f713

Browse files
authored
fix(client-reports): Emit callback_error when a processor raises (#8005)
We're not recording the correct reason if a event/error processor raises (should be `callback_error`). Closes https://linear.app/getsentry/issue/PY-2888/drop-events-if-a-processor-raises
1 parent c92ee01 commit d72f713

3 files changed

Lines changed: 33 additions & 16 deletions

File tree

‎sentry_sdk/client.py‎

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -464,13 +464,9 @@ def _prepare_event(
464464
if scope is not None:
465465
event_ = scope.apply_to_event(event, hint, self.options)
466466

467-
# one of the event/error processors returned None
467+
# one of the event/error processors returned None or raised;
468+
# the client report is recorded in Scope._drop
468469
if event_ is None:
469-
if self.transport:
470-
self.transport.record_lost_event(
471-
"event_processor",
472-
data_category="error",
473-
)
474470
return None
475471

476472
event = event_

‎sentry_sdk/scope.py‎

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1458,10 +1458,6 @@ def _apply_user_attributes_to_telemetry(
14581458
):
14591459
attributes[attribute_name] = self._user[user_attribute]
14601460

1461-
def _drop(self, cause: "Any", ty: str) -> "Optional[Any]":
1462-
logger.info("%s (%s) dropped event", ty, cause)
1463-
return None
1464-
14651461
def run_error_processors(self, event: "Event", hint: "Hint") -> "Optional[Event]":
14661462
"""
14671463
Runs the error processors on the event and returns the modified event.
@@ -1476,10 +1472,22 @@ def run_error_processors(self, event: "Event", hint: "Hint") -> "Optional[Event]
14761472

14771473
for error_processor in error_processors:
14781474
new_event = None
1475+
exception_raised = False
14791476
with capture_internal_exceptions():
1480-
new_event = error_processor(event, exc_info)
1477+
try:
1478+
new_event = error_processor(event, exc_info)
1479+
except Exception:
1480+
exception_raised = True
1481+
raise
14811482
if new_event is None:
1482-
return self._drop(error_processor, "error processor")
1483+
logger.info("%s (error processor) dropped event", error_processor)
1484+
transport = sentry_sdk.get_client().transport
1485+
if transport:
1486+
transport.record_lost_event(
1487+
"callback_error" if exception_raised else "event_processor",
1488+
data_category="error",
1489+
)
1490+
return None
14831491

14841492
event = new_event
14851493

@@ -1506,10 +1514,23 @@ def run_event_processors(self, event: "Event", hint: "Hint") -> "Optional[Event]
15061514

15071515
for event_processor in event_processors:
15081516
new_event = None
1517+
exception_raised = False
15091518
with capture_internal_exceptions():
1510-
new_event = event_processor(event, hint)
1519+
try:
1520+
new_event = event_processor(event, hint)
1521+
except Exception:
1522+
exception_raised = True
1523+
raise
15111524
if new_event is None:
1512-
return self._drop(event_processor, "event processor")
1525+
logger.info("%s (event processor) dropped event", event_processor)
1526+
transport = sentry_sdk.get_client().transport
1527+
if transport:
1528+
transport.record_lost_event(
1529+
"callback_error" if exception_raised else "event_processor",
1530+
data_category="error",
1531+
)
1532+
return None
1533+
15131534
event = new_event
15141535

15151536
return event

‎tests/test_basics.py‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -734,7 +734,7 @@ def bad_processor(event, hint):
734734
capture_message("should be dropped")
735735

736736
assert len(events) == 0
737-
assert ("event_processor", "error", None, 1) in record_lost_event_calls
737+
assert record_lost_event_calls == [("callback_error", "error", None, 1)]
738738

739739

740740
@pytest.mark.tests_internal_exceptions
@@ -757,7 +757,7 @@ def bad_error_processor(event, exc_info):
757757
capture_exception()
758758

759759
assert len(events) == 0
760-
assert ("event_processor", "error", None, 1) in record_lost_event_calls
760+
assert record_lost_event_calls == [("callback_error", "error", None, 1)]
761761

762762

763763
@pytest.mark.tests_internal_exceptions

0 commit comments

Comments
 (0)