Browse Source

chore(performance-tracing-w/o-performance): Set flag to true by default. (#60633)

This PR addresses the issue: [Custom Capture
exception](https://sentry.sentry.io/issues/4556534885/?alert_rule_id=13882978&alert_type=issue&notification_uuid=8299b880-f5d0-4bb2-ad23-01f94178820a&project=11276&referrer=slack)

The frontend expects the `/events-trace/` to return
`{transactions:[...], orphan_errors:[...]}` but it returns
`[...transactions]`. This must be impacting ST/SH only since the flag is
set to 100% GA.

I have a reminder to get rid of the flag.

---------

Co-authored-by: Abdullah Khan <abdullahkhan@PG9Y57YDXQ.local>
Abdkhan14 1 year ago
parent
commit
16c15e139d

+ 1 - 1
src/sentry/conf/server.py

@@ -1723,7 +1723,7 @@ SENTRY_FEATURES: dict[str, bool | None] = {
     # Enable MN+1 DB performance issue type
     "organizations:performance-issues-m-n-plus-one-db-detector": False,
     # Enable FE/BE for tracing without performance
-    "organizations:performance-tracing-without-performance": False,
+    "organizations:performance-tracing-without-performance": True,
     # Enable database view powered by span metrics
     "organizations:performance-database-view": False,
     # Enable database view percentile graphs

+ 1 - 0
tests/sentry/api/serializers/test_organization.py

@@ -86,6 +86,7 @@ class OrganizationSerializerTest(TestCase):
             "integrations-issue-sync",
             "integrations-stacktrace-link",
             "integrations-ticket-rules",
+            "performance-tracing-without-performance",
             "invite-members",
             "invite-members-rate-limits",
             "minute-resolution-sessions",

+ 57 - 53
tests/snuba/api/endpoints/test_organization_events_trace.py

@@ -322,9 +322,9 @@ class OrganizationEventsTraceLightEndpointTest(OrganizationEventsTraceEndpointBa
             )
 
         assert response.status_code == 200, response.content
-        assert len(response.data) == 1
+        assert len(response.data["transactions"]) == 1
 
-        event = response.data[0]
+        event = response.data["transactions"][0]
         # Basically know nothing about this event
         assert event["generation"] is None
         assert event["parent_event_id"] is None
@@ -348,9 +348,9 @@ class OrganizationEventsTraceLightEndpointTest(OrganizationEventsTraceEndpointBa
             )
 
         assert response.status_code == 200, response.content
-        assert len(response.data) == 1
+        assert len(response.data["transactions"]) == 1
 
-        event = response.data[0]
+        event = response.data["transactions"][0]
         assert event["generation"] == 0
         assert event["parent_event_id"] is None
         assert event["parent_span_id"] is None
@@ -366,8 +366,8 @@ class OrganizationEventsTraceLightEndpointTest(OrganizationEventsTraceEndpointBa
             )
 
         assert response.status_code == 200, response.content
-        assert len(response.data) == 4
-        events = {item["event_id"]: item for item in response.data}
+        assert len(response.data["transactions"]) == 4
+        events = {item["event_id"]: item for item in response.data["transactions"]}
 
         assert root_event_id in events
         event = events[root_event_id]
@@ -402,8 +402,8 @@ class OrganizationEventsTraceLightEndpointTest(OrganizationEventsTraceEndpointBa
 
         assert response.status_code == 200, response.content
 
-        assert len(response.data) == 4
-        events = {item["event_id"]: item for item in response.data}
+        assert len(response.data["transactions"]) == 4
+        events = {item["event_id"]: item for item in response.data["transactions"]}
 
         assert root_event_id in events
         event = events[root_event_id]
@@ -434,8 +434,8 @@ class OrganizationEventsTraceLightEndpointTest(OrganizationEventsTraceEndpointBa
 
         assert response.status_code == 200, response.content
 
-        assert len(response.data) == 3
-        events = {item["event_id"]: item for item in response.data}
+        assert len(response.data["transactions"]) == 3
+        events = {item["event_id"]: item for item in response.data["transactions"]}
 
         assert root_event_id in events
         event = events[root_event_id]
@@ -477,8 +477,8 @@ class OrganizationEventsTraceLightEndpointTest(OrganizationEventsTraceEndpointBa
 
         assert response.status_code == 200, response.content
 
-        assert len(response.data) == 3
-        events = {item["event_id"]: item for item in response.data}
+        assert len(response.data["transactions"]) == 3
+        events = {item["event_id"]: item for item in response.data["transactions"]}
 
         assert root_event_id in events
         event = events[root_event_id]
@@ -512,8 +512,8 @@ class OrganizationEventsTraceLightEndpointTest(OrganizationEventsTraceEndpointBa
 
         assert response.status_code == 200, response.content
 
-        assert len(response.data) == 2
-        events = {item["event_id"]: item for item in response.data}
+        assert len(response.data["transactions"]) == 2
+        events = {item["event_id"]: item for item in response.data["transactions"]}
 
         assert current_event in events
         event = events[current_event]
@@ -542,9 +542,9 @@ class OrganizationEventsTraceLightEndpointTest(OrganizationEventsTraceEndpointBa
 
         assert response.status_code == 200, response.content
 
-        assert len(response.data) == 1
+        assert len(response.data["transactions"]) == 1
 
-        event = response.data[0]
+        event = response.data["transactions"][0]
         assert event["generation"] is None
         # Parent is unknown in this case
         assert event["parent_event_id"] is None
@@ -582,8 +582,8 @@ class OrganizationEventsTraceLightEndpointTest(OrganizationEventsTraceEndpointBa
                 format="json",
             )
 
-        assert len(response.data) == 3
-        events = {item["event_id"]: item for item in response.data}
+        assert len(response.data["transactions"]) == 3
+        events = {item["event_id"]: item for item in response.data["transactions"]}
 
         for child_event_id in gen3_event_siblings:
             assert child_event_id in events
@@ -612,8 +612,8 @@ class OrganizationEventsTraceLightEndpointTest(OrganizationEventsTraceEndpointBa
 
         def assertions(response):
             assert response.status_code == 200, response.content
-            assert len(response.data) == 3
-            events = {item["event_id"]: item for item in response.data}
+            assert len(response.data["transactions"]) == 3
+            events = {item["event_id"]: item for item in response.data["transactions"]}
 
             assert root_event_id in events
             event = events[root_event_id]
@@ -822,11 +822,12 @@ class OrganizationEventsTraceEndpointTest(OrganizationEventsTraceEndpointBase):
                 format="json",
             )
         assert response.status_code == 200, response.content
-        self.assert_trace_data(response.data[0])
+        trace_transaction = response.data["transactions"][0]
+        self.assert_trace_data(trace_transaction)
         # We shouldn't have detailed fields here
-        assert "transaction.status" not in response.data[0]
-        assert "tags" not in response.data[0]
-        assert "measurements" not in response.data[0]
+        assert "transaction.status" not in trace_transaction
+        assert "tags" not in trace_transaction
+        assert "measurements" not in trace_transaction
 
     def test_simple_with_limit(self):
         self.load_trace()
@@ -837,11 +838,12 @@ class OrganizationEventsTraceEndpointTest(OrganizationEventsTraceEndpointBase):
                 format="json",
             )
         assert response.status_code == 200, response.content
-        self.assert_trace_data(response.data[0])
+        trace_transaction = response.data["transactions"][0]
+        self.assert_trace_data(trace_transaction)
         # We shouldn't have detailed fields here
-        assert "transaction.status" not in response.data[0]
-        assert "tags" not in response.data[0]
-        assert "measurements" not in response.data[0]
+        assert "transaction.status" not in trace_transaction
+        assert "tags" not in trace_transaction
+        assert "measurements" not in trace_transaction
 
     def test_detailed_trace(self):
         self.load_trace()
@@ -852,8 +854,9 @@ class OrganizationEventsTraceEndpointTest(OrganizationEventsTraceEndpointBase):
                 format="json",
             )
         assert response.status_code == 200, response.content
-        self.assert_trace_data(response.data[0])
-        root = response.data[0]
+        trace_transaction = response.data["transactions"][0]
+        self.assert_trace_data(trace_transaction)
+        root = trace_transaction
         assert root["transaction.status"] == "ok"
         root_tags = {tag["key"]: tag["value"] for tag in root["tags"]}
         for [key, value] in self.root_event.tags:
@@ -863,10 +866,10 @@ class OrganizationEventsTraceEndpointTest(OrganizationEventsTraceEndpointBase):
                 assert root_tags[key[7:]] == value, f"tags - {key}"
         assert root["measurements"]["lcp"]["value"] == 1000
         assert root["measurements"]["fcp"]["value"] == 750
-        assert "issue_short_id" in response.data[0]["performance_issues"][0]
-        assert response.data[0]["performance_issues"][0]["culprit"] == "root"
+        assert "issue_short_id" in trace_transaction["performance_issues"][0]
+        assert trace_transaction["performance_issues"][0]["culprit"] == "root"
         assert (
-            response.data[0]["performance_issues"][0]["type"]
+            trace_transaction["performance_issues"][0]["type"]
             == PerformanceFileIOMainThreadGroupType.type_id
         )
 
@@ -897,7 +900,7 @@ class OrganizationEventsTraceEndpointTest(OrganizationEventsTraceEndpointBase):
             )
 
         assert response.status_code == 200, response.content
-        root = response.data[0]
+        root = response.data["transactions"][0]
         assert root["transaction.status"] == "ok"
         assert {"key": None, "value": None} in root["tags"]
 
@@ -938,9 +941,10 @@ class OrganizationEventsTraceEndpointTest(OrganizationEventsTraceEndpointBase):
 
         assert response.status_code == 200, response.content
         # Should be the same as the simple testcase
-        self.assert_trace_data(response.data[0], gen2_no_children=False)
+        trace_transaction = response.data["transactions"][0]
+        self.assert_trace_data(trace_transaction, gen2_no_children=False)
         # The difference is that gen3-1 should exist with no children
-        gen2_1 = response.data[0]["children"][1]["children"][0]
+        gen2_1 = trace_transaction["children"][1]["children"][0]
         assert len(gen2_1["children"]) == 1
         gen3_1 = gen2_1["children"][0]
         assert gen3_1["event_id"] == gen3_loop_event.event_id
@@ -992,10 +996,10 @@ class OrganizationEventsTraceEndpointTest(OrganizationEventsTraceEndpointBase):
 
         assert response.status_code == 200, response.content
 
-        assert len(response.data) == 1
+        assert len(response.data["transactions"]) == 1
         # There really isn't a right answer to which orphan is the "root" since this loops, but the current
         # implementation will make the older event the root
-        root = response.data[0]
+        root = response.data["transactions"][0]
         self.assert_event(root, root_event, "root")
         assert len(root["children"]) == 1
         child = root["children"][0]
@@ -1031,9 +1035,9 @@ class OrganizationEventsTraceEndpointTest(OrganizationEventsTraceEndpointBase):
             )
 
         assert response.status_code == 200, response.content
-        assert len(response.data) == 2
-        self.assert_event(response.data[0], first_root, "first_root")
-        self.assert_event(response.data[1], second_root, "second_root")
+        assert len(response.data["transactions"]) == 2
+        self.assert_event(response.data["transactions"][0], first_root, "first_root")
+        self.assert_event(response.data["transactions"][1], second_root, "second_root")
 
     def test_sibling_transactions(self):
         """More than one transaction can share a parent_span_id"""
@@ -1066,8 +1070,8 @@ class OrganizationEventsTraceEndpointTest(OrganizationEventsTraceEndpointBase):
 
         assert response.status_code == 200, response.content
         # Should be the same as the simple testcase, but skip checking gen2 children
-        self.assert_trace_data(response.data[0], gen2_no_children=False)
-        gen2_parent = response.data[0]["children"][1]["children"][0]
+        self.assert_trace_data(response.data["transactions"][0], gen2_no_children=False)
+        gen2_parent = response.data["transactions"][0]["children"][1]["children"][0]
         assert len(gen2_parent["children"]) == 2
         assert [child["event_id"] for child in gen2_parent["children"]] == gen3_event_siblings
 
@@ -1102,9 +1106,9 @@ class OrganizationEventsTraceEndpointTest(OrganizationEventsTraceEndpointBase):
 
         assert response.status_code == 200, response.content
 
-        assert len(response.data) == 3
+        assert len(response.data["transactions"]) == 3
         # The first item of the response should be the main trace
-        main, *orphans = response.data
+        main, *orphans = response.data["transactions"]
         self.assert_trace_data(main)
         assert [root_event.event_id, root_sibling_event.event_id] == [
             orphan["event_id"] for orphan in orphans
@@ -1180,9 +1184,9 @@ class OrganizationEventsTraceEndpointTest(OrganizationEventsTraceEndpointBase):
             )
 
         assert response.status_code == 200, response.content
-        assert len(response.data) == 2
+        assert len(response.data["transactions"]) == 2
         # The first item of the response should be the main trace
-        main, orphans = response.data
+        main, orphans = response.data["transactions"]
         self.assert_trace_data(main)
         self.assert_event(orphans, root_event, "orphan-root")
         assert len(orphans["children"]) == 1
@@ -1210,8 +1214,8 @@ class OrganizationEventsTraceEndpointTest(OrganizationEventsTraceEndpointBase):
             )
 
         assert response.status_code == 200, response.content
-        self.assert_trace_data(response.data[0])
-        gen1_event = response.data[0]["children"][0]
+        self.assert_trace_data(response.data["transactions"][0])
+        gen1_event = response.data["transactions"][0]["children"][0]
         assert len(gen1_event["errors"]) == 2
         assert {
             "event_id": error.event_id,
@@ -1422,8 +1426,8 @@ class OrganizationEventsTraceEndpointTest(OrganizationEventsTraceEndpointBase):
             )
 
         assert response.status_code == 200, response.content
-        self.assert_trace_data(response.data[0])
-        root_event = response.data[0]
+        self.assert_trace_data(response.data["transactions"][0])
+        root_event = response.data["transactions"][0]
         assert len(root_event["errors"]) == 1
         assert {
             "event_id": default_event.event_id,
@@ -1448,7 +1452,7 @@ class OrganizationEventsTraceEndpointTest(OrganizationEventsTraceEndpointBase):
                 format="json",
             )
         assert response.status_code == 200, response.content
-        self.assert_trace_data(response.data[0])
+        self.assert_trace_data(response.data["transactions"][0])
 
     def test_pruning_event(self):
         self.load_trace()
@@ -1459,7 +1463,7 @@ class OrganizationEventsTraceEndpointTest(OrganizationEventsTraceEndpointBase):
                 format="json",
             )
         assert response.status_code == 200, response.content
-        root = response.data[0]
+        root = response.data["transactions"][0]
 
         self.assert_event(root, self.root_event, "root")