From b103ca630c3d020ca092078514dcbfe0bf9fcb25 Mon Sep 17 00:00:00 2001 From: Ivana Kellyer Date: Wed, 11 Mar 2026 16:12:24 +0100 Subject: [PATCH 1/6] ref(rust): Use public API to start span --- sentry_sdk/integrations/rust_tracing.py | 26 ++++++++++--------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/sentry_sdk/integrations/rust_tracing.py b/sentry_sdk/integrations/rust_tracing.py index e2b203a286..bad50bcca3 100644 --- a/sentry_sdk/integrations/rust_tracing.py +++ b/sentry_sdk/integrations/rust_tracing.py @@ -210,22 +210,16 @@ def on_new_span(self, attrs: str, span_id: str) -> "TraceState": "origin": self.origin, } - scope = sentry_sdk.get_current_scope() - parent_sentry_span = scope.span - if parent_sentry_span: - sentry_span = parent_sentry_span.start_child(**kwargs) - else: - sentry_span = scope.start_span(**kwargs) - - fields = metadata.get("fields", []) - for field in fields: - if self._include_tracing_fields(): - sentry_span.set_data(field, attrs.get(field)) - else: - sentry_span.set_data(field, SENSITIVE_DATA_SUBSTITUTE) - - scope.span = sentry_span - return (parent_sentry_span, sentry_span) + parent_sentry_span = sentry_sdk.get_current_span() + with sentry_sdk.start_span(**kwargs) as sentry_span: + fields = metadata.get("fields", []) + for field in fields: + if self._include_tracing_fields(): + sentry_span.set_data(field, attrs.get(field)) + else: + sentry_span.set_data(field, SENSITIVE_DATA_SUBSTITUTE) + + return (parent_sentry_span, sentry_span) def on_close(self, span_id: str, span_state: "TraceState") -> None: if span_state is None: From 0bf02b4bf93c855795c76c1dfd6ca8d471f0fc66 Mon Sep 17 00:00:00 2001 From: Ivana Kellyer Date: Wed, 11 Mar 2026 16:19:34 +0100 Subject: [PATCH 2/6] . --- sentry_sdk/integrations/rust_tracing.py | 37 +++++++++++-------------- 1 file changed, 16 insertions(+), 21 deletions(-) diff --git a/sentry_sdk/integrations/rust_tracing.py b/sentry_sdk/integrations/rust_tracing.py index bad50bcca3..398c3828d7 100644 --- a/sentry_sdk/integrations/rust_tracing.py +++ b/sentry_sdk/integrations/rust_tracing.py @@ -40,8 +40,6 @@ from sentry_sdk.tracing import Span as SentrySpan from sentry_sdk.utils import SENSITIVE_DATA_SUBSTITUTE -TraceState = Optional[Tuple[Optional[SentrySpan], SentrySpan]] - class RustTracingLevel(Enum): Trace = "TRACE" @@ -170,7 +168,7 @@ def _include_tracing_fields(self) -> bool: else self.include_tracing_fields ) - def on_event(self, event: str, _span_state: "TraceState") -> None: + def on_event(self, event: str, sentry_span: "SentrySpan") -> None: deserialized_event = json.loads(event) metadata = deserialized_event.get("metadata", {}) @@ -184,7 +182,7 @@ def on_event(self, event: str, _span_state: "TraceState") -> None: elif event_type == EventTypeMapping.Event: process_event(deserialized_event) - def on_new_span(self, attrs: str, span_id: str) -> "TraceState": + def on_new_span(self, attrs: str, span_id: str) -> "SentrySpan": attrs = json.loads(attrs) metadata = attrs.get("metadata", {}) @@ -210,29 +208,26 @@ def on_new_span(self, attrs: str, span_id: str) -> "TraceState": "origin": self.origin, } - parent_sentry_span = sentry_sdk.get_current_span() - with sentry_sdk.start_span(**kwargs) as sentry_span: - fields = metadata.get("fields", []) - for field in fields: - if self._include_tracing_fields(): - sentry_span.set_data(field, attrs.get(field)) - else: - sentry_span.set_data(field, SENSITIVE_DATA_SUBSTITUTE) + sentry_span = sentry_sdk.start_span(**kwargs) + fields = metadata.get("fields", []) + for field in fields: + if self._include_tracing_fields(): + sentry_span.set_data(field, attrs.get(field)) + else: + sentry_span.set_data(field, SENSITIVE_DATA_SUBSTITUTE) - return (parent_sentry_span, sentry_span) + sentry_span.__enter__() + return sentry_span - def on_close(self, span_id: str, span_state: "TraceState") -> None: - if span_state is None: + def on_close(self, span_id: str, sentry_span: "SentrySpan") -> None: + if sentry_span is None: return - parent_sentry_span, sentry_span = span_state - sentry_span.finish() - sentry_sdk.get_current_scope().span = parent_sentry_span + sentry_span.__exit__() - def on_record(self, span_id: str, values: str, span_state: "TraceState") -> None: - if span_state is None: + def on_record(self, span_id: str, values: str, sentry_span: "SentrySpan") -> None: + if sentry_span is None: return - _parent_sentry_span, sentry_span = span_state deserialized_values = json.loads(values) for key, value in deserialized_values.items(): From 86b4978b4d3434fe71853867f6309125a24085b3 Mon Sep 17 00:00:00 2001 From: Ivana Kellyer Date: Wed, 11 Mar 2026 16:22:39 +0100 Subject: [PATCH 3/6] . --- sentry_sdk/integrations/rust_tracing.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sentry_sdk/integrations/rust_tracing.py b/sentry_sdk/integrations/rust_tracing.py index 398c3828d7..5054deec5b 100644 --- a/sentry_sdk/integrations/rust_tracing.py +++ b/sentry_sdk/integrations/rust_tracing.py @@ -223,7 +223,7 @@ def on_close(self, span_id: str, sentry_span: "SentrySpan") -> None: if sentry_span is None: return - sentry_span.__exit__() + sentry_span.__exit__(None, None, None) def on_record(self, span_id: str, values: str, sentry_span: "SentrySpan") -> None: if sentry_span is None: From bb95fedfcccf751918a076678115cb3f71a05c34 Mon Sep 17 00:00:00 2001 From: Ivana Kellyer Date: Wed, 11 Mar 2026 16:24:49 +0100 Subject: [PATCH 4/6] . --- sentry_sdk/integrations/rust_tracing.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sentry_sdk/integrations/rust_tracing.py b/sentry_sdk/integrations/rust_tracing.py index 5054deec5b..1dc9aea7eb 100644 --- a/sentry_sdk/integrations/rust_tracing.py +++ b/sentry_sdk/integrations/rust_tracing.py @@ -182,7 +182,7 @@ def on_event(self, event: str, sentry_span: "SentrySpan") -> None: elif event_type == EventTypeMapping.Event: process_event(deserialized_event) - def on_new_span(self, attrs: str, span_id: str) -> "SentrySpan": + def on_new_span(self, attrs: str, span_id: str) -> "Optional[SentrySpan]": attrs = json.loads(attrs) metadata = attrs.get("metadata", {}) From af162823e3593b4bd0d9c9232f824503ff655f16 Mon Sep 17 00:00:00 2001 From: Ivana Kellyer Date: Thu, 12 Mar 2026 09:26:37 +0100 Subject: [PATCH 5/6] fix test --- tests/integrations/rust_tracing/test_rust_tracing.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/tests/integrations/rust_tracing/test_rust_tracing.py b/tests/integrations/rust_tracing/test_rust_tracing.py index 893fc86966..a3e367f7e9 100644 --- a/tests/integrations/rust_tracing/test_rust_tracing.py +++ b/tests/integrations/rust_tracing/test_rust_tracing.py @@ -78,7 +78,7 @@ def test_on_new_span_on_close(sentry_init, capture_events): rust_tracing.new_span(RustTracingLevel.Info, 3) sentry_first_rust_span = sentry_sdk.get_current_span() - _, rust_first_rust_span = rust_tracing.spans[3] + rust_first_rust_span = rust_tracing.spans[3] assert sentry_first_rust_span == rust_first_rust_span @@ -120,24 +120,22 @@ def test_nested_on_new_span_on_close(sentry_init, capture_events): rust_tracing.new_span(RustTracingLevel.Info, 3, index_arg=10) sentry_first_rust_span = sentry_sdk.get_current_span() - _, rust_first_rust_span = rust_tracing.spans[3] + rust_first_rust_span = rust_tracing.spans[3] # Use a different `index_arg` value for the inner span to help # distinguish the two at the end of the test rust_tracing.new_span(RustTracingLevel.Info, 5, index_arg=9) sentry_second_rust_span = sentry_sdk.get_current_span() - rust_parent_span, rust_second_rust_span = rust_tracing.spans[5] + rust_second_rust_span = rust_tracing.spans[5] assert rust_second_rust_span == sentry_second_rust_span - assert rust_parent_span == sentry_first_rust_span - assert rust_parent_span == rust_first_rust_span - assert rust_parent_span != rust_second_rust_span rust_tracing.close_span(5) # Ensure the current sentry span was moved back to the parent sentry_span_after_close = sentry_sdk.get_current_span() assert sentry_span_after_close == sentry_first_rust_span + assert sentry_span_after_close == rust_first_rust_span rust_tracing.close_span(3) From 3040913f50b03e9b85bfb726a8388246523008ca Mon Sep 17 00:00:00 2001 From: Ivana Kellyer Date: Thu, 12 Mar 2026 09:39:31 +0100 Subject: [PATCH 6/6] unused import --- sentry_sdk/integrations/rust_tracing.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sentry_sdk/integrations/rust_tracing.py b/sentry_sdk/integrations/rust_tracing.py index 1dc9aea7eb..697cf7db60 100644 --- a/sentry_sdk/integrations/rust_tracing.py +++ b/sentry_sdk/integrations/rust_tracing.py @@ -32,7 +32,7 @@ import json from enum import Enum, auto -from typing import Any, Callable, Dict, Tuple, Optional +from typing import Any, Callable, Dict, Optional import sentry_sdk from sentry_sdk.integrations import Integration