|
@@ -11,15 +11,16 @@ import logging
|
|
|
import math
|
|
|
import re
|
|
|
import warnings
|
|
|
+from enum import Enum
|
|
|
|
|
|
-from datetime import timedelta
|
|
|
+from datetime import datetime, timedelta
|
|
|
from django.core.urlresolvers import reverse
|
|
|
from django.db import models
|
|
|
from django.utils import timezone
|
|
|
from django.utils.http import urlencode
|
|
|
from django.utils.translation import ugettext_lazy as _
|
|
|
|
|
|
-from sentry import eventtypes, tagstore
|
|
|
+from sentry import eventtypes, tagstore, options
|
|
|
from sentry.constants import (
|
|
|
DEFAULT_LOGGER_NAME, EVENT_ORDERING_KEY, LOG_LEVELS, MAX_CULPRIT_LENGTH
|
|
|
)
|
|
@@ -76,6 +77,40 @@ def get_group_with_redirect(id, queryset=None):
|
|
|
raise error # raise original `DoesNotExist`
|
|
|
|
|
|
|
|
|
+class EventOrdering(Enum):
|
|
|
+ LATEST = ['-timestamp', '-event_id']
|
|
|
+ OLDEST = ['timestamp', 'event_id']
|
|
|
+
|
|
|
+
|
|
|
+def get_oldest_or_latest_event_for_environments(
|
|
|
+ ordering, environments=[], issue_id=None, project_id=None):
|
|
|
+ from sentry.utils import snuba
|
|
|
+ from sentry.models import SnubaEvent
|
|
|
+
|
|
|
+ conditions = []
|
|
|
+
|
|
|
+ if len(environments) > 0:
|
|
|
+ conditions.append(['environment', 'IN', environments])
|
|
|
+
|
|
|
+ result = snuba.raw_query(
|
|
|
+ start=datetime.utcfromtimestamp(0),
|
|
|
+ end=datetime.utcnow(),
|
|
|
+ selected_columns=SnubaEvent.selected_columns,
|
|
|
+ conditions=conditions,
|
|
|
+ filter_keys={
|
|
|
+ 'issue': [issue_id],
|
|
|
+ 'project_id': [project_id],
|
|
|
+ },
|
|
|
+ orderby=ordering.value,
|
|
|
+ limit=1,
|
|
|
+ )
|
|
|
+
|
|
|
+ if 'error' not in result and len(result['data']) == 1:
|
|
|
+ return SnubaEvent(result['data'][0])
|
|
|
+
|
|
|
+ return None
|
|
|
+
|
|
|
+
|
|
|
class GroupManager(BaseManager):
|
|
|
use_for_related_fields = True
|
|
|
|
|
@@ -377,6 +412,19 @@ class Group(Model):
|
|
|
self._latest_event = None
|
|
|
return self._latest_event
|
|
|
|
|
|
+ def get_latest_event_for_environments(self, environments=[]):
|
|
|
+ use_snuba = options.get('snuba.events-queries.enabled')
|
|
|
+
|
|
|
+ # Fetch without environment if Snuba is not enabled
|
|
|
+ if not use_snuba:
|
|
|
+ return self.get_latest_event()
|
|
|
+
|
|
|
+ return get_oldest_or_latest_event_for_environments(
|
|
|
+ EventOrdering.LATEST,
|
|
|
+ environments=environments,
|
|
|
+ issue_id=self.id,
|
|
|
+ project_id=self.project_id)
|
|
|
+
|
|
|
def get_oldest_event(self):
|
|
|
from sentry.models import Event
|
|
|
|
|
@@ -393,6 +441,19 @@ class Group(Model):
|
|
|
self._oldest_event = None
|
|
|
return self._oldest_event
|
|
|
|
|
|
+ def get_oldest_event_for_environments(self, environments=[]):
|
|
|
+ use_snuba = options.get('snuba.events-queries.enabled')
|
|
|
+
|
|
|
+ # Fetch without environment if Snuba is not enabled
|
|
|
+ if not use_snuba:
|
|
|
+ return self.get_oldest_event()
|
|
|
+
|
|
|
+ return get_oldest_or_latest_event_for_environments(
|
|
|
+ EventOrdering.OLDEST,
|
|
|
+ environments=environments,
|
|
|
+ issue_id=self.id,
|
|
|
+ project_id=self.project_id)
|
|
|
+
|
|
|
def get_first_release(self):
|
|
|
if self.first_release_id is None:
|
|
|
return tagstore.get_first_release(self.project_id, self.id)
|