Skip to content

Commit 076da73

Browse files
authored
feat: Update Group.filter_by_event_id to use Snuba (#14035)
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 872051e commit 076da73

File tree

2 files changed

+33
-30
lines changed

2 files changed

+33
-30
lines changed

src/sentry/models/group.py

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -208,18 +208,22 @@ def from_event_id(self, project, event_id):
208208
return Group.objects.get(id=group_id)
209209

210210
def filter_by_event_id(self, project_ids, event_id):
211-
from sentry.models import EventMapping, Event
212-
group_ids = set()
213-
# see above for explanation as to why we're
214-
# looking at both Event and EventMapping
215-
for model in Event, EventMapping:
216-
group_ids.update(
217-
model.objects.filter(
218-
project_id__in=project_ids,
219-
event_id=event_id,
220-
group_id__isnull=False,
221-
).values_list('group_id', flat=True)
222-
)
211+
from sentry.utils import snuba
212+
213+
data = snuba.raw_query(
214+
start=datetime.utcfromtimestamp(0),
215+
end=datetime.utcnow(),
216+
selected_columns=['issue'],
217+
conditions=[['issue', 'IS NOT NULL', None]],
218+
filter_keys={
219+
'event_id': [event_id],
220+
'project_id': project_ids,
221+
},
222+
limit=len(project_ids),
223+
referrer="Group.filter_by_event_id",
224+
)['data']
225+
226+
group_ids = set([evt['issue'] for evt in data])
223227

224228
return Group.objects.filter(id__in=group_ids)
225229

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)