Skip to content

Commit 8b234c2

Browse files
committed
feat: Use Snuba events in group model
Refactor group model to always use events from Snuba instead of Postgres
1 parent e873279 commit 8b234c2

File tree

3 files changed

+23
-73
lines changed

3 files changed

+23
-73
lines changed

src/sentry/models/group.py

Lines changed: 22 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,7 @@
2121
from django.utils.translation import ugettext_lazy as _
2222

2323
from sentry import eventtypes, tagstore, options
24-
from sentry.constants import (
25-
DEFAULT_LOGGER_NAME, EVENT_ORDERING_KEY, LOG_LEVELS, MAX_CULPRIT_LENGTH
26-
)
24+
from sentry.constants import DEFAULT_LOGGER_NAME, LOG_LEVELS, MAX_CULPRIT_LENGTH
2725
from sentry.db.models import (
2826
BaseManager, BoundedBigIntegerField, BoundedIntegerField, BoundedPositiveIntegerField,
2927
FlexibleForeignKey, GzippedDictField, Model, sane_repr
@@ -158,24 +156,13 @@ def from_event_id(self, project, event_id):
158156
Resolves the 32 character event_id string into
159157
a Group for which it is found.
160158
"""
161-
from sentry.models import EventMapping, Event
159+
from sentry.models import SnubaEvent
162160
group_id = None
163161

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]
173-
174-
# It's possible that group_id is NULL
175-
if group_id is not None:
176-
break
177-
except IndexError:
178-
pass
162+
event = SnubaEvent.objects.from_event_id(event_id, project.id)
163+
164+
if event:
165+
group_id = event.group_id
179166

180167
if group_id is None:
181168
# Raise a Group.DoesNotExist here since it makes
@@ -186,18 +173,22 @@ def from_event_id(self, project, event_id):
186173
return Group.objects.get(id=group_id)
187174

188175
def filter_by_event_id(self, project_ids, event_id):
189-
from sentry.models import EventMapping, Event
176+
from sentry.utils import snuba
177+
190178
group_ids = set()
191-
# see above for explanation as to why we're
192-
# looking at both Event and EventMapping
193-
for model in Event, EventMapping:
194-
group_ids.update(
195-
model.objects.filter(
196-
project_id__in=project_ids,
197-
event_id=event_id,
198-
group_id__isnull=False,
199-
).values_list('group_id', flat=True)
200-
)
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=1,
190+
referrer="Group.filter_by_event_id",
191+
)['data']])
201192

202193
return Group.objects.filter(id__in=group_ids)
203194

@@ -325,11 +316,6 @@ def qualified_short_id(self):
325316
if self.short_id is not None:
326317
return '%s-%s' % (self.project.slug.upper(), base32_encode(self.short_id), )
327318

328-
@property
329-
def event_set(self):
330-
from sentry.models import Event
331-
return Event.objects.filter(group_id=self.id)
332-
333319
def is_over_resolve_age(self):
334320
resolve_age = self.project.get_option('sentry:resolve_age', None)
335321
if not resolve_age:
@@ -390,21 +376,7 @@ def get_score(self):
390376
return type(self).calculate_score(self.times_seen, self.last_seen)
391377

392378
def get_latest_event(self):
393-
from sentry.models import Event
394-
395-
if not hasattr(self, '_latest_event'):
396-
latest_events = sorted(
397-
Event.objects.filter(
398-
group_id=self.id,
399-
).order_by('-datetime')[0:5],
400-
key=EVENT_ORDERING_KEY,
401-
reverse=True,
402-
)
403-
try:
404-
self._latest_event = latest_events[0]
405-
except IndexError:
406-
self._latest_event = None
407-
return self._latest_event
379+
return self.get_latest_event_for_environments()
408380

409381
def get_latest_event_for_environments(self, environments=()):
410382
use_snuba = options.get('snuba.events-queries.enabled')
@@ -419,22 +391,6 @@ def get_latest_event_for_environments(self, environments=()):
419391
issue_id=self.id,
420392
project_id=self.project_id)
421393

422-
def get_oldest_event(self):
423-
from sentry.models import Event
424-
425-
if not hasattr(self, '_oldest_event'):
426-
oldest_events = sorted(
427-
Event.objects.filter(
428-
group_id=self.id,
429-
).order_by('datetime')[0:5],
430-
key=EVENT_ORDERING_KEY,
431-
)
432-
try:
433-
self._oldest_event = oldest_events[0]
434-
except IndexError:
435-
self._oldest_event = None
436-
return self._oldest_event
437-
438394
def get_oldest_event_for_environments(self, environments=()):
439395
use_snuba = options.get('snuba.events-queries.enabled')
440396

tests/integration/tests.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -150,9 +150,7 @@ def queue_event(method, url, body, headers):
150150
assert request.call_count is 1
151151
assert Group.objects.count() == 1
152152
group = Group.objects.get()
153-
assert group.event_set.count() == 1
154-
instance = group.event_set.get()
155-
assert instance.data['logentry']['formatted'] == 'foo'
153+
assert group.data['title'] == 'foo'
156154

157155

158156
class SentryRemoteTest(TestCase):

tests/sentry/tasks/test_unmerge.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -435,8 +435,6 @@ def create_message_event(template, parameters, environment, release):
435435
events.values()[0],
436436
)
437437

438-
assert source.event_set.count() == 10
439-
440438
assert set(
441439
EventMapping.objects.filter(
442440
group_id=source.id,
@@ -497,8 +495,6 @@ def create_message_event(template, parameters, environment, release):
497495
events.values()[1],
498496
)
499497

500-
assert destination.event_set.count() == 7
501-
502498
assert set(
503499
EventMapping.objects.filter(
504500
group_id=destination.id,

0 commit comments

Comments
 (0)