From d2011b39640278701773da1a90cd859568d17e10 Mon Sep 17 00:00:00 2001 From: Anton Pirker Date: Mon, 24 Feb 2025 16:32:50 +0100 Subject: [PATCH 1/2] SystemExit is not setting span status to internal_error --- sentry_sdk/tracing.py | 3 ++- sentry_sdk/utils.py | 1 - 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sentry_sdk/tracing.py b/sentry_sdk/tracing.py index 6bb1eeab76..744003eaba 100644 --- a/sentry_sdk/tracing.py +++ b/sentry_sdk/tracing.py @@ -20,6 +20,7 @@ _serialize_span_attribute, get_current_thread_meta, logger, + should_be_treated_as_error, ) from typing import TYPE_CHECKING, cast @@ -424,7 +425,7 @@ def __enter__(self): def __exit__(self, ty, value, tb): # type: (Optional[Any], Optional[Any], Optional[Any]) -> None - if value is not None: + if value is not None and should_be_treated_as_error(ty, value): self.set_status(SPANSTATUS.INTERNAL_ERROR) else: status_unset = ( diff --git a/sentry_sdk/utils.py b/sentry_sdk/utils.py index ce1437222c..d7aa316e40 100644 --- a/sentry_sdk/utils.py +++ b/sentry_sdk/utils.py @@ -1879,7 +1879,6 @@ def datetime_from_isoformat(value): return result.astimezone(timezone.utc) -# TODO-neel-potel use in span status def should_be_treated_as_error(ty, value): # type: (Any, Any) -> bool if ty == SystemExit and hasattr(value, "code") and value.code in (0, None): From 9e18a82cc06f62dcb2f9ce367e56733e5b6c8a5c Mon Sep 17 00:00:00 2001 From: Anton Pirker Date: Tue, 25 Feb 2025 10:22:13 +0100 Subject: [PATCH 2/2] Updated some tests to expect the span status NOT to be in the tags. --- .../integrations/opentelemetry/span_processor.py | 3 --- tests/tracing/test_integration_tests.py | 11 +++++------ 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/sentry_sdk/integrations/opentelemetry/span_processor.py b/sentry_sdk/integrations/opentelemetry/span_processor.py index a3cf545daf..bf3ff62d1b 100644 --- a/sentry_sdk/integrations/opentelemetry/span_processor.py +++ b/sentry_sdk/integrations/opentelemetry/span_processor.py @@ -261,9 +261,6 @@ def _span_to_json(self, span): } ) - if status: - span_json.setdefault("tags", {})["status"] = status - if parent_span_id: span_json["parent_span_id"] = parent_span_id diff --git a/tests/tracing/test_integration_tests.py b/tests/tracing/test_integration_tests.py index 0a96e859e4..22deabb692 100644 --- a/tests/tracing/test_integration_tests.py +++ b/tests/tracing/test_integration_tests.py @@ -37,11 +37,10 @@ def test_basic(sentry_init, capture_events, sample_rate): span1, span2 = event["spans"] parent_span = event - assert span1["tags"]["status"] == "internal_error" assert span1["status"] == "internal_error" assert span1["op"] == "foo" assert span1["description"] == "foodesc" - assert span2["tags"]["status"] == "ok" + assert span2["status"] == "ok" assert span2["op"] == "bar" assert span2["description"] == "bardesc" assert parent_span["transaction"] == "hi" @@ -253,8 +252,8 @@ def test_non_error_exceptions( sentry_init(traces_sample_rate=1.0) events = capture_events() - with start_span(name="hi") as span: - span.set_status(SPANSTATUS.OK) + with start_span(name="hi") as root_span: + root_span.set_status(SPANSTATUS.OK) with pytest.raises(exception_cls): with start_span(op="foo", name="foodesc"): raise exception_cls(exception_value) @@ -264,7 +263,7 @@ def test_non_error_exceptions( span = event["spans"][0] assert "status" not in span.get("tags", {}) - assert "status" not in event["tags"] + assert "status" not in event.get("tags", {}) assert event["contexts"]["trace"]["status"] == "ok" @@ -289,5 +288,5 @@ def test_good_sysexit_doesnt_fail_transaction( span = event["spans"][0] assert "status" not in span.get("tags", {}) - assert "status" not in event["tags"] + assert "status" not in event.get("tags", {}) assert event["contexts"]["trace"]["status"] == "ok"