Browse Source

fix(search): Make `GroupSerializerSnuba` always use snuba to calculate `last_seen` and `times_seen`

We're getting weird results when we sort by `last_seen` without specifying an environment. The
ordering is correct, but the serializer shows things out of order, since `Group.last_seen` is not
always immediately up to date with snuba.
Dan Fuller 5 years ago
parent
commit
fb9564ed08

+ 8 - 18
src/sentry/api/serializers/models/group.py

@@ -568,21 +568,15 @@ class GroupSerializerSnuba(GroupSerializerBase):
             end=self.end,
         )
 
-        first_seen = {}
-        last_seen = {}
-        times_seen = {}
+        seen_data = tagstore.get_group_seen_values_for_environments(
+            project_ids, group_ids, self.environment_ids, start=self.start, end=self.end
+        )
+        last_seen = {item_id: value["last_seen"] for item_id, value in seen_data.items()}
         if not self.environment_ids:
-            # use issue fields
-            for item in item_list:
-                first_seen[item.id] = item.first_seen
-                last_seen[item.id] = item.last_seen
-                times_seen[item.id] = item.times_seen
+            first_seen = {item.id: item.first_seen for item in item_list}
+            times_seen = {item.id: item.times_seen for item in item_list}
         else:
-            seen_data = tagstore.get_group_seen_values_for_environments(
-                project_ids, group_ids, self.environment_ids, start=self.start, end=self.end
-            )
-
-            first_seen_data = {
+            first_seen = {
                 ge["group_id"]: ge["first_seen__min"]
                 for ge in GroupEnvironment.objects.filter(
                     group_id__in=[item.id for item in item_list],
@@ -591,11 +585,7 @@ class GroupSerializerSnuba(GroupSerializerBase):
                 .values("group_id")
                 .annotate(Min("first_seen"))
             }
-
-            for item_id, value in seen_data.items():
-                first_seen[item_id] = first_seen_data.get(item_id)
-                last_seen[item_id] = value["last_seen"]
-                times_seen[item_id] = value["times_seen"]
+            times_seen = {item_id: value["times_seen"] for item_id, value in seen_data.items()}
 
         attrs = {}
         for item in item_list:

+ 5 - 4
tests/snuba/api/serializers/test_group.py

@@ -304,14 +304,15 @@ class GroupSerializerSnubaTest(APITestCase, SnubaTestCase):
         group_id, = set(e.group.id for e in events)
 
         group = Group.objects.get(id=group_id)
-        group.times_seen = 5
-        group.first_seen = self.week_ago
+        group.times_seen = 3
+        group.first_seen = self.week_ago - timedelta(days=5)
+        group.last_seen = self.week_ago
         group.save()
 
         # should use group columns when no environments arg passed
         result = serialize(group, serializer=GroupSerializerSnuba(environment_ids=[]))
-        assert result["count"] == "5"
-        assert result["lastSeen"] == group.last_seen
+        assert result["count"] == "3"
+        assert iso_format(result["lastSeen"]) == iso_format(self.min_ago)
         assert result["firstSeen"] == group.first_seen
 
         # update this to something different to make sure it's being used