Browse Source

feat(api): Have GroupSerializerSnuba use GroupEnvironment.first_seen

Jess MacQueen 6 years ago
parent
commit
886dda2cbd

+ 13 - 5
src/sentry/api/serializers/models/group.py

@@ -7,7 +7,7 @@ from datetime import timedelta
 import six
 from django.conf import settings
 from django.core.urlresolvers import reverse
-from django.db.models import Q
+from django.db.models import Min, Q
 from django.utils import timezone
 
 from sentry import tagstore, tsdb
@@ -16,9 +16,9 @@ from sentry.api.serializers.models.actor import ActorSerializer
 from sentry.api.fields.actor import Actor
 from sentry.constants import LOG_LEVELS, StatsPeriod
 from sentry.models import (
-    Commit, Environment, Group, GroupAssignee, GroupBookmark, GroupLink, GroupMeta, GroupResolution, GroupSeen, GroupSnooze,
-    GroupShare, GroupStatus, GroupSubscription, GroupSubscriptionReason, Integration, User, UserOption,
-    UserOptionValue
+    Commit, Environment, Group, GroupAssignee, GroupBookmark, GroupEnvironment, GroupLink, GroupMeta,
+    GroupResolution, GroupSeen, GroupSnooze, GroupShare, GroupStatus, GroupSubscription,
+    GroupSubscriptionReason, Integration, User, UserOption, UserOptionValue
 )
 from sentry.tagstore.snuba.backend import SnubaTagStorage
 from sentry.tsdb.snuba import SnubaTSDB
@@ -576,8 +576,16 @@ class GroupSerializerSnuba(GroupSerializerBase):
                 group_ids,
                 self.environment_ids,
             )
+
+            first_seen_data = {
+                ge['group_id']: ge['first_seen__min'] for ge in GroupEnvironment.objects.filter(
+                    group_id__in=[item.id for item in item_list],
+                    environment_id__in=self.environment_ids,
+                ).values('group_id').annotate(Min('first_seen'))
+            }
+
             for item_id, value in seen_data.items():
-                first_seen[item_id] = value['first_seen']
+                first_seen[item_id] = first_seen_data.get(item.id)
                 last_seen[item_id] = value['last_seen']
                 times_seen[item_id] = value['times_seen']
 

+ 10 - 3
tests/snuba/api/serializers/test_group.py

@@ -13,7 +13,7 @@ from mock import patch
 from sentry.api.serializers import serialize
 from sentry.api.serializers.models.group import GroupSerializerSnuba, StreamGroupSerializerSnuba, snuba_tsdb
 from sentry.models import (
-    Environment, GroupLink, GroupResolution, GroupSnooze, GroupStatus,
+    Environment, GroupEnvironment, GroupLink, GroupResolution, GroupSnooze, GroupStatus,
     GroupSubscription, UserOption, UserOptionValue
 )
 from sentry.testutils import APITestCase, SnubaTestCase
@@ -317,6 +317,13 @@ class GroupSerializerSnubaTest(APITestCase, SnubaTestCase):
             'c' * 32, group=group, datetime=self.min_ago, tags={'environment': environment2.name}
         )
 
+        # update this to something different to make sure it's being used
+        group_env = GroupEnvironment.objects.get(group_id=group.id, environment_id=environment.id)
+        group_env.first_seen = self.day_ago - timedelta(days=3)
+        group_env.save()
+
+        group_env2 = GroupEnvironment.objects.get(group_id=group.id, environment_id=environment2.id)
+
         result = serialize(
             group, serializer=GroupSerializerSnuba(
                 environment_ids=[environment.id, environment2.id])
@@ -324,8 +331,8 @@ class GroupSerializerSnubaTest(APITestCase, SnubaTestCase):
         assert result['count'] == '3'
         # result is rounded down to nearest second
         assert result['lastSeen'] == self.min_ago - timedelta(microseconds=self.min_ago.microsecond)
-        assert result['firstSeen'] == self.day_ago - \
-            timedelta(microseconds=self.day_ago.microsecond)
+        assert result['firstSeen'] == group_env.first_seen
+        assert group_env2.first_seen > group_env.first_seen
 
 
 class StreamGroupSerializerTestCase(APITestCase, SnubaTestCase):