Skip to content

Commit 4420324

Browse files
authored
feat(discover): add cache_miss_rate function to discover (#69617)
Adds the cache_miss_rate function to discover
1 parent 1920bee commit 4420324

File tree

2 files changed

+74
-0
lines changed

2 files changed

+74
-0
lines changed

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

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -388,6 +388,15 @@ def function_converter(self) -> Mapping[str, fields.MetricsFunction]:
388388
),
389389
default_result_type="percentage",
390390
),
391+
fields.MetricsFunction(
392+
"cache_miss_rate",
393+
snql_distribution=lambda args, alias: function_aliases.resolve_division(
394+
self._resolve_cache_miss_count(args),
395+
self._resolve_cache_hit_and_miss_count(args),
396+
alias,
397+
),
398+
default_result_type="percentage",
399+
),
391400
# TODO: Deprecated, use `http_response_rate(5)` instead
392401
fields.MetricsFunction(
393402
"http_error_rate",
@@ -741,6 +750,30 @@ def _resolve_cache_hit_count(
741750
alias,
742751
)
743752

753+
def _resolve_cache_miss_count(
754+
self,
755+
_: Mapping[str, str | Column | SelectType | int | float],
756+
alias: str | None = None,
757+
) -> SelectType:
758+
759+
return self._resolve_count_if(
760+
Function(
761+
"equals",
762+
[
763+
Column("metric_id"),
764+
self.resolve_metric("span.self_time"),
765+
],
766+
),
767+
Function(
768+
"equals",
769+
[
770+
self.builder.column("cache.hit"),
771+
self.builder.resolve_tag_value("false"),
772+
],
773+
),
774+
alias,
775+
)
776+
744777
def _resolve_cache_hit_and_miss_count(
745778
self,
746779
_: Mapping[str, str | Column | SelectType | int | float],

tests/snuba/api/endpoints/test_organization_events_span_metrics.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1060,6 +1060,47 @@ def test_cache_hit_rate(self):
10601060
assert meta["dataset"] == "spansMetrics"
10611061
assert meta["fields"]["cache_hit_rate()"] == "percentage"
10621062

1063+
def test_cache_miss_rate(self):
1064+
self.store_span_metric(
1065+
1,
1066+
internal_metric=constants.SELF_TIME_LIGHT,
1067+
timestamp=self.min_ago,
1068+
tags={"cache.hit": "true"},
1069+
)
1070+
self.store_span_metric(
1071+
1,
1072+
internal_metric=constants.SELF_TIME_LIGHT,
1073+
timestamp=self.min_ago,
1074+
tags={"cache.hit": "false"},
1075+
)
1076+
self.store_span_metric(
1077+
1,
1078+
internal_metric=constants.SELF_TIME_LIGHT,
1079+
timestamp=self.min_ago,
1080+
tags={"cache.hit": "false"},
1081+
)
1082+
self.store_span_metric(
1083+
1,
1084+
internal_metric=constants.SELF_TIME_LIGHT,
1085+
timestamp=self.min_ago,
1086+
tags={"cache.hit": "false"},
1087+
)
1088+
response = self.do_request(
1089+
{
1090+
"field": ["cache_miss_rate()"],
1091+
"query": "",
1092+
"project": self.project.id,
1093+
"dataset": "spansMetrics",
1094+
}
1095+
)
1096+
assert response.status_code == 200, response.content
1097+
data = response.data["data"]
1098+
meta = response.data["meta"]
1099+
assert len(data) == 1
1100+
assert data[0]["cache_miss_rate()"] == 0.75
1101+
assert meta["dataset"] == "spansMetrics"
1102+
assert meta["fields"]["cache_miss_rate()"] == "percentage"
1103+
10631104
def test_http_response_rate(self):
10641105
self.store_span_metric(
10651106
1,

0 commit comments

Comments
 (0)