import re from sentry_sdk.hub import Hub from sentry_sdk.integrations import Integration from sentry_sdk.scope import add_global_event_processor from sentry_sdk.utils import capture_internal_exceptions from sentry_sdk._types import MYPY if MYPY: from typing import Any from typing import Dict MODULE_RE = r"[a-zA-Z0-9/._:\\-]+" TYPE_RE = r"[a-zA-Z0-9._:<>,-]+" HEXVAL_RE = r"[A-Fa-f0-9]+" FRAME_RE = r""" ^(?P<index>\d+)\.\s (?P<package>{MODULE_RE})\( (?P<retval>{TYPE_RE}\ )? ((?P<function>{TYPE_RE}) (?P<args>\(.*\))? )? ((?P<constoffset>\ const)?\+0x(?P<offset>{HEXVAL_RE}))? \)\s \[0x(?P<retaddr>{HEXVAL_RE})\]$ """.format( MODULE_RE=MODULE_RE, HEXVAL_RE=HEXVAL_RE, TYPE_RE=TYPE_RE ) FRAME_RE = re.compile(FRAME_RE, re.MULTILINE | re.VERBOSE) class GnuBacktraceIntegration(Integration): identifier = "gnu_backtrace" @staticmethod def setup_once(): # type: () -> None @add_global_event_processor def process_gnu_backtrace(event, hint): # type: (Dict[str, Any], Dict[str, Any]) -> Dict[str, Any] with capture_internal_exceptions(): return _process_gnu_backtrace(event, hint) def _process_gnu_backtrace(event, hint): # type: (Dict[str, Any], Dict[str, Any]) -> Dict[str, Any] if Hub.current.get_integration(GnuBacktraceIntegration) is None: return event exc_info = hint.get("exc_info", None) if exc_info is None: return event exception = event.get("exception", None) if exception is None: return event values = exception.get("values", None) if values is None: return event for exception in values: frames = exception.get("stacktrace", {}).get("frames", []) if not frames: continue msg = exception.get("value", None) if not msg: continue additional_frames = [] new_msg = [] for line in msg.splitlines(): match = FRAME_RE.match(line) if match: additional_frames.append( ( int(match.group("index")), { "package": match.group("package") or None, "function": match.group("function") or None, "platform": "native", }, ) ) else: # Put garbage lines back into message, not sure what to do with them. new_msg.append(line) if additional_frames: additional_frames.sort(key=lambda x: -x[0]) for _, frame in additional_frames: frames.append(frame) new_msg.append("<stacktrace parsed and removed by GnuBacktraceIntegration>") exception["value"] = "\n".join(new_msg) return event
Name | Type | Size | Permission | Actions |
---|---|---|---|---|
__pycache__ | Folder | 0755 |
|
|
django | Folder | 0755 |
|
|
spark | Folder | 0755 |
|
|
__init__.py | File | 6.36 KB | 0644 |
|
_wsgi_common.py | File | 4.65 KB | 0644 |
|
aiohttp.py | File | 7.77 KB | 0644 |
|
argv.py | File | 945 B | 0644 |
|
asgi.py | File | 8.17 KB | 0644 |
|
atexit.py | File | 1.79 KB | 0644 |
|
aws_lambda.py | File | 12.64 KB | 0644 |
|
beam.py | File | 5.53 KB | 0644 |
|
boto3.py | File | 3.64 KB | 0644 |
|
bottle.py | File | 6.04 KB | 0644 |
|
celery.py | File | 8.91 KB | 0644 |
|
chalice.py | File | 4.47 KB | 0644 |
|
dedupe.py | File | 1.14 KB | 0644 |
|
excepthook.py | File | 2.14 KB | 0644 |
|
executing.py | File | 1.98 KB | 0644 |
|
falcon.py | File | 6.64 KB | 0644 |
|
flask.py | File | 7.25 KB | 0644 |
|
gcp.py | File | 7.21 KB | 0644 |
|
gnu_backtrace.py | File | 2.84 KB | 0644 |
|
logging.py | File | 7.4 KB | 0644 |
|
modules.py | File | 1.36 KB | 0644 |
|
pure_eval.py | File | 4.41 KB | 0644 |
|
pyramid.py | File | 6.91 KB | 0644 |
|
redis.py | File | 3 KB | 0644 |
|
rq.py | File | 4.68 KB | 0644 |
|
sanic.py | File | 7.53 KB | 0644 |
|
serverless.py | File | 1.92 KB | 0644 |
|
sqlalchemy.py | File | 2.87 KB | 0644 |
|
stdlib.py | File | 7.18 KB | 0644 |
|
threading.py | File | 2.79 KB | 0644 |
|
tornado.py | File | 6.84 KB | 0644 |
|
trytond.py | File | 1.69 KB | 0644 |
|
wsgi.py | File | 10.13 KB | 0644 |
|