Skip to content

Commit 864769f

Browse files
committed
feat: Use Snuba for Group.filter_by_event_id
This is the second part of #13905, which updates the group model to use events from Snuba instead of Postgres. This PR updates the filter_by_event_id function.
1 parent 46961df commit 864769f

File tree

2 files changed

+31
-30
lines changed

2 files changed

+31
-30
lines changed

src/sentry/models/group.py

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -175,18 +175,20 @@ def from_event_id(self, project, event_id):
175175
return Group.objects.get(id=group_id)
176176

177177
def filter_by_event_id(self, project_ids, event_id):
178-
from sentry.models import EventMapping, Event
179-
group_ids = set()
180-
# see above for explanation as to why we're
181-
# looking at both Event and EventMapping
182-
for model in Event, EventMapping:
183-
group_ids.update(
184-
model.objects.filter(
185-
project_id__in=project_ids,
186-
event_id=event_id,
187-
group_id__isnull=False,
188-
).values_list('group_id', flat=True)
189-
)
178+
from sentry.utils import snuba
179+
180+
group_ids = set([evt['issue'] for evt in snuba.raw_query(
181+
start=datetime.utcfromtimestamp(0),
182+
end=datetime.utcnow(),
183+
selected_columns=['issue'],
184+
conditions=[['issue', 'IS NOT NULL', None]],
185+
filter_keys={
186+
'event_id': [event_id],
187+
'project_id': project_ids,
188+
},
189+
limit=1000,
190+
referrer="Group.filter_by_event_id",
191+
)['data']])
190192

191193
return Group.objects.filter(id__in=group_ids)
192194

tests/snuba/api/endpoints/test_organization_group_index.py

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@
1010
from mock import patch, Mock
1111

1212
from sentry.models import (
13-
Activity, ApiToken, Event, EventMapping, ExternalIssue, Group, GroupAssignee,
14-
GroupBookmark, GroupHash, GroupLink, GroupSeen, GroupShare, GroupSnooze,
15-
GroupStatus, GroupResolution, GroupSubscription, GroupTombstone, Integration,
13+
Activity, ApiToken, ExternalIssue, Group, GroupAssignee, GroupBookmark,
14+
GroupHash, GroupLink, GroupSeen, GroupShare, GroupSnooze, GroupStatus,
15+
GroupResolution, GroupSubscription, GroupTombstone, Integration,
1616
OrganizationIntegration, UserOption, Release
1717
)
1818
from sentry.testutils import APITestCase, SnubaTestCase
@@ -209,22 +209,21 @@ def test_auto_resolved(self):
209209
def test_lookup_by_event_id(self):
210210
project = self.project
211211
project.update_option('sentry:resolve_age', 1)
212-
group = self.create_group(checksum='a' * 32)
213-
self.create_group(checksum='b' * 32)
214212
event_id = 'c' * 32
215-
Event.objects.create(project_id=self.project.id, event_id=event_id)
216-
EventMapping.objects.create(
217-
event_id=event_id,
218-
project=group.project,
219-
group=group,
213+
event = self.store_event(
214+
data={
215+
'event_id': event_id,
216+
'timestamp': self.min_ago.isoformat()[:19],
217+
},
218+
project_id=self.project.id
220219
)
221220

222221
self.login_as(user=self.user)
223222

224223
response = self.get_valid_response(query='c' * 32)
225224
assert response['X-Sentry-Direct-Hit'] == '1'
226225
assert len(response.data) == 1
227-
assert response.data[0]['id'] == six.text_type(group.id)
226+
assert response.data[0]['id'] == six.text_type(event.group.id)
228227
assert response.data[0]['matchingEventId'] == event_id
229228

230229
def test_lookup_by_event_id_incorrect_project_id(self):
@@ -257,20 +256,20 @@ def test_lookup_by_event_id_incorrect_project_id(self):
257256
def test_lookup_by_event_id_with_whitespace(self):
258257
project = self.project
259258
project.update_option('sentry:resolve_age', 1)
260-
group = self.create_group(checksum='a' * 32)
261259
event_id = 'c' * 32
262-
self.create_group(checksum='b' * 32)
263-
EventMapping.objects.create(
264-
event_id=event_id,
265-
project=group.project,
266-
group=group,
260+
event = self.store_event(
261+
data={
262+
'event_id': event_id,
263+
'timestamp': self.min_ago.isoformat()[:19],
264+
},
265+
project_id=self.project.id
267266
)
268267

269268
self.login_as(user=self.user)
270269
response = self.get_valid_response(query=' {} '.format('c' * 32))
271270
assert response['X-Sentry-Direct-Hit'] == '1'
272271
assert len(response.data) == 1
273-
assert response.data[0]['id'] == six.text_type(group.id)
272+
assert response.data[0]['id'] == six.text_type(event.group.id)
274273
assert response.data[0]['matchingEventId'] == event_id
275274

276275
def test_lookup_by_unknown_event_id(self):

0 commit comments

Comments
 (0)