Skip to content

Commit 72edd6e

Browse files
authored
feat(mep): Introduce p100 to the metric query builder (#32570)
- This introduces "p100" which is the same as doing a max to the metric query builder
1 parent 6b20631 commit 72edd6e

File tree

2 files changed

+71
-0
lines changed

2 files changed

+71
-0
lines changed

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,22 @@ def function_converter(self) -> Mapping[str, fields.MetricsFunction]:
112112
),
113113
default_result_type="duration",
114114
),
115+
fields.MetricsFunction(
116+
"p100",
117+
optional_args=[
118+
fields.with_default("transaction.duration", fields.FunctionArg("column")),
119+
],
120+
calculated_args=[resolve_metric_id],
121+
snql_distribution=lambda args, alias: Function(
122+
"maxIf",
123+
[
124+
Column("value"),
125+
Function("equals", [Column("metric_id"), args["metric_id"]]),
126+
],
127+
alias,
128+
),
129+
default_result_type="duration",
130+
),
115131
fields.MetricsFunction(
116132
"count_unique",
117133
required_args=[fields.FunctionArg("column")],

tests/sentry/search/events/test_builder.py

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -717,6 +717,46 @@ def test_simple_aggregates(self):
717717
],
718718
)
719719

720+
def test_p100(self):
721+
"""While p100 isn't an actual quantile in the distributions table, its equivalent to max"""
722+
query = MetricsQueryBuilder(
723+
self.params,
724+
"",
725+
selected_columns=[
726+
"p100(transaction.duration)",
727+
],
728+
)
729+
self.assertCountEqual(
730+
query.where,
731+
[
732+
*self.default_conditions,
733+
*_metric_conditions(
734+
[
735+
"transaction.duration",
736+
]
737+
),
738+
],
739+
)
740+
self.assertCountEqual(
741+
query.distributions,
742+
[
743+
Function(
744+
"maxIf",
745+
[
746+
Column("value"),
747+
Function(
748+
"equals",
749+
[
750+
Column("metric_id"),
751+
indexer.resolve(constants.METRICS_MAP["transaction.duration"]),
752+
],
753+
),
754+
],
755+
"p100_transaction_duration",
756+
)
757+
],
758+
)
759+
720760
def test_grouping(self):
721761
query = MetricsQueryBuilder(
722762
self.params,
@@ -873,25 +913,40 @@ def test_run_query(self):
873913
tags={"transaction": "foo_transaction"},
874914
timestamp=self.start + datetime.timedelta(minutes=5),
875915
)
916+
self.store_metric(
917+
100,
918+
metric="measurements.lcp",
919+
tags={"transaction": "foo_transaction"},
920+
timestamp=self.start + datetime.timedelta(minutes=5),
921+
)
922+
self.store_metric(
923+
1000,
924+
metric="measurements.lcp",
925+
tags={"transaction": "foo_transaction"},
926+
timestamp=self.start + datetime.timedelta(minutes=5),
927+
)
876928
query = MetricsQueryBuilder(
877929
self.params,
878930
f"project:{self.project.slug}",
879931
selected_columns=[
880932
"transaction",
881933
"p95(transaction.duration)",
934+
"p100(measurements.lcp)",
882935
],
883936
)
884937
result = query.run_query("test_query")
885938
assert len(result["data"]) == 1
886939
assert result["data"][0] == {
887940
"transaction": indexer.resolve("foo_transaction"),
888941
"p95_transaction_duration": 100,
942+
"p100_measurements_lcp": 1000,
889943
}
890944
self.assertCountEqual(
891945
result["meta"],
892946
[
893947
{"name": "transaction", "type": "UInt64"},
894948
{"name": "p95_transaction_duration", "type": "Float64"},
949+
{"name": "p100_measurements_lcp", "type": "Float64"},
895950
],
896951
)
897952

0 commit comments

Comments
 (0)