Skip to content

Commit 80ecad4

Browse files
committed
fix(ourlogs): Allow multiple traces
Span attribute definitions were updated but not logs, this allows multiple event ids to be sent in a list form as a generic validator. Adds a test.
1 parent 642fc96 commit 80ecad4

File tree

4 files changed

+45
-12
lines changed

4 files changed

+45
-12
lines changed

src/sentry/search/eap/ourlogs/attributes.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
simple_sentry_field,
1111
)
1212
from sentry.search.eap.common_columns import COMMON_COLUMNS
13-
from sentry.utils.validators import is_event_id
13+
from sentry.utils.validators import is_event_id_or_list
1414

1515
OURLOG_ATTRIBUTE_DEFINITIONS = {
1616
column.public_alias: column
@@ -35,7 +35,7 @@
3535
public_alias="trace",
3636
internal_name="sentry.trace_id",
3737
search_type="string",
38-
validator=is_event_id,
38+
validator=is_event_id_or_list,
3939
),
4040
ResolvedAttribute(
4141
public_alias="timestamp",

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

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,7 @@
2121
)
2222
from sentry.search.events.types import SnubaParams
2323
from sentry.search.utils import DEVICE_CLASS
24-
from sentry.utils.validators import is_empty_string, is_event_id, is_span_id
25-
26-
27-
def validate_event_id(value: str | list[str]) -> bool:
28-
if isinstance(value, list):
29-
return all([is_event_id(item) for item in value])
30-
else:
31-
return is_event_id(value)
32-
24+
from sentry.utils.validators import is_empty_string, is_event_id_or_list, is_span_id
3325

3426
SPAN_ATTRIBUTE_DEFINITIONS = {
3527
column.public_alias: column
@@ -125,7 +117,7 @@ def validate_event_id(value: str | list[str]) -> bool:
125117
public_alias="trace",
126118
internal_name="sentry.trace_id",
127119
search_type="string",
128-
validator=validate_event_id,
120+
validator=is_event_id_or_list,
129121
),
130122
ResolvedAttribute(
131123
public_alias="transaction",

src/sentry/utils/validators.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,13 @@ def is_event_id(value):
2525
return normalize_event_id(value) is not None
2626

2727

28+
def is_event_id_or_list(value):
29+
if isinstance(value, list):
30+
return all(is_event_id(item) for item in value)
31+
else:
32+
return is_event_id(value)
33+
34+
2835
def is_span_id(value):
2936
return bool(HEXADECIMAL_16_DIGITS.search(force_str(value)))
3037

tests/snuba/api/endpoints/test_organization_events_ourlogs.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,3 +183,37 @@ def test_project_slug_field(self):
183183
assert data[0]["project"] == self.project.slug
184184

185185
assert meta["dataset"] == self.dataset
186+
187+
def test_trace_id_list_filter(self):
188+
trace_id_1 = "1" * 32
189+
trace_id_2 = "2" * 32
190+
logs = [
191+
self.create_ourlog(
192+
{"body": "foo", "trace_id": trace_id_1},
193+
timestamp=self.ten_mins_ago,
194+
),
195+
self.create_ourlog(
196+
{"body": "bar", "trace_id": trace_id_2},
197+
timestamp=self.ten_mins_ago,
198+
),
199+
]
200+
self.store_ourlogs(logs)
201+
response = self.do_request(
202+
{
203+
"field": ["message", "trace"],
204+
"query": f"trace:[{trace_id_1},{trace_id_2}]",
205+
"orderby": "message",
206+
"project": self.project.id,
207+
"dataset": self.dataset,
208+
}
209+
)
210+
211+
assert response.status_code == 200, response.content
212+
data = response.data["data"]
213+
meta = response.data["meta"]
214+
assert len(data) == 2
215+
assert data == [
216+
{"message": "bar", "trace": trace_id_2},
217+
{"message": "foo", "trace": trace_id_1},
218+
]
219+
assert meta["dataset"] == self.dataset

0 commit comments

Comments
 (0)