executing.py 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import sentry_sdk
  2. from sentry_sdk.integrations import Integration, DidNotEnable
  3. from sentry_sdk.scope import add_global_event_processor
  4. from sentry_sdk.utils import walk_exception_chain, iter_stacks
  5. from typing import TYPE_CHECKING
  6. if TYPE_CHECKING:
  7. from typing import Optional
  8. from sentry_sdk._types import Event, Hint
  9. try:
  10. import executing
  11. except ImportError:
  12. raise DidNotEnable("executing is not installed")
  13. class ExecutingIntegration(Integration):
  14. identifier = "executing"
  15. @staticmethod
  16. def setup_once():
  17. # type: () -> None
  18. @add_global_event_processor
  19. def add_executing_info(event, hint):
  20. # type: (Event, Optional[Hint]) -> Optional[Event]
  21. if sentry_sdk.get_client().get_integration(ExecutingIntegration) is None:
  22. return event
  23. if hint is None:
  24. return event
  25. exc_info = hint.get("exc_info", None)
  26. if exc_info is None:
  27. return event
  28. exception = event.get("exception", None)
  29. if exception is None:
  30. return event
  31. values = exception.get("values", None)
  32. if values is None:
  33. return event
  34. for exception, (_exc_type, _exc_value, exc_tb) in zip(
  35. reversed(values), walk_exception_chain(exc_info)
  36. ):
  37. sentry_frames = [
  38. frame
  39. for frame in exception.get("stacktrace", {}).get("frames", [])
  40. if frame.get("function")
  41. ]
  42. tbs = list(iter_stacks(exc_tb))
  43. if len(sentry_frames) != len(tbs):
  44. continue
  45. for sentry_frame, tb in zip(sentry_frames, tbs):
  46. frame = tb.tb_frame
  47. source = executing.Source.for_frame(frame)
  48. sentry_frame["function"] = source.code_qualname(frame.f_code)
  49. return event