Skip to content

Commit be7268d

Browse files
authored
fix(spans): Unquote literal value in key eq val filters (#101745)
This allows quoted values like `count_if(foo,equals,"bar baz")`
1 parent 15b8888 commit be7268d

File tree

3 files changed

+74
-0
lines changed

3 files changed

+74
-0
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
def unquote_literal(value: str) -> str:
2+
if len(value) < 2 or value[0] != '"' or value[-1] != '"':
3+
return value
4+
else:
5+
return value[1:-1]

src/sentry/search/eap/spans/aggregates.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
ResolvedArguments,
2323
ValueArgumentDefinition,
2424
)
25+
from sentry.search.eap.normalizer import unquote_literal
2526
from sentry.search.eap.spans.utils import WEB_VITALS_MEASUREMENTS, transform_vital_score_to_ratio
2627
from sentry.search.eap.validator import literal_validator, number_validator
2728

@@ -67,6 +68,7 @@ def resolve_key_eq_value_filter(args: ResolvedArguments) -> tuple[AttributeKey,
6768
elif key.type == AttributeKey.TYPE_INT:
6869
attr_value = AttributeValue(val_int=int(value))
6970
else:
71+
value = unquote_literal(value)
7072
attr_value = AttributeValue(val_str=value)
7173
except ValueError:
7274
expected_type = "string"

tests/snuba/api/endpoints/test_organization_events_span_indexed.py

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5991,6 +5991,73 @@ def test_count_if_span_status(self) -> None:
59915991
assert meta["fields"]["count_if(span.status,equals,success)"] == "integer"
59925992
assert meta["units"]["count_if(span.status,equals,success)"] is None
59935993

5994+
def test_count_if_span_status_equation_quoted(self) -> None:
5995+
self.store_spans(
5996+
[
5997+
self.create_span(
5998+
{"description": "foo", "sentry_tags": {"status": "success"}},
5999+
start_ts=self.ten_mins_ago,
6000+
),
6001+
self.create_span(
6002+
{
6003+
"description": "bar",
6004+
"sentry_tags": {"status": ""},
6005+
},
6006+
start_ts=self.ten_mins_ago,
6007+
),
6008+
],
6009+
is_eap=True,
6010+
)
6011+
equation = 'equation|count_if(span.status,equals,"success")'
6012+
response = self.do_request(
6013+
{
6014+
"field": [equation],
6015+
"query": "",
6016+
"orderby": equation,
6017+
"project": self.project.id,
6018+
"dataset": "spans",
6019+
}
6020+
)
6021+
6022+
assert response.status_code == 200, response.content
6023+
6024+
data = response.data["data"]
6025+
meta = response.data["meta"]
6026+
assert len(data) == 1
6027+
assert data == [
6028+
{
6029+
equation: 1.0,
6030+
},
6031+
]
6032+
assert meta["dataset"] == "spans"
6033+
assert meta["fields"][equation] == "integer"
6034+
assert meta["units"][equation] is None
6035+
6036+
equation = 'equation|count_if(span.status,equals,"")'
6037+
response = self.do_request(
6038+
{
6039+
"field": [equation],
6040+
"query": "",
6041+
"orderby": equation,
6042+
"project": self.project.id,
6043+
"dataset": "spans",
6044+
}
6045+
)
6046+
6047+
assert response.status_code == 200, response.content
6048+
6049+
data = response.data["data"]
6050+
meta = response.data["meta"]
6051+
assert len(data) == 1
6052+
assert data == [
6053+
{
6054+
equation: 1.0,
6055+
},
6056+
]
6057+
assert meta["dataset"] == "spans"
6058+
assert meta["fields"][equation] == "integer"
6059+
assert meta["units"][equation] is None
6060+
59946061
def test_count_if_numeric(self) -> None:
59956062
self.store_spans(
59966063
[

0 commit comments

Comments
 (0)