Skip to content

Commit 46961df

Browse files
authored
feat: Use Snuba for Group.from_event_id (#14034)
This is the first part of #13905, which updates the group model to use events from Snuba instead of Postgres. This PR just updates the from_event_id function.
1 parent 8c91607 commit 46961df

File tree

2 files changed

+21
-34
lines changed

2 files changed

+21
-34
lines changed

src/sentry/models/group.py

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -158,24 +158,13 @@ def from_event_id(self, project, event_id):
158158
Resolves the 32 character event_id string into
159159
a Group for which it is found.
160160
"""
161-
from sentry.models import EventMapping, Event
161+
from sentry.models import SnubaEvent
162162
group_id = None
163163

164-
# Look up event_id in both Event and EventMapping,
165-
# and bail when it matches one of them, prioritizing
166-
# Event since it contains more history.
167-
for model in Event, EventMapping:
168-
try:
169-
group_id = model.objects.filter(
170-
project_id=project.id,
171-
event_id=event_id,
172-
).values_list('group_id', flat=True)[0]
164+
event = SnubaEvent.objects.from_event_id(event_id, project.id)
173165

174-
# It's possible that group_id is NULL
175-
if group_id is not None:
176-
break
177-
except IndexError:
178-
pass
166+
if event:
167+
group_id = event.group_id
179168

180169
if group_id is None:
181170
# Raise a Group.DoesNotExist here since it makes

tests/snuba/api/endpoints/test_project_group_index.py

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

1212
from sentry.models import (
13-
Activity, ApiToken, EventMapping, Group, GroupAssignee, GroupBookmark, GroupHash,
13+
Activity, ApiToken, Group, GroupAssignee, GroupBookmark, GroupHash,
1414
GroupLink, GroupResolution, GroupSeen, GroupShare, GroupSnooze, GroupStatus, GroupSubscription,
1515
GroupTombstone, ExternalIssue, Integration, Release, OrganizationIntegration, UserOption
1616
)
17-
from sentry.models.event import Event
1817
from sentry.testutils import APITestCase, SnubaTestCase
1918
from sentry.testutils.helpers import parse_link_header
2019
from six.moves.urllib.parse import quote
@@ -192,31 +191,31 @@ def test_auto_resolved(self):
192191
def test_lookup_by_event_id(self):
193192
project = self.project
194193
project.update_option('sentry:resolve_age', 1)
195-
group = self.create_group(checksum='a' * 32)
196-
self.create_group(checksum='b' * 32)
197194
event_id = 'c' * 32
198-
event = Event.objects.create(project_id=self.project.id, event_id=event_id)
199-
EventMapping.objects.create(
200-
event_id=event_id,
201-
project=group.project,
202-
group=group,
195+
event = self.store_event(
196+
data={
197+
'event_id': event_id,
198+
'timestamp': self.min_ago.isoformat()[:19],
199+
},
200+
project_id=self.project.id
203201
)
204-
205202
self.login_as(user=self.user)
206203

207204
response = self.client.get(u'{}?query={}'.format(self.path, 'c' * 32), format='json')
208205
assert response.status_code == 200
209206
assert len(response.data) == 1
210-
assert response.data[0]['id'] == six.text_type(group.id)
207+
assert response.data[0]['id'] == six.text_type(event.group.id)
211208
assert response.data[0]['matchingEventId'] == event.id
212209

213210
def test_lookup_by_event_with_matching_environment(self):
214211
project = self.project
215212
project.update_option('sentry:resolve_age', 1)
216213
self.create_environment(name="test", project=project)
214+
217215
event = self.store_event(
218216
data={
219217
'environment': 'test',
218+
'timestamp': self.min_ago.isoformat()[:19],
220219
},
221220
project_id=self.project.id,
222221
)
@@ -235,21 +234,20 @@ def test_lookup_by_event_with_matching_environment(self):
235234
def test_lookup_by_event_id_with_whitespace(self):
236235
project = self.project
237236
project.update_option('sentry:resolve_age', 1)
238-
group = self.create_group(checksum='a' * 32)
239-
self.create_group(checksum='b' * 32)
240-
EventMapping.objects.create(
241-
event_id='c' * 32,
242-
project=group.project,
243-
group=group,
237+
event = self.store_event(
238+
data={
239+
'event_id': 'c' * 32,
240+
'timestamp': self.min_ago.isoformat()[:19],
241+
},
242+
project_id=self.project.id
244243
)
245-
246244
self.login_as(user=self.user)
247245
response = self.client.get(
248246
u'{}?query=%20%20{}%20%20'.format(self.path, 'c' * 32), format='json'
249247
)
250248
assert response.status_code == 200
251249
assert len(response.data) == 1
252-
assert response.data[0]['id'] == six.text_type(group.id)
250+
assert response.data[0]['id'] == six.text_type(event.group.id)
253251

254252
def test_lookup_by_unknown_event_id(self):
255253
project = self.project

0 commit comments

Comments
 (0)