Browse Source

feat(workflow): Fetching first_seen and times_seen from the issue (#21066)

Chris Fuller 4 years ago
parent
commit
da77ab09a0

+ 16 - 11
src/sentry/api/serializers/models/group.py

@@ -787,19 +787,24 @@ class GroupSerializerSnuba(GroupSerializerBase):
         }
         user_counts = {item_id: value["count"] for item_id, value in seen_data.items()}
         last_seen = {item_id: value["last_seen"] for item_id, value in seen_data.items()}
-        times_seen = {item_id: value["times_seen"] for item_id, value in seen_data.items()}
-        if not environment_ids:
+        if start or end or conditions:
             first_seen = {item_id: value["first_seen"] for item_id, value in seen_data.items()}
+            times_seen = {item_id: value["times_seen"] for item_id, value in seen_data.items()}
         else:
-            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],
-                    environment_id__in=environment_ids,
-                )
-                .values("group_id")
-                .annotate(Min("first_seen"))
-            }
+            if environment_ids:
+                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],
+                        environment_id__in=environment_ids,
+                    )
+                    .values("group_id")
+                    .annotate(Min("first_seen"))
+                }
+            else:
+                first_seen = {item.id: item.first_seen for item in item_list}
+            times_seen = {item.id: item.times_seen for item in item_list}
+
         attrs = {}
         for item in item_list:
             attrs[item] = {

+ 13 - 5
tests/snuba/api/endpoints/test_organization_group_index.py

@@ -553,15 +553,22 @@ class GroupListTest(APITestCase, SnubaTestCase):
     def test_seen_stats(self):
         with self.feature("organizations:dynamic-issue-counts"):
             self.store_event(
-                data={"timestamp": iso_format(before_now(seconds=500)), "fingerprint": ["group-1"]},
+                data={
+                    "timestamp": iso_format(before_now(seconds=500)),
+                    "fingerprint": ["group-1"],
+                },
                 project_id=self.project.id,
             )
             before_now_300_seconds = iso_format(before_now(seconds=300))
+            before_now_350_seconds = iso_format(before_now(seconds=350))
             event2 = self.store_event(
                 data={"timestamp": before_now_300_seconds, "fingerprint": ["group-2"]},
                 project_id=self.project.id,
             )
             group2 = event2.group
+            group2.first_seen = before_now_350_seconds
+            group2.times_seen = 55
+            group2.save()
             before_now_250_seconds = iso_format(before_now(seconds=250))
             self.store_event(
                 data={
@@ -600,6 +607,7 @@ class GroupListTest(APITestCase, SnubaTestCase):
 
             self.login_as(user=self.user)
             response = self.get_response(sort_by="date", limit=10, query="server:example.com")
+
             assert response.status_code == 200
             assert len(response.data) == 2
             assert int(response.data[0]["id"]) == group2.id
@@ -609,13 +617,13 @@ class GroupListTest(APITestCase, SnubaTestCase):
             assert response.data[0]["lifetime"]["stats"] is None
             assert response.data[0]["filtered"]["stats"] != response.data[0]["stats"]
 
-            assert response.data[0]["lifetime"]["count"] == "4"
             assert response.data[0]["lifetime"]["firstSeen"] == parse_datetime(
-                before_now_300_seconds
+                before_now_350_seconds  # Should match overridden value, not event value
             ).replace(tzinfo=timezone.utc)
             assert response.data[0]["lifetime"]["lastSeen"] == parse_datetime(
                 before_now_100_seconds
             ).replace(tzinfo=timezone.utc)
+            assert response.data[0]["lifetime"]["count"] == "55"
 
             assert response.data[0]["filtered"]["count"] == "2"
             assert response.data[0]["filtered"]["firstSeen"] == parse_datetime(
@@ -634,9 +642,9 @@ class GroupListTest(APITestCase, SnubaTestCase):
             assert response.data[0]["filtered"] is None
             assert response.data[0]["lifetime"]["stats"] is None
 
-            assert response.data[0]["lifetime"]["count"] == "4"
+            assert response.data[0]["lifetime"]["count"] == "55"
             assert response.data[0]["lifetime"]["firstSeen"] == parse_datetime(
-                before_now_300_seconds
+                before_now_350_seconds  # Should match overridden value, not event value
             ).replace(tzinfo=timezone.utc)
             assert response.data[0]["lifetime"]["lastSeen"] == parse_datetime(
                 before_now_100_seconds

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

@@ -313,7 +313,7 @@ class GroupSerializerSnubaTest(APITestCase, SnubaTestCase):
         result = serialize(group, serializer=GroupSerializerSnuba(environment_ids=[]))
         assert result["count"] == "3"
         assert iso_format(result["lastSeen"]) == iso_format(self.min_ago)
-        assert iso_format(result["firstSeen"]) == iso_format(self.week_ago)
+        assert result["firstSeen"] == group.first_seen
 
         # 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)
@@ -333,8 +333,6 @@ class GroupSerializerSnubaTest(APITestCase, SnubaTestCase):
         assert iso_format(group_env2.first_seen) > iso_format(group_env.first_seen)
         assert result["userCount"] == 3
 
-        # test userCount, count, lastSeen filtering correctly by time
-        # firstSeen should still be from GroupEnvironment
         result = serialize(
             group,
             serializer=GroupSerializerSnuba(
@@ -345,7 +343,7 @@ class GroupSerializerSnubaTest(APITestCase, SnubaTestCase):
         )
         assert result["userCount"] == 1
         assert iso_format(result["lastSeen"]) == iso_format(self.week_ago)
-        assert iso_format(result["firstSeen"]) == iso_format(group_env.first_seen)
+        assert iso_format(result["firstSeen"]) == iso_format(self.week_ago)
         assert result["count"] == "1"