|
@@ -356,6 +356,15 @@ class SpansMetricsDatasetConfig(DatasetConfig):
|
|
|
),
|
|
|
default_result_type="percentage",
|
|
|
),
|
|
|
+ fields.MetricsFunction(
|
|
|
+ "cache_hit_rate",
|
|
|
+ snql_distribution=lambda args, alias: function_aliases.resolve_division(
|
|
|
+ self._resolve_cache_hit_count(args),
|
|
|
+ self._resolve_cache_hit_and_miss_count(args),
|
|
|
+ alias,
|
|
|
+ ),
|
|
|
+ default_result_type="percentage",
|
|
|
+ ),
|
|
|
# TODO: Deprecated, use `http_response_rate(5)` instead
|
|
|
fields.MetricsFunction(
|
|
|
"http_error_rate",
|
|
@@ -685,6 +694,56 @@ class SpansMetricsDatasetConfig(DatasetConfig):
|
|
|
alias,
|
|
|
)
|
|
|
|
|
|
+ def _resolve_cache_hit_count(
|
|
|
+ self,
|
|
|
+ _: Mapping[str, str | Column | SelectType | int | float],
|
|
|
+ alias: str | None = None,
|
|
|
+ ) -> SelectType:
|
|
|
+
|
|
|
+ return self._resolve_count_if(
|
|
|
+ Function(
|
|
|
+ "equals",
|
|
|
+ [
|
|
|
+ Column("metric_id"),
|
|
|
+ self.resolve_metric("span.self_time"),
|
|
|
+ ],
|
|
|
+ ),
|
|
|
+ Function(
|
|
|
+ "equals",
|
|
|
+ [
|
|
|
+ self.builder.column("cache.hit"),
|
|
|
+ self.builder.resolve_tag_value("true"),
|
|
|
+ ],
|
|
|
+ ),
|
|
|
+ alias,
|
|
|
+ )
|
|
|
+
|
|
|
+ def _resolve_cache_hit_and_miss_count(
|
|
|
+ self,
|
|
|
+ _: Mapping[str, str | Column | SelectType | int | float],
|
|
|
+ alias: str | None = None,
|
|
|
+ ) -> SelectType:
|
|
|
+
|
|
|
+ statuses = [self.builder.resolve_tag_value(status) for status in constants.CACHE_HIT_STATUS]
|
|
|
+
|
|
|
+ return self._resolve_count_if(
|
|
|
+ Function(
|
|
|
+ "equals",
|
|
|
+ [
|
|
|
+ Column("metric_id"),
|
|
|
+ self.resolve_metric("span.self_time"),
|
|
|
+ ],
|
|
|
+ ),
|
|
|
+ Function(
|
|
|
+ "in",
|
|
|
+ [
|
|
|
+ self.builder.column("cache.hit"),
|
|
|
+ list(status for status in statuses if status is not None),
|
|
|
+ ],
|
|
|
+ ),
|
|
|
+ alias,
|
|
|
+ )
|
|
|
+
|
|
|
def _resolve_http_response_count(
|
|
|
self,
|
|
|
args: Mapping[str, str | Column | SelectType | int | float],
|