Skip to content

Commit f1ab185

Browse files
author
Izaak Gough
committed
fix: preserve active traceback for custom error payloads
1 parent e38f7ce commit f1ab185

2 files changed

Lines changed: 20 additions & 2 deletions

File tree

src/firebase_functions/logger.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -270,11 +270,12 @@ def exception(*args, **kwargs) -> None:
270270
"""
271271
Logs an error message and includes the active stack trace.
272272
"""
273+
raw_error = kwargs.get("error")
273274
entry = _entry_from_args(LogSeverity.ERROR, *args, **kwargs)
274275
exc_type, exc_value, exc_traceback = _sys.exc_info()
275276
if exc_type is not None and exc_value is not None and exc_traceback is not None:
276-
error = entry.get("error")
277-
if not isinstance(error, dict) or "stack_trace" not in error:
277+
uses_active_error_traceback = raw_error is exc_value or raw_error is exc_type
278+
if not uses_active_error_traceback:
278279
entry["stack_trace"] = "".join(
279280
_traceback.format_exception(exc_type, exc_value, exc_traceback)
280281
)

tests/test_logger.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,23 @@ def test_exception_should_not_duplicate_stack_trace_for_exception_type_error(
266266
assert "stack_trace" in log_output["error"]
267267
assert "TypeError: boom" in log_output["error"]["stack_trace"]
268268

269+
def test_exception_should_include_active_stack_trace_for_error_dict(
270+
self, capsys: pytest.CaptureFixture[str]
271+
):
272+
try:
273+
raise ValueError("boom")
274+
except ValueError:
275+
logger.exception("failed", error={"stack_trace": "custom traceback"})
276+
277+
raw_log_output = capsys.readouterr().err
278+
log_output = json.loads(raw_log_output)
279+
280+
assert log_output["severity"] == "ERROR"
281+
assert log_output["message"] == "failed"
282+
assert log_output["error"] == {"stack_trace": "custom traceback"}
283+
assert "stack_trace" in log_output
284+
assert "ValueError: boom" in log_output["stack_trace"]
285+
269286
def test_remove_circular_references(self, capsys: pytest.CaptureFixture[str]):
270287
# Create an object with a circular reference.
271288
circ = {"b": "foo"}

0 commit comments

Comments
 (0)