Skip to content

Commit ccc86db

Browse files
feat(discover): Support sum function while querying metrics in discover (#35576)
Adds support to sum() support to metrics queries in discover
1 parent 1870fd1 commit ccc86db

File tree

3 files changed

+73
-0
lines changed

3 files changed

+73
-0
lines changed

src/sentry/search/events/datasets/metrics.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,21 @@ def function_converter(self) -> Mapping[str, fields.MetricsFunction]:
238238
alias,
239239
),
240240
),
241+
fields.MetricsFunction(
242+
"sum",
243+
required_args=[
244+
fields.MetricArg("column"),
245+
],
246+
calculated_args=[resolve_metric_id],
247+
snql_distribution=lambda args, alias: Function(
248+
"sumIf",
249+
[
250+
Column("value"),
251+
Function("equals", [Column("metric_id"), args["metric_id"]]),
252+
],
253+
alias,
254+
),
255+
),
241256
fields.MetricsFunction(
242257
"percentile",
243258
required_args=[

tests/snuba/api/endpoints/test_organization_events_stats.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1152,6 +1152,26 @@ def test_explicit_not_mep(self):
11521152
assert response.status_code == 200, response.content
11531153
return not response.data["isMetricsData"]
11541154

1155+
def test_sum_transaction_duration(self):
1156+
self.store_metric(123, timestamp=self.day_ago + timedelta(minutes=30))
1157+
self.store_metric(456, timestamp=self.day_ago + timedelta(hours=1, minutes=30))
1158+
self.store_metric(789, timestamp=self.day_ago + timedelta(hours=1, minutes=30))
1159+
response = self.do_request(
1160+
data={
1161+
"start": iso_format(self.day_ago),
1162+
"end": iso_format(self.day_ago + timedelta(hours=2)),
1163+
"interval": "1h",
1164+
"yAxis": "sum(transaction.duration)",
1165+
"metricsEnhanced": "1",
1166+
},
1167+
)
1168+
assert response.status_code == 200, response.content
1169+
assert response.data["isMetricsData"]
1170+
assert [attrs for time, attrs in response.data["data"]] == [
1171+
[{"count": 123}],
1172+
[{"count": 1245}],
1173+
]
1174+
11551175

11561176
class OrganizationEventsStatsTopNEvents(APITestCase, SnubaTestCase):
11571177
def setUp(self):

tests/snuba/api/endpoints/test_organization_events_v2.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11961,3 +11961,41 @@ def test_count_unique_user_returns_zero(self):
1196111961
assert data[1]["transaction"] == "bar_transaction"
1196211962
assert data[1]["count_unique(user)"] == 0
1196311963
assert meta["isMetricsData"]
11964+
11965+
def test_sum_transaction_duration(self):
11966+
self.store_metric(
11967+
50,
11968+
tags={"transaction": "foo_transaction"},
11969+
timestamp=self.min_ago,
11970+
)
11971+
self.store_metric(
11972+
100,
11973+
tags={"transaction": "foo_transaction"},
11974+
timestamp=self.min_ago,
11975+
)
11976+
self.store_metric(
11977+
150,
11978+
tags={"transaction": "foo_transaction"},
11979+
timestamp=self.min_ago,
11980+
)
11981+
11982+
query = {
11983+
"project": [self.project.id],
11984+
"orderby": "sum(transaction.duration)",
11985+
"field": [
11986+
"transaction",
11987+
"sum(transaction.duration)",
11988+
],
11989+
"dataset": "metricsEnhanced",
11990+
"per_page": 50,
11991+
}
11992+
11993+
response = self.do_request(query)
11994+
assert response.status_code == 200, response.content
11995+
assert len(response.data["data"]) == 1
11996+
data = response.data["data"]
11997+
meta = response.data["meta"]
11998+
11999+
assert data[0]["transaction"] == "foo_transaction"
12000+
assert data[0]["sum(transaction.duration)"] == 300
12001+
assert meta["isMetricsData"]

0 commit comments

Comments
 (0)