Skip to content

Commit 2db32ef

Browse files
authored
fix(spans): Catch invalid group value (#56132)
1 parent fb5c960 commit 2db32ef

File tree

2 files changed

+29
-6
lines changed

2 files changed

+29
-6
lines changed

src/sentry/spans/consumers/process/factory.py

+20-6
Original file line numberDiff line numberDiff line change
@@ -81,10 +81,18 @@ def _build_snuba_span(relay_span: Mapping[str, Any]) -> MutableMapping[str, Any]
8181
if span_data:
8282
for relay_tag, snuba_tag in TAG_MAPPING.items():
8383
tag_value = span_data.get(relay_tag)
84-
if tag_value is None:
85-
if snuba_tag == "group":
84+
if snuba_tag == "group":
85+
if tag_value is None:
8686
metrics.incr("spans.missing_group")
87-
else:
87+
else:
88+
try:
89+
# Test if the value is valid hexadecimal.
90+
_ = int(tag_value, 16)
91+
# If valid, set the raw value to the tag.
92+
sentry_tags["group"] = tag_value
93+
except ValueError:
94+
metrics.incr("spans.invalid_group")
95+
elif tag_value is not None:
8896
sentry_tags[snuba_tag] = tag_value
8997

9098
if "op" not in sentry_tags and (op := relay_span.get("op", "")) is not None:
@@ -104,7 +112,7 @@ def _build_snuba_span(relay_span: Mapping[str, Any]) -> MutableMapping[str, Any]
104112
grouping_config = load_span_grouping_config()
105113

106114
if snuba_span["is_segment"]:
107-
group = grouping_config.strategy.get_transaction_span_group(
115+
group_raw = grouping_config.strategy.get_transaction_span_group(
108116
{"transaction": span_data.get("transaction", "")},
109117
)
110118
else:
@@ -122,9 +130,15 @@ def _build_snuba_span(relay_span: Mapping[str, Any]) -> MutableMapping[str, Any]
122130
data=None,
123131
same_process_as_parent=True,
124132
)
125-
group = grouping_config.strategy.get_span_group(span)
133+
group_raw = grouping_config.strategy.get_span_group(span)
134+
135+
try:
136+
_ = int(group_raw, 16)
137+
snuba_span["group_raw"] = group_raw
138+
except ValueError:
139+
snuba_span["group_raw"] = "0"
140+
metrics.incr("spans.invalid_group_raw")
126141

127-
snuba_span["group_raw"] = group or "0"
128142
snuba_span["span_grouping_config"] = {"id": grouping_config.id}
129143

130144
return snuba_span

tests/sentry/spans/test_spans_process_consumer.py

+9
Original file line numberDiff line numberDiff line change
@@ -116,3 +116,12 @@ def test_null_tags_and_data():
116116

117117
assert all([v is not None for v in snuba_span["sentry_tags"].values()])
118118
assert "description" in snuba_span["sentry_tags"]
119+
120+
relay_span["data"] = {
121+
"status_code": "undefined",
122+
"group": "[Filtered]",
123+
}
124+
snuba_span = _build_snuba_span(relay_span)
125+
126+
assert snuba_span["sentry_tags"].get("group") is None
127+
assert snuba_span["sentry_tags"].get("status_code") is None

0 commit comments

Comments
 (0)