diff --git a/sentry_sdk/scope.py b/sentry_sdk/scope.py index e55b4ea3c7..8d7e0eaf53 100644 --- a/sentry_sdk/scope.py +++ b/sentry_sdk/scope.py @@ -185,6 +185,7 @@ class Scope(object): "_propagation_context", "client", "_type", + "_last_event_id", ) def __init__(self, ty=None, client=None): @@ -207,6 +208,9 @@ def __init__(self, ty=None, client=None): incoming_trace_information = self._load_trace_data_from_env() self.generate_propagation_context(incoming_data=incoming_trace_information) + # self._last_event_id is only applicable to isolation scopes + self._last_event_id = None # type: Optional[str] + def __copy__(self): # type: () -> Scope """ @@ -308,6 +312,16 @@ def get_global_scope(cls): return _global_scope + @classmethod + def last_event_id(cls): + # type: () -> Optional[str] + """ + .. versionadded:: 2.X.X + + Returns the last event id of the isolation scope. + """ + return cls.get_isolation_scope()._last_event_id + def _merge_scopes(self, additional_scope=None, additional_scope_kwargs=None): # type: (Optional[Scope], Optional[Dict[str, Any]]) -> Scope """ @@ -1089,7 +1103,12 @@ def capture_event(self, event, hint=None, scope=None, **scope_kwargs): """ scope = self._merge_scopes(scope, scope_kwargs) - return Scope.get_client().capture_event(event=event, hint=hint, scope=scope) + event_id = Scope.get_client().capture_event(event=event, hint=hint, scope=scope) + + if event_id is not None and event.get("type") != "transaction": + self.get_isolation_scope()._last_event_id = event_id + + return event_id def capture_message(self, message, level=None, scope=None, **scope_kwargs): # type: (str, Optional[LogLevelStr], Optional[Scope], Any) -> Optional[str] @@ -1117,7 +1136,12 @@ def capture_message(self, message, level=None, scope=None, **scope_kwargs): "level": level, } # type: Event - return self.capture_event(event, scope=scope, **scope_kwargs) + event_id = self.capture_event(event, scope=scope, **scope_kwargs) + + if event_id is not None: + self.get_isolation_scope()._last_event_id = event_id + + return event_id def capture_exception(self, error=None, scope=None, **scope_kwargs): # type: (Optional[Union[BaseException, ExcInfo]], Optional[Scope], Any) -> Optional[str] @@ -1144,11 +1168,15 @@ def capture_exception(self, error=None, scope=None, **scope_kwargs): ) try: - return self.capture_event(event, hint=hint, scope=scope, **scope_kwargs) + event_id = self.capture_event(event, hint=hint, scope=scope, **scope_kwargs) except Exception: self._capture_internal_exception(sys.exc_info()) + return None - return None + if event_id is not None: + self.get_isolation_scope()._last_event_id = event_id + + return event_id def _capture_internal_exception( self, exc_info # type: Any