diff --git a/sentry_sdk/client.py b/sentry_sdk/client.py index a804cfcd5e..ed637619b2 100644 --- a/sentry_sdk/client.py +++ b/sentry_sdk/client.py @@ -464,13 +464,9 @@ def _prepare_event( if scope is not None: event_ = scope.apply_to_event(event, hint, self.options) - # one of the event/error processors returned None + # one of the event/error processors returned None or raised; + # the client report is recorded in Scope._drop if event_ is None: - if self.transport: - self.transport.record_lost_event( - "event_processor", - data_category="error", - ) return None event = event_ diff --git a/sentry_sdk/scope.py b/sentry_sdk/scope.py index 6df27c470f..289e3059be 100644 --- a/sentry_sdk/scope.py +++ b/sentry_sdk/scope.py @@ -1458,10 +1458,6 @@ def _apply_user_attributes_to_telemetry( ): attributes[attribute_name] = self._user[user_attribute] - def _drop(self, cause: "Any", ty: str) -> "Optional[Any]": - logger.info("%s (%s) dropped event", ty, cause) - return None - def run_error_processors(self, event: "Event", hint: "Hint") -> "Optional[Event]": """ 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] for error_processor in error_processors: new_event = None + exception_raised = False with capture_internal_exceptions(): - new_event = error_processor(event, exc_info) + try: + new_event = error_processor(event, exc_info) + except Exception: + exception_raised = True + raise if new_event is None: - return self._drop(error_processor, "error processor") + logger.info("%s (error processor) dropped event", error_processor) + transport = sentry_sdk.get_client().transport + if transport: + transport.record_lost_event( + "callback_error" if exception_raised else "event_processor", + data_category="error", + ) + return None event = new_event @@ -1506,10 +1514,23 @@ def run_event_processors(self, event: "Event", hint: "Hint") -> "Optional[Event] for event_processor in event_processors: new_event = None + exception_raised = False with capture_internal_exceptions(): - new_event = event_processor(event, hint) + try: + new_event = event_processor(event, hint) + except Exception: + exception_raised = True + raise if new_event is None: - return self._drop(event_processor, "event processor") + logger.info("%s (event processor) dropped event", event_processor) + transport = sentry_sdk.get_client().transport + if transport: + transport.record_lost_event( + "callback_error" if exception_raised else "event_processor", + data_category="error", + ) + return None + event = new_event return event diff --git a/tests/test_basics.py b/tests/test_basics.py index a4baaa58dc..be41c03818 100644 --- a/tests/test_basics.py +++ b/tests/test_basics.py @@ -734,7 +734,7 @@ def bad_processor(event, hint): capture_message("should be dropped") assert len(events) == 0 - assert ("event_processor", "error", None, 1) in record_lost_event_calls + assert record_lost_event_calls == [("callback_error", "error", None, 1)] @pytest.mark.tests_internal_exceptions @@ -757,7 +757,7 @@ def bad_error_processor(event, exc_info): capture_exception() assert len(events) == 0 - assert ("event_processor", "error", None, 1) in record_lost_event_calls + assert record_lost_event_calls == [("callback_error", "error", None, 1)] @pytest.mark.tests_internal_exceptions