From 1bbf9d94f497f20e8f3b1fe7df4d2db11e5138e3 Mon Sep 17 00:00:00 2001 From: saartochner Date: Tue, 5 Jan 2021 15:54:59 +0200 Subject: [PATCH 1/2] clean the wrapping line when reporting an error --- src/lumigo_tracer/lumigo_utils.py | 7 +++++++ src/lumigo_tracer/spans_container.py | 4 ++-- src/test/unit/test_tracer.py | 14 ++++++++++++++ 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/lumigo_tracer/lumigo_utils.py b/src/lumigo_tracer/lumigo_utils.py index bb3b09f1..150c30e3 100644 --- a/src/lumigo_tracer/lumigo_utils.py +++ b/src/lumigo_tracer/lumigo_utils.py @@ -14,6 +14,7 @@ from contextlib import contextmanager from base64 import b64encode import inspect +import traceback try: import botocore @@ -66,6 +67,7 @@ ERROR_SIZE_LIMIT_MULTIPLIER = 2 CHINA_REGION = "cn-northwest-1" EDGE_KINESIS_STREAM_NAME = "prod_trc-inges-edge_edge-kinesis-stream" +STACKTRACE_LINES_TO_DROP = "lumigo_tracer/tracer.py" Container = TypeVar("Container", dict, list) _logger: Dict[str, logging.Logger] = {} @@ -701,3 +703,8 @@ def is_aws_arn(string_to_validate: Optional[str]) -> bool: def is_provision_concurrency_initialization() -> bool: return os.environ.get("AWS_LAMBDA_INITIALIZATION_TYPE") == "provisioned-concurrency" + + +def get_stacktrace(exception: Exception) -> str: + original_traceback = traceback.format_tb(exception.__traceback__) + return "".join(filter(lambda line: STACKTRACE_LINES_TO_DROP not in line, original_traceback)) diff --git a/src/lumigo_tracer/spans_container.py b/src/lumigo_tracer/spans_container.py index 1e587376..53c3d6a9 100644 --- a/src/lumigo_tracer/spans_container.py +++ b/src/lumigo_tracer/spans_container.py @@ -6,7 +6,6 @@ import time import uuid import signal -import traceback from typing import List, Dict, Optional, Callable, Set from lumigo_tracer.event.event_dumper import EventDumper @@ -24,6 +23,7 @@ get_current_ms_time, get_region, is_provision_concurrency_initialization, + get_stacktrace, ) from lumigo_tracer import lumigo_utils from lumigo_tracer.parsing_utils import parse_trace_id, safe_split_get, recursive_json_join @@ -202,7 +202,7 @@ def add_exception_event( self.function_span["error"] = self._create_exception_event( exc_type=exception.__class__.__name__, message=message, - stacktrace=traceback.format_exc(), + stacktrace=get_stacktrace(exception), frames=format_frames(frames_infos) if Configuration.verbose else [], ) diff --git a/src/test/unit/test_tracer.py b/src/test/unit/test_tracer.py index 6ff540b8..5eb5bd1c 100644 --- a/src/test/unit/test_tracer.py +++ b/src/test/unit/test_tracer.py @@ -439,3 +439,17 @@ def lambda_test_function(event, context): aws_secret_access_key=secret_access_key, config=ANY, ) + + +def test_get_stacktrace(context): + @lumigo_tracer(token="123") + def lambda_test_function(event, context): + raise Exception("Inner exception") + + with pytest.raises(Exception): + lambda_test_function({}, context) + + function_span = SpansContainer.get_span().function_span + assert function_span["error"]["type"] == "Exception" + assert "lumigo_tracer/tracer.py" not in function_span["error"]["stacktrace"] + assert 'raise Exception("Inner exception")' in function_span["error"]["stacktrace"] From 87eb6bb84683ae32a31f39d7e609fd7456d1c00d Mon Sep 17 00:00:00 2001 From: saartochner Date: Tue, 5 Jan 2021 16:32:12 +0200 Subject: [PATCH 2/2] fix Nirhod's CR --- src/lumigo_tracer/lumigo_utils.py | 4 ++-- src/test/unit/test_tracer.py | 24 +++++++++++++++++------- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/lumigo_tracer/lumigo_utils.py b/src/lumigo_tracer/lumigo_utils.py index 150c30e3..43409ec4 100644 --- a/src/lumigo_tracer/lumigo_utils.py +++ b/src/lumigo_tracer/lumigo_utils.py @@ -67,7 +67,7 @@ ERROR_SIZE_LIMIT_MULTIPLIER = 2 CHINA_REGION = "cn-northwest-1" EDGE_KINESIS_STREAM_NAME = "prod_trc-inges-edge_edge-kinesis-stream" -STACKTRACE_LINES_TO_DROP = "lumigo_tracer/tracer.py" +STACKTRACE_LINE_TO_DROP = "lumigo_tracer/tracer.py" Container = TypeVar("Container", dict, list) _logger: Dict[str, logging.Logger] = {} @@ -707,4 +707,4 @@ def is_provision_concurrency_initialization() -> bool: def get_stacktrace(exception: Exception) -> str: original_traceback = traceback.format_tb(exception.__traceback__) - return "".join(filter(lambda line: STACKTRACE_LINES_TO_DROP not in line, original_traceback)) + return "".join(filter(lambda line: STACKTRACE_LINE_TO_DROP not in line, original_traceback)) diff --git a/src/test/unit/test_tracer.py b/src/test/unit/test_tracer.py index 5eb5bd1c..efd51f08 100644 --- a/src/test/unit/test_tracer.py +++ b/src/test/unit/test_tracer.py @@ -1,5 +1,7 @@ import datetime import json +import re +import traceback from decimal import Decimal import http.client import os @@ -441,15 +443,23 @@ def lambda_test_function(event, context): ) -def test_get_stacktrace(context): +def test_lumigo_tracer_doesnt_change_exception(context): @lumigo_tracer(token="123") - def lambda_test_function(event, context): + def wrapped(event, context): raise Exception("Inner exception") with pytest.raises(Exception): - lambda_test_function({}, context) + wrapped({}, context) - function_span = SpansContainer.get_span().function_span - assert function_span["error"]["type"] == "Exception" - assert "lumigo_tracer/tracer.py" not in function_span["error"]["stacktrace"] - assert 'raise Exception("Inner exception")' in function_span["error"]["stacktrace"] + def wrapped(event, context): + raise Exception("Inner exception") + + with pytest.raises(Exception) as e: + wrapped({}, context) + + stacktrace = SpansContainer.get_span().function_span["error"]["stacktrace"] + assert "lumigo_tracer/tracer.py" not in stacktrace + line_dropper = re.compile(r"\d{3}") + from_lumigo = line_dropper.sub("-", stacktrace) + original = line_dropper.sub("-", traceback.format_tb(e.value.__traceback__)[1]) + assert from_lumigo == original