Skip to content

Commit e3a3f11

Browse files
BYKNisanthan Nanthakumar
authored and
Nisanthan Nanthakumar
committed
fix(migrations): Make Snuba event migration more robust (#16364)
Fixes getsentry/self-hosted#322
1 parent 0d43636 commit e3a3f11

File tree

1 file changed

+24
-13
lines changed

1 file changed

+24
-13
lines changed

src/sentry/migrations/0024_auto_20191230_2052.py

+24-13
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# -*- coding: utf-8 -*-
22
# Generated by Django 1.9.13 on 2019-12-30 20:52
3-
from __future__ import unicode_literals
3+
from __future__ import unicode_literals, print_function
44

55
import os
66
from datetime import timedelta, datetime
@@ -20,9 +20,9 @@ def backfill_eventstream(apps, schema_editor):
2020
from sentry import eventstore, eventstream
2121
from sentry.utils.query import RangeQuerySetWrapper
2222

23-
Event = apps.get_model('sentry', 'Event')
24-
Group = apps.get_model('sentry', 'Group')
25-
Project = apps.get_model('sentry', 'Project')
23+
Event = apps.get_model("sentry", "Event")
24+
Group = apps.get_model("sentry", "Group")
25+
Project = apps.get_model("sentry", "Project")
2626

2727
# Kill switch to skip this migration
2828
skip_backfill = os.environ.get("SENTRY_SKIP_EVENTS_BACKFILL_FOR_10", False)
@@ -34,20 +34,26 @@ def backfill_eventstream(apps, schema_editor):
3434
def get_events(last_days):
3535
to_date = datetime.now()
3636
from_date = to_date - timedelta(days=last_days)
37-
return Event.objects.filter(datetime__gte=from_date, datetime__lte=to_date, group_id__isnull=False)
37+
return Event.objects.filter(
38+
datetime__gte=from_date, datetime__lte=to_date, group_id__isnull=False
39+
)
3840

3941
def _attach_related(_events):
40-
project_ids = {event.project_id for event in _events}
42+
project_ids = set()
43+
group_ids = set()
44+
for event in _events:
45+
project_ids.add(event.project_id)
46+
group_ids.add(event.group_id)
4147
projects = {p.id: p for p in Project.objects.filter(id__in=project_ids)}
42-
group_ids = {event.group_id for event in _events}
4348
groups = {g.id: g for g in Group.objects.filter(id__in=group_ids)}
49+
4450
for event in _events:
45-
event.project = projects[event.project_id]
46-
event.group = groups[event.group_id]
51+
event.project = projects.get(event.project_id)
52+
event.group = groups.get(event.group_id)
4753
eventstore.bind_nodes(_events, "data")
4854

4955
if skip_backfill:
50-
print("Skipping backfill\n")
56+
print("Skipping backfill.\n")
5157
return
5258

5359
events = get_events(retention_days)
@@ -59,8 +65,13 @@ def _attach_related(_events):
5965

6066
print("Events to process: {}\n".format(count))
6167

68+
processed = 0
6269
for event in RangeQuerySetWrapper(events, step=100, callbacks=(_attach_related,)):
6370
primary_hash = event.get_primary_hash()
71+
if event.project is None or event.group is None:
72+
print("Skipped {} as group or project information is invalid.\n".format(event))
73+
continue
74+
6475
eventstream.insert(
6576
group=event.group,
6677
event=event,
@@ -70,8 +81,9 @@ def _attach_related(_events):
7081
primary_hash=primary_hash,
7182
skip_consume=True,
7283
)
84+
processed += 1
7385

74-
print("Done.\n")
86+
print("Event migration done. Processed {} of {} events.\n".format(processed, count))
7587

7688

7789
class Migration(migrations.Migration):
@@ -89,9 +101,8 @@ class Migration(migrations.Migration):
89101
# - Adding columns to highly active tables, even ones that are NULL.
90102
is_dangerous = True
91103

92-
93104
dependencies = [
94-
('sentry', '0023_hide_environment_none_20191126'),
105+
("sentry", "0023_hide_environment_none_20191126"),
95106
]
96107

97108
operations = [

0 commit comments

Comments
 (0)