Browse Source

fix(metrics): Pass metric op to trace query (#70968)

Depending on the op, the condition needed for the min/max condition
changes.
Tony Xiao 10 months ago
parent
commit
1a913b7255

+ 7 - 2
src/sentry/api/endpoints/organization_traces.py

@@ -69,6 +69,7 @@ class OrganizationTracesSerializer(serializers.Serializer):
     sort = serializers.ListField(required=False, allow_empty=True, child=serializers.CharField())
     metricsMax = serializers.FloatField(required=False)
     metricsMin = serializers.FloatField(required=False)
+    metricsOp = serializers.CharField(required=False)
     metricsQuery = serializers.CharField(required=False)
     mri = serializers.CharField(required=False)
     query = serializers.ListField(
@@ -112,7 +113,8 @@ class OrganizationTracesEndpoint(OrganizationEventsV2EndpointBase):
             suggested_query=serialized.get("suggestedQuery", ""),
             metrics_max=serialized.get("metricsMax"),
             metrics_min=serialized.get("metricsMin"),
-            metrics_query=serialized.get("metricsQuery", ""),
+            metrics_operation=serialized.get("metricsOp"),
+            metrics_query=serialized.get("metricsQuery"),
             mri=serialized.get("mri"),
             sort=serialized.get("sort"),
             limit=self.get_per_page(request),
@@ -155,7 +157,8 @@ class TraceSamplesExecutor:
         suggested_query: str,
         metrics_max: float | None,
         metrics_min: float | None,
-        metrics_query: str,
+        metrics_operation: str | None,
+        metrics_query: str | None,
         mri: str | None,
         sort: str | None,
         limit: int,
@@ -172,6 +175,7 @@ class TraceSamplesExecutor:
         self.suggested_query = suggested_query
         self.metrics_max = metrics_max
         self.metrics_min = metrics_min
+        self.metrics_operation = metrics_operation
         self.metrics_query = metrics_query
         self.mri = mri
         self.sort = sort
@@ -337,6 +341,7 @@ class TraceSamplesExecutor:
             fields=["trace"],
             max=self.metrics_max,
             min=self.metrics_min,
+            operation=self.metrics_operation,
             query=self.metrics_query,
             referrer=Referrer.API_TRACE_EXPLORER_METRICS_SPANS_LIST,
         )

+ 14 - 13
tests/sentry/api/endpoints/test_organization_traces.py

@@ -700,25 +700,26 @@ class OrganizationTracesEndpointTest(BaseSpansTestCase, APITestCase):
             span_ids,
         ) = self.create_mock_traces()
 
-        for mri in [
-            TransactionMRI.DURATION.value,
-            "d:transactions/measurements.lcp@millisecond",
-            SpanMRI.DURATION.value,
-            SpanMRI.SELF_TIME.value,
-            "d:spans/webvital.score.total@ratio",
-            "d:spans/webvital.score.inp@ratio",
-            "d:spans/webvital.score.weight.inp@ratio",
-            "d:spans/http.response_content_length@byte",
-            "d:spans/http.decoded_response_content_length@byte",
-            "d:spans/http.response_transfer_size@byte",
-            "d:custom/value@millisecond",
+        for (mri, op) in [
+            (TransactionMRI.DURATION.value, "count"),
+            ("d:transactions/measurements.lcp@millisecond", "max"),
+            (SpanMRI.DURATION.value, "min"),
+            (SpanMRI.SELF_TIME.value, "avg"),
+            ("d:spans/webvital.score.total@ratio", "count"),
+            ("d:spans/webvital.score.inp@ratio", "max"),
+            ("d:spans/webvital.score.weight.inp@ratio", "min"),
+            ("d:spans/http.response_content_length@byte", "avg"),
+            ("d:spans/http.decoded_response_content_length@byte", "count"),
+            ("d:spans/http.response_transfer_size@byte", "max"),
+            ("d:custom/value@millisecond", "min"),
         ]:
             for user_query in ["foo:qux", None]:
                 query = {
                     "mri": mri,
-                    "metricsQuery": ["foo:qux"],
                     "metricsMin": 30_000,
                     "metricsMax": 50_000,
+                    "metricsOp": op,
+                    "metricsQuery": ["foo:qux"],
                     "project": [project_1.id],
                     "field": ["id", "parent_span", "span.duration"],
                     "suggestedQuery": ["foo:qux"],