From bdb6501c98e4569d0ca5fb04ccafbc180ad85e7f Mon Sep 17 00:00:00 2001 From: Alexander Alderman Webb Date: Tue, 11 Aug 2026 08:58:54 +0200 Subject: [PATCH 01/16] feat: Set segment name on scope when span is NoOpStreamedSpan --- sentry_sdk/scope.py | 2 +- sentry_sdk/traces.py | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/sentry_sdk/scope.py b/sentry_sdk/scope.py index 09c580defa..33de972910 100644 --- a/sentry_sdk/scope.py +++ b/sentry_sdk/scope.py @@ -925,7 +925,7 @@ def streamed_span(self, span: "Optional[StreamedSpan]") -> None: # Also set _transaction and _transaction_info in streaming mode as this # is used for populating events and linking them to segments - if type(span) is StreamedSpan and span._is_segment(): + if isinstance(span, StreamedSpan) and span._is_segment(): self._transaction = span.name if span._attributes.get("sentry.segment.name.source"): self._transaction_info["source"] = str( diff --git a/sentry_sdk/traces.py b/sentry_sdk/traces.py index d8251a9101..5f3201525e 100644 --- a/sentry_sdk/traces.py +++ b/sentry_sdk/traces.py @@ -625,6 +625,7 @@ def _to_json(self) -> "SpanJSON": class NoOpStreamedSpan(StreamedSpan): __slots__ = ( + "_name", "_sampled", "_finished", "_unsampled_reason", @@ -632,6 +633,7 @@ class NoOpStreamedSpan(StreamedSpan): def __init__( self, + name: "str", segment: "Optional[StreamedSpan]" = None, trace_id: "Optional[str]" = None, parent_span_id: "Optional[str]" = None, @@ -643,6 +645,8 @@ def __init__( sample_rand: "Optional[float]" = None, sample_rate: "Optional[float]" = None, ) -> None: + self._name = name + self._span_id: "Optional[str]" = None self._sampled = sampled From e6dcbd5d960267be225287b0858e228f7f0b6af7 Mon Sep 17 00:00:00 2001 From: Alexander Alderman Webb Date: Tue, 11 Aug 2026 09:01:22 +0200 Subject: [PATCH 02/16] provide argument --- sentry_sdk/scope.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sentry_sdk/scope.py b/sentry_sdk/scope.py index 33de972910..836e4701e6 100644 --- a/sentry_sdk/scope.py +++ b/sentry_sdk/scope.py @@ -1329,6 +1329,7 @@ def start_streamed_span( if sampled is False or sampled is None: return NoOpStreamedSpan( + name=name, scope=self, segment=None, trace_id=propagation_context.trace_id, @@ -1359,6 +1360,7 @@ def start_streamed_span( with new_scope(): if is_ignored_span(name, attributes): return NoOpStreamedSpan( + name=name, segment=parent_span._segment, trace_id=parent_span.trace_id, parent_span_id=parent_span.span_id, @@ -1368,6 +1370,7 @@ def start_streamed_span( if isinstance(parent_span, NoOpStreamedSpan): return NoOpStreamedSpan( + name=name, segment=parent_span._segment, trace_id=parent_span.trace_id, parent_span_id=parent_span.span_id, From 9fa191ff11dc66bf6aa9c085157f241694475f03 Mon Sep 17 00:00:00 2001 From: Alexander Alderman Webb Date: Tue, 11 Aug 2026 09:05:11 +0200 Subject: [PATCH 03/16] . --- sentry_sdk/scope.py | 4 +++- sentry_sdk/traces.py | 10 +++------- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/sentry_sdk/scope.py b/sentry_sdk/scope.py index 836e4701e6..5145f28e18 100644 --- a/sentry_sdk/scope.py +++ b/sentry_sdk/scope.py @@ -926,7 +926,8 @@ def streamed_span(self, span: "Optional[StreamedSpan]") -> None: # Also set _transaction and _transaction_info in streaming mode as this # is used for populating events and linking them to segments if isinstance(span, StreamedSpan) and span._is_segment(): - self._transaction = span.name + if span.name is not None: + self._transaction = span.name if span._attributes.get("sentry.segment.name.source"): self._transaction_info["source"] = str( span._attributes["sentry.segment.name.source"] @@ -1309,6 +1310,7 @@ def start_streamed_span( if is_ignored_span(name, attributes): return NoOpStreamedSpan( + name=name, scope=self, segment=None, trace_id=propagation_context.trace_id, diff --git a/sentry_sdk/traces.py b/sentry_sdk/traces.py index 5f3201525e..421e04c281 100644 --- a/sentry_sdk/traces.py +++ b/sentry_sdk/traces.py @@ -633,7 +633,7 @@ class NoOpStreamedSpan(StreamedSpan): def __init__( self, - name: "str", + name: "Optional[str]" = None, segment: "Optional[StreamedSpan]" = None, trace_id: "Optional[str]" = None, parent_span_id: "Optional[str]" = None, @@ -742,12 +742,8 @@ def status(self, status: "Union[SpanStatus, str]") -> None: pass @property - def name(self) -> str: - return "" - - @name.setter - def name(self, value: str) -> None: - pass + def name(self) -> "Optional[str]": + return self._name @property def active(self) -> bool: From b940d77c7eb51725f0f225531c54e17fae296b1e Mon Sep 17 00:00:00 2001 From: Alexander Alderman Webb Date: Tue, 11 Aug 2026 09:11:37 +0200 Subject: [PATCH 04/16] gate _attributes access --- sentry_sdk/scope.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/sentry_sdk/scope.py b/sentry_sdk/scope.py index 5145f28e18..77fa378940 100644 --- a/sentry_sdk/scope.py +++ b/sentry_sdk/scope.py @@ -928,7 +928,9 @@ def streamed_span(self, span: "Optional[StreamedSpan]") -> None: if isinstance(span, StreamedSpan) and span._is_segment(): if span.name is not None: self._transaction = span.name - if span._attributes.get("sentry.segment.name.source"): + if type(span) is StreamedSpan and span._attributes.get( + "sentry.segment.name.source" + ): self._transaction_info["source"] = str( span._attributes["sentry.segment.name.source"] ) From bd0f9299236d50b0535c8dbb2a1e086c79650cab Mon Sep 17 00:00:00 2001 From: Alexander Alderman Webb Date: Tue, 11 Aug 2026 09:20:24 +0200 Subject: [PATCH 05/16] . --- sentry_sdk/scope.py | 16 ++++++++++------ sentry_sdk/traces.py | 12 ++++++++---- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/sentry_sdk/scope.py b/sentry_sdk/scope.py index 77fa378940..ea7a19862f 100644 --- a/sentry_sdk/scope.py +++ b/sentry_sdk/scope.py @@ -925,15 +925,19 @@ def streamed_span(self, span: "Optional[StreamedSpan]") -> None: # Also set _transaction and _transaction_info in streaming mode as this # is used for populating events and linking them to segments - if isinstance(span, StreamedSpan) and span._is_segment(): - if span.name is not None: - self._transaction = span.name - if type(span) is StreamedSpan and span._attributes.get( - "sentry.segment.name.source" - ): + if not isinstance(span, StreamedSpan) or not span._is_segment(): + return + + if type(span) is StreamedSpan: + self._transaction = span.name + if span._attributes.get("sentry.segment.name.source"): self._transaction_info["source"] = str( span._attributes["sentry.segment.name.source"] ) + return + + if type(span) is NoOpStreamedSpan and span._noop_name is not None: + self._transaction = span.name @property def profile(self) -> "Optional[Profile]": diff --git a/sentry_sdk/traces.py b/sentry_sdk/traces.py index 421e04c281..1d22e3a7bf 100644 --- a/sentry_sdk/traces.py +++ b/sentry_sdk/traces.py @@ -625,7 +625,7 @@ def _to_json(self) -> "SpanJSON": class NoOpStreamedSpan(StreamedSpan): __slots__ = ( - "_name", + "_noop_name", "_sampled", "_finished", "_unsampled_reason", @@ -645,7 +645,7 @@ def __init__( sample_rand: "Optional[float]" = None, sample_rate: "Optional[float]" = None, ) -> None: - self._name = name + self._noop_name = name self._span_id: "Optional[str]" = None @@ -742,8 +742,12 @@ def status(self, status: "Union[SpanStatus, str]") -> None: pass @property - def name(self) -> "Optional[str]": - return self._name + def name(self) -> str: + return self._noop_name or "" + + @name.setter + def name(self, name: str) -> None: + self._noop_name = name @property def active(self) -> bool: From a675dda08d4631f235b94ef50995930db7879b59 Mon Sep 17 00:00:00 2001 From: Alexander Alderman Webb Date: Tue, 11 Aug 2026 09:23:50 +0200 Subject: [PATCH 06/16] add test --- tests/integrations/django/test_basic.py | 50 +++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/tests/integrations/django/test_basic.py b/tests/integrations/django/test_basic.py index 93b5477010..03e62fe6ec 100644 --- a/tests/integrations/django/test_basic.py +++ b/tests/integrations/django/test_basic.py @@ -1293,6 +1293,56 @@ def test_transaction_style( assert event["transaction"] == expected_transaction +@pytest.mark.parametrize( + "transaction_style,client_url,expected_transaction,expected_source,expected_response", + [ + ( + "function_name", + "/message", + "tests.integrations.django.myapp.views.message", + "component", + b"ok", + ), + ("url", "/message", "/message", "route", b"ok"), + ("url", "/404", "/404", "url", b"404"), + ], +) +@pytest.mark.parametrize("span_streaming", [True, False]) +def test_transaction_style_tracing_disabled( + sentry_init, + client, + capture_events, + capture_items, + transaction_style, + client_url, + expected_transaction, + expected_source, + expected_response, + span_streaming, +): + sentry_init( + integrations=[DjangoIntegration(transaction_style=transaction_style)], + send_default_pii=True, + trace_lifecycle="stream" if span_streaming else "static", + ) + if span_streaming: + items = capture_items("event") + + content, status, headers = unpack_werkzeug_response(client.get(client_url)) + assert content == expected_response + + (event,) = (item.payload for item in items if item.type == "event") + else: + events = capture_events() + + content, status, headers = unpack_werkzeug_response(client.get(client_url)) + assert content == expected_response + + (event,) = events + + assert event["transaction"] == expected_transaction + + @pytest.mark.parametrize("span_streaming", [True, False]) def test_request_body( sentry_init, From 00f076ca97f1feb6f3ef25d902b9abefc38bfb44 Mon Sep 17 00:00:00 2001 From: Alexander Alderman Webb Date: Tue, 11 Aug 2026 09:31:18 +0200 Subject: [PATCH 07/16] . --- tests/tracing/test_span_streaming.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/tracing/test_span_streaming.py b/tests/tracing/test_span_streaming.py index 3800a4badc..81cbeec7fb 100644 --- a/tests/tracing/test_span_streaming.py +++ b/tests/tracing/test_span_streaming.py @@ -799,7 +799,7 @@ def test_continue_trace_unsampled(sentry_init, capture_items): ... assert span.sampled is False - assert span.name == "" + assert span.name == "segment" assert span.trace_id == trace_id assert span.span_id != "0000000000000000" From 3c03d5642d0e5d7e48634258de3d13f156b09ca8 Mon Sep 17 00:00:00 2001 From: Alexander Alderman Webb Date: Tue, 11 Aug 2026 09:47:12 +0200 Subject: [PATCH 08/16] feat: Set segment source on scope for NoOpStreamedSpan --- sentry_sdk/scope.py | 2 ++ sentry_sdk/traces.py | 13 +++++++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/sentry_sdk/scope.py b/sentry_sdk/scope.py index ea7a19862f..9856c7ae5e 100644 --- a/sentry_sdk/scope.py +++ b/sentry_sdk/scope.py @@ -938,6 +938,8 @@ def streamed_span(self, span: "Optional[StreamedSpan]") -> None: if type(span) is NoOpStreamedSpan and span._noop_name is not None: self._transaction = span.name + if span._segment_source is not None: + self._transaction_info["source"] = str(span._segment_source) @property def profile(self) -> "Optional[Profile]": diff --git a/sentry_sdk/traces.py b/sentry_sdk/traces.py index 1d22e3a7bf..49f298389c 100644 --- a/sentry_sdk/traces.py +++ b/sentry_sdk/traces.py @@ -626,6 +626,7 @@ def _to_json(self) -> "SpanJSON": class NoOpStreamedSpan(StreamedSpan): __slots__ = ( "_noop_name", + "_segment_source", "_sampled", "_finished", "_unsampled_reason", @@ -646,6 +647,7 @@ def __init__( sample_rate: "Optional[float]" = None, ) -> None: self._noop_name = name + self._segment_source: "Optional[str]" = None self._span_id: "Optional[str]" = None @@ -725,10 +727,17 @@ def get_attributes(self) -> "Attributes": return {} def set_attribute(self, key: str, value: "AttributeValue") -> None: - pass + if key != "sentry.source.segment": + return + + self._segment_source = value def set_attributes(self, attributes: "Attributes") -> None: - pass + for key, value in attributes.items(): + if key != "sentry.source.segment": + continue + + self._segment_source = value def remove_attribute(self, key: str) -> None: pass From 239fed3c0f7f050c31aa7872d53e02a55fce3b86 Mon Sep 17 00:00:00 2001 From: Alexander Alderman Webb Date: Tue, 11 Aug 2026 09:48:16 +0200 Subject: [PATCH 09/16] use correct attribute --- sentry_sdk/traces.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sentry_sdk/traces.py b/sentry_sdk/traces.py index 49f298389c..a68c811ff0 100644 --- a/sentry_sdk/traces.py +++ b/sentry_sdk/traces.py @@ -727,14 +727,14 @@ def get_attributes(self) -> "Attributes": return {} def set_attribute(self, key: str, value: "AttributeValue") -> None: - if key != "sentry.source.segment": + if key != "sentry.segment.name.source": return self._segment_source = value def set_attributes(self, attributes: "Attributes") -> None: for key, value in attributes.items(): - if key != "sentry.source.segment": + if key != "sentry.segment.name.source": continue self._segment_source = value From 3ab0c75acb2a11f09e92456ec4915ab0ecaff2cf Mon Sep 17 00:00:00 2001 From: Alexander Alderman Webb Date: Tue, 11 Aug 2026 09:51:55 +0200 Subject: [PATCH 10/16] make mypy happy --- sentry_sdk/traces.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sentry_sdk/traces.py b/sentry_sdk/traces.py index a68c811ff0..5a3717b95f 100644 --- a/sentry_sdk/traces.py +++ b/sentry_sdk/traces.py @@ -647,7 +647,7 @@ def __init__( sample_rate: "Optional[float]" = None, ) -> None: self._noop_name = name - self._segment_source: "Optional[str]" = None + self._segment_source: "Optional[AttributeValue]" = None self._span_id: "Optional[str]" = None From 63e764a07c56e016e360c1d8576b99b338fd4d6f Mon Sep 17 00:00:00 2001 From: Alexander Alderman Webb Date: Tue, 11 Aug 2026 10:00:16 +0200 Subject: [PATCH 11/16] add integration test --- tests/tracing/test_integration_tests.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/tests/tracing/test_integration_tests.py b/tests/tracing/test_integration_tests.py index 8bc380b8b6..b293d36134 100644 --- a/tests/tracing/test_integration_tests.py +++ b/tests/tracing/test_integration_tests.py @@ -91,6 +91,21 @@ def test_basic_span_streaming(sentry_init, capture_items, sample_rate): assert not items +def test_error_event_linked_without_performance_span_streaming( + sentry_init, capture_items +): + sentry_init(traces_sample_rate=None, trace_lifecycle="stream") + items = capture_items("event") + + with sentry_sdk.traces.start_span(name="no-op span"): + sentry_sdk.capture_message("hi") + + sentry_sdk.flush() + + (event,) = (item.payload for item in items) + assert event["transaction"] == "no-op span" + + @pytest.mark.parametrize("parent_sampled", [True, False, None]) @pytest.mark.parametrize("sample_rate", [0.0, 1.0]) def test_continue_trace(sentry_init, capture_envelopes, parent_sampled, sample_rate): From f6df6b650c5556fe14f5947a44527a4f2457cc29 Mon Sep 17 00:00:00 2001 From: Alexander Alderman Webb Date: Tue, 11 Aug 2026 10:01:23 +0200 Subject: [PATCH 12/16] update test --- tests/tracing/test_integration_tests.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/tracing/test_integration_tests.py b/tests/tracing/test_integration_tests.py index b293d36134..b52cb1092b 100644 --- a/tests/tracing/test_integration_tests.py +++ b/tests/tracing/test_integration_tests.py @@ -104,6 +104,7 @@ def test_error_event_linked_without_performance_span_streaming( (event,) = (item.payload for item in items) assert event["transaction"] == "no-op span" + assert event["transaction_info"] == {"source": "custom"} @pytest.mark.parametrize("parent_sampled", [True, False, None]) From 2353ae1f5ebf2580c269e183655a8e05e706ae09 Mon Sep 17 00:00:00 2001 From: Alexander Alderman Webb Date: Tue, 11 Aug 2026 10:34:24 +0200 Subject: [PATCH 13/16] fix test --- sentry_sdk/scope.py | 4 ++++ sentry_sdk/traces.py | 3 +++ tests/tracing/test_integration_tests.py | 7 +++++-- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/sentry_sdk/scope.py b/sentry_sdk/scope.py index 9856c7ae5e..cfe0748e71 100644 --- a/sentry_sdk/scope.py +++ b/sentry_sdk/scope.py @@ -1319,6 +1319,7 @@ def start_streamed_span( if is_ignored_span(name, attributes): return NoOpStreamedSpan( name=name, + attributes=attributes, scope=self, segment=None, trace_id=propagation_context.trace_id, @@ -1340,6 +1341,7 @@ def start_streamed_span( if sampled is False or sampled is None: return NoOpStreamedSpan( name=name, + attributes=attributes, scope=self, segment=None, trace_id=propagation_context.trace_id, @@ -1371,6 +1373,7 @@ def start_streamed_span( if is_ignored_span(name, attributes): return NoOpStreamedSpan( name=name, + attributes=attributes, segment=parent_span._segment, trace_id=parent_span.trace_id, parent_span_id=parent_span.span_id, @@ -1381,6 +1384,7 @@ def start_streamed_span( if isinstance(parent_span, NoOpStreamedSpan): return NoOpStreamedSpan( name=name, + attributes=attributes, segment=parent_span._segment, trace_id=parent_span.trace_id, parent_span_id=parent_span.span_id, diff --git a/sentry_sdk/traces.py b/sentry_sdk/traces.py index 5a3717b95f..f3130ad219 100644 --- a/sentry_sdk/traces.py +++ b/sentry_sdk/traces.py @@ -635,6 +635,7 @@ class NoOpStreamedSpan(StreamedSpan): def __init__( self, name: "Optional[str]" = None, + attributes: "Optional[Attributes]" = None, segment: "Optional[StreamedSpan]" = None, trace_id: "Optional[str]" = None, parent_span_id: "Optional[str]" = None, @@ -648,6 +649,8 @@ def __init__( ) -> None: self._noop_name = name self._segment_source: "Optional[AttributeValue]" = None + if attributes is not None: + self._segment_source = attributes.get("sentry.segment.name.source") self._span_id: "Optional[str]" = None diff --git a/tests/tracing/test_integration_tests.py b/tests/tracing/test_integration_tests.py index b52cb1092b..59bb1f9d02 100644 --- a/tests/tracing/test_integration_tests.py +++ b/tests/tracing/test_integration_tests.py @@ -97,14 +97,17 @@ def test_error_event_linked_without_performance_span_streaming( sentry_init(traces_sample_rate=None, trace_lifecycle="stream") items = capture_items("event") - with sentry_sdk.traces.start_span(name="no-op span"): + with sentry_sdk.traces.start_span( + name="no-op span", + attributes={"sentry.segment.name.source": "custom segment source"}, + ): sentry_sdk.capture_message("hi") sentry_sdk.flush() (event,) = (item.payload for item in items) assert event["transaction"] == "no-op span" - assert event["transaction_info"] == {"source": "custom"} + assert event["transaction_info"] == {"source": "custom segment source"} @pytest.mark.parametrize("parent_sampled", [True, False, None]) From 70b1a775a32130109e4cde0ac2abb57b8d561684 Mon Sep 17 00:00:00 2001 From: Alexander Alderman Webb Date: Tue, 11 Aug 2026 11:57:04 +0200 Subject: [PATCH 14/16] feat: Remove early return for NoOpStreamedSpan in set_transaction_name --- sentry_sdk/scope.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/sentry_sdk/scope.py b/sentry_sdk/scope.py index ea7a19862f..6625e95dc9 100644 --- a/sentry_sdk/scope.py +++ b/sentry_sdk/scope.py @@ -861,10 +861,7 @@ def set_transaction_name(self, name: str, source: "Optional[str]" = None) -> Non """Set the transaction name and optionally the transaction source.""" self._transaction = name if self._span: - if isinstance(self._span, NoOpStreamedSpan): - return - - elif isinstance(self._span, StreamedSpan): + if isinstance(self._span, StreamedSpan): self._span._segment.name = name if source: self._span._segment.set_attribute( From f4986d9731b1846fc428a3885d66264cb6fde63a Mon Sep 17 00:00:00 2001 From: Alexander Alderman Webb Date: Tue, 11 Aug 2026 13:46:11 +0200 Subject: [PATCH 15/16] re-use parent _name field --- sentry_sdk/scope.py | 2 +- sentry_sdk/traces.py | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/sentry_sdk/scope.py b/sentry_sdk/scope.py index ea7a19862f..035afaf82b 100644 --- a/sentry_sdk/scope.py +++ b/sentry_sdk/scope.py @@ -936,7 +936,7 @@ def streamed_span(self, span: "Optional[StreamedSpan]") -> None: ) return - if type(span) is NoOpStreamedSpan and span._noop_name is not None: + if type(span) is NoOpStreamedSpan and span._name is not None: self._transaction = span.name @property diff --git a/sentry_sdk/traces.py b/sentry_sdk/traces.py index 1d22e3a7bf..904a40bbc4 100644 --- a/sentry_sdk/traces.py +++ b/sentry_sdk/traces.py @@ -625,7 +625,6 @@ def _to_json(self) -> "SpanJSON": class NoOpStreamedSpan(StreamedSpan): __slots__ = ( - "_noop_name", "_sampled", "_finished", "_unsampled_reason", @@ -645,7 +644,7 @@ def __init__( sample_rand: "Optional[float]" = None, sample_rate: "Optional[float]" = None, ) -> None: - self._noop_name = name + self._name = name # type: ignore[assignment] self._span_id: "Optional[str]" = None @@ -743,11 +742,11 @@ def status(self, status: "Union[SpanStatus, str]") -> None: @property def name(self) -> str: - return self._noop_name or "" + return self._name or "" @name.setter def name(self, name: str) -> None: - self._noop_name = name + self._name = name @property def active(self) -> bool: From 67db0075543d0084b0bf964d78101a30cd21b2dd Mon Sep 17 00:00:00 2001 From: Alexander Alderman Webb Date: Tue, 11 Aug 2026 13:54:21 +0200 Subject: [PATCH 16/16] use super().set_attribute() --- sentry_sdk/traces.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sentry_sdk/traces.py b/sentry_sdk/traces.py index 0e2694c791..b02167672d 100644 --- a/sentry_sdk/traces.py +++ b/sentry_sdk/traces.py @@ -733,7 +733,7 @@ def set_attribute(self, key: str, value: "AttributeValue") -> None: if key != "sentry.segment.name.source": return - self.set_attribute("sentry.segment.name.source", value) + super().set_attribute("sentry.segment.name.source", value) def set_attributes(self, attributes: "Attributes") -> None: for key, value in attributes.items():