Skip to content

Commit 54a56f5

Browse files
committed
feat(trace-explorer): Supports metrics min/max
Metrics allow selecting a region on the graph to bound the date selection as well as min/max. Date selection can be supported via the existing params but this adds a metricsMin and metricsMax param to support the metrics bounds.
1 parent 75e0860 commit 54a56f5

File tree

2 files changed

+33
-0
lines changed

2 files changed

+33
-0
lines changed

src/sentry/api/endpoints/organization_traces.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from datetime import datetime, timedelta
77
from typing import Any, Literal, NotRequired, TypedDict, cast
88

9+
import sentry_sdk
910
from rest_framework import serializers
1011
from rest_framework.exceptions import ParseError
1112
from rest_framework.request import Request
@@ -66,6 +67,8 @@ class OrganizationTracesSerializer(serializers.Serializer):
6667
)
6768
field = serializers.ListField(required=True, allow_empty=False, child=serializers.CharField())
6869
sort = serializers.ListField(required=False, allow_empty=True, child=serializers.CharField())
70+
metricsMax = serializers.FloatField(required=False)
71+
metricsMin = serializers.FloatField(required=False)
6972
metricsQuery = serializers.CharField(required=False)
7073
mri = serializers.CharField(required=False)
7174
query = serializers.ListField(
@@ -107,6 +110,8 @@ def get(self, request: Request, organization: Organization) -> Response:
107110
# Filter out empty queries as they do not do anything to change the results.
108111
user_queries=[query.strip() for query in serialized.get("query", []) if query.strip()],
109112
suggested_query=serialized.get("suggestedQuery", ""),
113+
metrics_max=serialized.get("metricsMax"),
114+
metrics_min=serialized.get("metricsMin"),
110115
metrics_query=serialized.get("metricsQuery", ""),
111116
mri=serialized.get("mri"),
112117
sort=serialized.get("sort"),
@@ -148,6 +153,8 @@ def __init__(
148153
fields: list[str],
149154
user_queries: list[str],
150155
suggested_query: str,
156+
metrics_max: float | None,
157+
metrics_min: float | None,
151158
metrics_query: str,
152159
mri: str | None,
153160
sort: str | None,
@@ -163,6 +170,8 @@ def __init__(
163170
self.fields = fields
164171
self.user_queries = user_queries
165172
self.suggested_query = suggested_query
173+
self.metrics_max = metrics_max
174+
self.metrics_min = metrics_min
166175
self.metrics_query = metrics_query
167176
self.mri = mri
168177
self.sort = sort
@@ -326,6 +335,8 @@ def get_traces_matching_metric_conditions(
326335
params=params,
327336
snuba_params=snuba_params,
328337
fields=["trace"],
338+
max=self.metrics_max,
339+
min=self.metrics_min,
329340
query=self.metrics_query,
330341
referrer=Referrer.API_TRACE_EXPLORER_METRICS_SPANS_LIST,
331342
)
@@ -674,6 +685,23 @@ def process_final_results(
674685
for row in suggested_spans_results["data"]:
675686
traces_suggested_spans[row["trace"]].append(row)
676687

688+
for row in traces_metas_results["data"]:
689+
if not traces_user_spans[row["trace"]]:
690+
context = {
691+
"trace": row["trace"],
692+
"start": row["first_seen()"],
693+
"end": row["last_seen()"],
694+
"params": self.params,
695+
"user_query": self.user_queries,
696+
"mri": self.mri,
697+
"metrics_query": self.metrics_query,
698+
"metrics_min": self.metrics_min,
699+
"metrics_max": self.metrics_max,
700+
}
701+
sentry_sdk.capture_message(
702+
"trace missing spans", contexts={"trace_missing_spans": context}
703+
)
704+
677705
return [
678706
{
679707
"trace": row["trace"],
@@ -696,6 +724,7 @@ def process_final_results(
696724
],
697725
}
698726
for row in traces_metas_results["data"]
727+
if traces_user_spans[row["trace"]]
699728
]
700729

701730
def process_meta_results(self, results):
@@ -1120,6 +1149,7 @@ def stack_clear(trace, until=None):
11201149
precise_end,
11211150
traces_range[trace],
11221151
)
1152+
11231153
row["precise.start_ts"] = precise_start
11241154
row["precise.finish_ts"] = precise_end
11251155
row["quantized.start_ts"] = quantized_start

tests/sentry/api/endpoints/test_organization_traces.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,7 @@ def create_mock_traces(self):
194194
timestamp=timestamps[-1],
195195
transaction="qux",
196196
duration=40_000,
197+
exclusive_time=40_000,
197198
tags={"foo": "qux"},
198199
measurements={
199200
measurement: 40_000
@@ -716,6 +717,8 @@ def test_matching_tag_metrics(self):
716717
query = {
717718
"mri": mri,
718719
"metricsQuery": ["foo:qux"],
720+
"metricsMin": 30_000,
721+
"metricsMax": 50_000,
719722
"project": [project_1.id],
720723
"field": ["id", "parent_span", "span.duration"],
721724
"suggestedQuery": ["foo:qux"],

0 commit comments

Comments
 (0)