|
| 1 | +import json |
| 2 | +import re |
1 | 3 | import sys
|
2 | 4 | from copy import deepcopy
|
3 | 5 | from datetime import datetime, timedelta, timezone
|
@@ -56,6 +58,11 @@ def sentry_init_error(*args, **kwargs):
|
56 | 58 | )
|
57 | 59 | sentry_sdk.capture_event(sentry_event, hint=hint)
|
58 | 60 |
|
| 61 | + else: |
| 62 | + # Fall back to AWS lambdas JSON representation of the error |
| 63 | + sentry_event = _event_from_error_json(json.loads(args[1])) |
| 64 | + sentry_sdk.capture_event(sentry_event) |
| 65 | + |
59 | 66 | return init_error(*args, **kwargs)
|
60 | 67 |
|
61 | 68 | return sentry_init_error # type: ignore
|
@@ -428,3 +435,58 @@ def _get_cloudwatch_logs_url(aws_context, start_time):
|
428 | 435 | )
|
429 | 436 |
|
430 | 437 | return url
|
| 438 | + |
| 439 | + |
| 440 | +def _parse_formatted_traceback(formatted_tb): |
| 441 | + # type: (list[str]) -> list[dict[str, Any]] |
| 442 | + frames = [] |
| 443 | + for frame in formatted_tb: |
| 444 | + match = re.match(r'File "(.+)", line (\d+), in (.+)', frame.strip()) |
| 445 | + if match: |
| 446 | + file_name, line_number, func_name = match.groups() |
| 447 | + line_number = int(line_number) |
| 448 | + frames.append( |
| 449 | + { |
| 450 | + "filename": file_name, |
| 451 | + "function": func_name, |
| 452 | + "lineno": line_number, |
| 453 | + "vars": None, |
| 454 | + "pre_context": None, |
| 455 | + "context_line": None, |
| 456 | + "post_context": None, |
| 457 | + } |
| 458 | + ) |
| 459 | + return frames |
| 460 | + |
| 461 | + |
| 462 | +def _event_from_error_json(error_json): |
| 463 | + # type: (dict[str, Any]) -> Event |
| 464 | + """ |
| 465 | + Converts the error JSON from AWS Lambda into a Sentry error event. |
| 466 | + This is not a full fletched event, but better than nothing. |
| 467 | +
|
| 468 | + This is an example of where AWS creates the error JSON: |
| 469 | + https://github.com/aws/aws-lambda-python-runtime-interface-client/blob/2.2.1/awslambdaric/bootstrap.py#L479 |
| 470 | + """ |
| 471 | + event = { |
| 472 | + "level": "error", |
| 473 | + "exception": { |
| 474 | + "values": [ |
| 475 | + { |
| 476 | + "type": error_json.get("errorType"), |
| 477 | + "value": error_json.get("errorMessage"), |
| 478 | + "stacktrace": { |
| 479 | + "frames": _parse_formatted_traceback( |
| 480 | + error_json.get("stackTrace", []) |
| 481 | + ), |
| 482 | + }, |
| 483 | + "mechanism": { |
| 484 | + "type": "aws_lambda", |
| 485 | + "handled": False, |
| 486 | + }, |
| 487 | + } |
| 488 | + ], |
| 489 | + }, |
| 490 | + } # type: Event |
| 491 | + |
| 492 | + return event |
0 commit comments