Skip to content

Commit 9483d4d

Browse files
authored
fix(spans): Support None and full uint64 in span.data (#92211)
Fixes several errors that appear in the conversion of `span.data` to trace items.
1 parent 1c344e7 commit 9483d4d

File tree

2 files changed

+21
-2
lines changed

2 files changed

+21
-2
lines changed

src/sentry/spans/consumers/process_segments/convert.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313

1414
from sentry.spans.consumers.process_segments.types import Span
1515

16+
I64_MAX = 2**63 - 1
17+
1618
FIELD_TO_ATTRIBUTE = {
1719
"description": "sentry.raw_description",
1820
"duration_ms": "sentry.duration_ms",
@@ -38,7 +40,8 @@ def convert_span_to_item(span: Span) -> TraceItem:
3840
server_sample_rate = 1.0
3941

4042
for k, v in (span.get("data") or {}).items():
41-
attributes[k] = _anyvalue(v)
43+
if v is not None:
44+
attributes[k] = _anyvalue(v)
4245

4346
for k, v in (span.get("measurements") or {}).items():
4447
if k is not None and v is not None:
@@ -87,6 +90,8 @@ def _anyvalue(value: Any) -> AnyValue:
8790
elif isinstance(value, bool):
8891
return AnyValue(bool_value=value)
8992
elif isinstance(value, int):
93+
if value > I64_MAX:
94+
return AnyValue(double_value=float(value))
9095
return AnyValue(int_value=value)
9196
elif isinstance(value, float):
9297
return AnyValue(double_value=value)

tests/sentry/spans/consumers/process_segments/test_convert.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
from google.protobuf.timestamp_pb2 import Timestamp
44
from sentry_protos.snuba.v1.request_common_pb2 import TraceItemType
5-
from sentry_protos.snuba.v1.trace_item_pb2 import AnyValue
5+
from sentry_protos.snuba.v1.trace_item_pb2 import AnyValue, KeyValue, KeyValueList
66

77
from sentry.spans.consumers.process_segments.convert import convert_span_to_item
88
from sentry.spans.consumers.process_segments.types import Span
@@ -30,6 +30,11 @@
3030
"my.neg.float.field": -101.2,
3131
"my.true.bool.field": True,
3232
"my.false.bool.field": False,
33+
"my.dict.field": {
34+
"id": 42,
35+
"name": "test",
36+
},
37+
"my.u64.field": 9447000002305251000,
3338
},
3439
"measurements": {
3540
"num_of_spans": {"value": 50.0},
@@ -145,4 +150,13 @@ def test_convert_span_to_item():
145150
"relay_use_post_or_schedule_rejected": AnyValue(string_value="version"),
146151
"sentry.normalized_description": AnyValue(string_value="normalized_description"),
147152
"thread.name": AnyValue(string_value="uWSGIWorker1Core0"),
153+
"my.dict.field": AnyValue(
154+
kvlist_value=KeyValueList(
155+
values=[
156+
KeyValue(key="id", value=AnyValue(int_value=42)),
157+
KeyValue(key="name", value=AnyValue(string_value="test")),
158+
]
159+
)
160+
),
161+
"my.u64.field": AnyValue(double_value=9447000002305251000.0),
148162
}

0 commit comments

Comments
 (0)