From 7ecf57abed3517ddee1fec6f439031fe957f090d Mon Sep 17 00:00:00 2001 From: Anton Pirker Date: Mon, 4 Aug 2025 16:49:28 +0200 Subject: [PATCH 1/6] Let set_data accept a dict to set multiple data attributes at once --- sentry_sdk/tracing.py | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/sentry_sdk/tracing.py b/sentry_sdk/tracing.py index fc40221b9f..cc19ef0ccf 100644 --- a/sentry_sdk/tracing.py +++ b/sentry_sdk/tracing.py @@ -598,9 +598,24 @@ def set_tag(self, key, value): # type: (str, Any) -> None self._tags[key] = value - def set_data(self, key, value): - # type: (str, Any) -> None - self._data[key] = value + def set_data(self, key=None, value=None): + # type: (Optional[Union[str, Dict[str, Any]]], Optional[Any]) -> None + """Set data on the span. + Can be called in two ways: + - set_data(key, value) - sets a single key-value pair + - set_data({"key": "value"}) - sets multiple key-value pairs from a dict + """ + if key is None: + return + + if isinstance(key, dict): + # Dictionary calling pattern: set_data({"key": "value"}) + for k, v in key.items(): + self._data[k] = v + + elif isinstance(key, str): + # Traditional calling pattern: set_data(key, value) + self._data[key] = value def set_flag(self, flag, result): # type: (str, bool) -> None @@ -1271,8 +1286,8 @@ def set_tag(self, key, value): # type: (str, Any) -> None pass - def set_data(self, key, value): - # type: (str, Any) -> None + def set_data(self, key=None, value=None): + # type: (Optional[Union[str, Dict[str, Any]]], Optional[Any]) -> None pass def set_status(self, value): From c6bf58d771e9b9da1ba2d4570dc1cc77fd7d246c Mon Sep 17 00:00:00 2001 From: Anton Pirker Date: Mon, 4 Aug 2025 17:02:53 +0200 Subject: [PATCH 2/6] Added test --- pyproject.toml | 1 + tests/tracing/test_misc.py | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index e5eae2c21f..2592fd6010 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -66,6 +66,7 @@ strict_optional = true warn_redundant_casts = true warn_unused_configs = true warn_unused_ignores = true +exclude = ["tests/"] # Relaxations for code written before mypy was introduced # Do not use wildcards in module paths, otherwise added modules will diff --git a/tests/tracing/test_misc.py b/tests/tracing/test_misc.py index b954d36e1a..6160beac50 100644 --- a/tests/tracing/test_misc.py +++ b/tests/tracing/test_misc.py @@ -509,3 +509,36 @@ def test_transaction_not_started_warning(sentry_init): "The transaction will not be sent to Sentry. To fix, start the transaction by" "passing it to sentry_sdk.start_transaction." ) + + +def test_span_set_data(sentry_init, capture_events): + sentry_init(traces_sample_rate=1.0) + + events = capture_events() + + with sentry_sdk.start_transaction(name="test-transaction"): + with start_span(op="test-span") as span: + span.set_data("key0", "value0") + span.set_data("key1", "value1") + + span.set_data( + { + "key1": "updated-value1", + "key2": "value2", + "key3": "value3", + } + ) + + span.set_data(None) + + (event,) = events + span = event["spans"][0] + + assert span["data"] == { + "key0": "value0", + "key1": "updated-value1", + "key2": "value2", + "key3": "value3", + "thread.id": mock.ANY, + "thread.name": mock.ANY, + } From 80fe6011bd0a7d9a72e61330ef0d26d73074ebfa Mon Sep 17 00:00:00 2001 From: Anton Pirker Date: Mon, 4 Aug 2025 17:11:49 +0200 Subject: [PATCH 3/6] update data --- sentry_sdk/tracing.py | 27 ++++++++------------------- tests/tracing/test_misc.py | 4 +--- 2 files changed, 9 insertions(+), 22 deletions(-) diff --git a/sentry_sdk/tracing.py b/sentry_sdk/tracing.py index cc19ef0ccf..8010efbd3c 100644 --- a/sentry_sdk/tracing.py +++ b/sentry_sdk/tracing.py @@ -598,24 +598,13 @@ def set_tag(self, key, value): # type: (str, Any) -> None self._tags[key] = value - def set_data(self, key=None, value=None): - # type: (Optional[Union[str, Dict[str, Any]]], Optional[Any]) -> None - """Set data on the span. - Can be called in two ways: - - set_data(key, value) - sets a single key-value pair - - set_data({"key": "value"}) - sets multiple key-value pairs from a dict - """ - if key is None: - return - - if isinstance(key, dict): - # Dictionary calling pattern: set_data({"key": "value"}) - for k, v in key.items(): - self._data[k] = v + def set_data(self, key, value): + # type: (str, Any) -> None + self._data[key] = value - elif isinstance(key, str): - # Traditional calling pattern: set_data(key, value) - self._data[key] = value + def update_data(self, data): + # type: (Dict[str, Any]) -> None + self._data.update(data) def set_flag(self, flag, result): # type: (str, bool) -> None @@ -1286,8 +1275,8 @@ def set_tag(self, key, value): # type: (str, Any) -> None pass - def set_data(self, key=None, value=None): - # type: (Optional[Union[str, Dict[str, Any]]], Optional[Any]) -> None + def set_data(self, key, value): + # type: (str, Any) -> None pass def set_status(self, value): diff --git a/tests/tracing/test_misc.py b/tests/tracing/test_misc.py index 6160beac50..554fb0ae20 100644 --- a/tests/tracing/test_misc.py +++ b/tests/tracing/test_misc.py @@ -521,7 +521,7 @@ def test_span_set_data(sentry_init, capture_events): span.set_data("key0", "value0") span.set_data("key1", "value1") - span.set_data( + span.update_data( { "key1": "updated-value1", "key2": "value2", @@ -529,8 +529,6 @@ def test_span_set_data(sentry_init, capture_events): } ) - span.set_data(None) - (event,) = events span = event["spans"][0] From 7faf457fd7c70bc3acfd11811d137be1d51f3b98 Mon Sep 17 00:00:00 2001 From: Anton Pirker Date: Tue, 5 Aug 2025 10:21:38 +0200 Subject: [PATCH 4/6] fixes from review --- sentry_sdk/tracing.py | 4 ++++ tests/tracing/test_misc.py | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/sentry_sdk/tracing.py b/sentry_sdk/tracing.py index 8010efbd3c..dd1392d150 100644 --- a/sentry_sdk/tracing.py +++ b/sentry_sdk/tracing.py @@ -1279,6 +1279,10 @@ def set_data(self, key, value): # type: (str, Any) -> None pass + def update_data(self, data): + # type: (Dict[str, Any]) -> None + pass + def set_status(self, value): # type: (str) -> None pass diff --git a/tests/tracing/test_misc.py b/tests/tracing/test_misc.py index 554fb0ae20..cd8154dc16 100644 --- a/tests/tracing/test_misc.py +++ b/tests/tracing/test_misc.py @@ -511,7 +511,7 @@ def test_transaction_not_started_warning(sentry_init): ) -def test_span_set_data(sentry_init, capture_events): +def test_span_update_data_set_dat(sentry_init, capture_events): sentry_init(traces_sample_rate=1.0) events = capture_events() From 2a0f33b3a0e6cc889af75619aa2575fc29c9e87a Mon Sep 17 00:00:00 2001 From: Anton Pirker Date: Tue, 5 Aug 2025 10:23:15 +0200 Subject: [PATCH 5/6] rename --- tests/tracing/test_misc.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/tracing/test_misc.py b/tests/tracing/test_misc.py index cd8154dc16..651228b45e 100644 --- a/tests/tracing/test_misc.py +++ b/tests/tracing/test_misc.py @@ -511,7 +511,7 @@ def test_transaction_not_started_warning(sentry_init): ) -def test_span_update_data_set_dat(sentry_init, capture_events): +def test_span_set_data_update_data(sentry_init, capture_events): sentry_init(traces_sample_rate=1.0) events = capture_events() From dfe6c76a4a4674fe3146fdf8357a21a9c74f0610 Mon Sep 17 00:00:00 2001 From: Anton Pirker Date: Tue, 5 Aug 2025 10:47:36 +0200 Subject: [PATCH 6/6] remove --- pyproject.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 2592fd6010..e5eae2c21f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -66,7 +66,6 @@ strict_optional = true warn_redundant_casts = true warn_unused_configs = true warn_unused_ignores = true -exclude = ["tests/"] # Relaxations for code written before mypy was introduced # Do not use wildcards in module paths, otherwise added modules will