From ba5d4bc5636d513950c1f5062fc38381d92568bd Mon Sep 17 00:00:00 2001 From: Joris Bayer Date: Fri, 13 Dec 2024 09:52:41 +0100 Subject: [PATCH] ref(metrics): Remove metrics summaries (#82073) Remove all mentions of metrics summaries from backend code. --- src/sentry/api/serializers/models/event.py | 5 - src/sentry/options/defaults.py | 5 - src/sentry/relay/globalconfig.py | 1 - .../events/datasets/metrics_summaries.py | 120 ------------------ .../endpoints/test_relay_globalconfig_v3.py | 1 - 5 files changed, 132 deletions(-) delete mode 100644 src/sentry/search/events/datasets/metrics_summaries.py diff --git a/src/sentry/api/serializers/models/event.py b/src/sentry/api/serializers/models/event.py index 1d2255fa2e3941..2cbc423f51dc8e 100644 --- a/src/sentry/api/serializers/models/event.py +++ b/src/sentry/api/serializers/models/event.py @@ -172,7 +172,6 @@ class TransactionEventFields(TypedDict, total=False): endTimestamp: datetime measurements: Any breakdowns: Any - _metrics_summary: Any class EventSerializerResponse( @@ -377,10 +376,6 @@ def __serialize_transaction_attrs(self, attrs, obj) -> TransactionEventFields: "breakdowns": obj.data.get("breakdowns"), } - # The _ reflects the temporary nature of this field. - if (transaction_metrics_summary := obj.data.get("_metrics_summary")) is not None: - transaction_attrs["_metrics_summary"] = transaction_metrics_summary - return transaction_attrs def __serialize_error_attrs(self, attrs, obj) -> ErrorEventFields: diff --git a/src/sentry/options/defaults.py b/src/sentry/options/defaults.py index 982e6115fd4fbd..2ac714fea4c0f8 100644 --- a/src/sentry/options/defaults.py +++ b/src/sentry/options/defaults.py @@ -1128,11 +1128,6 @@ # Controls the rollout rate in percent (`0.0` to `1.0`) for metric stats. register("relay.metric-stats.rollout-rate", default=0.0, flags=FLAG_AUTOMATOR_MODIFIABLE) -# Controls the sample rate of metrics summaries computation in Relay. -register( - "relay.compute-metrics-summaries.sample-rate", default=0.0, flags=FLAG_AUTOMATOR_MODIFIABLE -) - # Controls whether generic inbound filters are sent to Relay. register("relay.emit-generic-inbound-filters", default=False, flags=FLAG_AUTOMATOR_MODIFIABLE) diff --git a/src/sentry/relay/globalconfig.py b/src/sentry/relay/globalconfig.py index 6e58750ec3bdfa..7b87ee3897baec 100644 --- a/src/sentry/relay/globalconfig.py +++ b/src/sentry/relay/globalconfig.py @@ -23,7 +23,6 @@ "relay.metric-bucket-distribution-encodings", "relay.metric-stats.rollout-rate", "relay.span-extraction.sample-rate", - "relay.compute-metrics-summaries.sample-rate", "relay.span-normalization.allowed_hosts", ] diff --git a/src/sentry/search/events/datasets/metrics_summaries.py b/src/sentry/search/events/datasets/metrics_summaries.py deleted file mode 100644 index dd1076fa8ff8e4..00000000000000 --- a/src/sentry/search/events/datasets/metrics_summaries.py +++ /dev/null @@ -1,120 +0,0 @@ -from __future__ import annotations - -from collections.abc import Callable, Mapping - -from snuba_sdk import And, Column, Condition, Direction, Function, Op, OrderBy - -from sentry.api.event_search import SearchFilter -from sentry.search.events import constants -from sentry.search.events.builder.base import BaseQueryBuilder -from sentry.search.events.datasets import field_aliases, filter_aliases, function_aliases -from sentry.search.events.datasets.base import DatasetConfig -from sentry.search.events.fields import IntervalDefault, NumberRange, SnQLFunction, with_default -from sentry.search.events.types import SelectType, WhereType - - -class MetricsSummariesDatasetConfig(DatasetConfig): - def __init__(self, builder: BaseQueryBuilder): - self.builder = builder - - @property - def search_filter_converter( - self, - ) -> Mapping[str, Callable[[SearchFilter], WhereType | None]]: - return { - constants.PROJECT_ALIAS: self._project_slug_filter_converter, - constants.PROJECT_NAME_ALIAS: self._project_slug_filter_converter, - "metric": self._metric_filter_converter, - } - - @property - def field_alias_converter(self) -> Mapping[str, Callable[[str], SelectType]]: - return { - constants.PROJECT_ALIAS: self._resolve_project_slug_alias, - constants.PROJECT_NAME_ALIAS: self._resolve_project_slug_alias, - "avg_metric": self._resolve_avg_alias, - } - - @property - def function_converter(self) -> Mapping[str, SnQLFunction]: - return { - function.name: function - for function in [ - SnQLFunction( - "examples", - snql_aggregate=self._resolve_random_samples, - optional_args=[with_default(1, NumberRange("count", 1, None))], - private=True, - ), - SnQLFunction( - "rounded_timestamp", - required_args=[IntervalDefault("interval", 1, None)], - snql_column=lambda args, alias: function_aliases.resolve_rounded_timestamp( - args["interval"], alias, timestamp_column="end_timestamp" - ), - private=True, - ), - ] - } - - @property - def orderby_converter(self) -> Mapping[str, Callable[[Direction], OrderBy]]: - return {} - - def _project_slug_filter_converter(self, search_filter: SearchFilter) -> WhereType | None: - return filter_aliases.project_slug_converter(self.builder, search_filter) - - def _metric_filter_converter(self, search_filter: SearchFilter) -> WhereType | None: - column = search_filter.key.name - value = search_filter.value.value - return And( - [ - Condition(self.builder.column(column), Op.EQ, value), - # The metrics summaries table orders by the cityHash64 of the metric name. - # In order to take full advantage of the order by of the table, add an - # additional condition on the cityHash64 of the metric name. - Condition( - Function("cityHash64", [self.builder.column(column)]), - Op.EQ, - Function("cityHash64", [value]), - ), - ] - ) - - def _resolve_project_slug_alias(self, alias: str) -> SelectType: - return field_aliases.resolve_project_slug_alias(self.builder, alias) - - def _resolve_avg_alias(self, alias: str) -> SelectType: - return Function( - "divide", - [self.builder.column("sum_metric"), self.builder.column("count_metric")], - alias, - ) - - def _resolve_random_samples( - self, - args: Mapping[str, str | Column | SelectType | int | float], - alias: str, - ) -> SelectType: - offset = 0 if self.builder.offset is None else self.builder.offset.offset - limit = 0 if self.builder.limit is None else self.builder.limit.limit - return function_aliases.resolve_random_samples( - [ - # DO NOT change the order of these columns as it - # changes the order of the tuple in the response - # which WILL cause errors where it assumes this - # order - self.builder.resolve_column("span.group"), - self.builder.resolve_column("timestamp"), - self.builder.resolve_column("id"), - self.builder.resolve_column("min_metric"), - self.builder.resolve_column("max_metric"), - self.builder.resolve_column("sum_metric"), - self.builder.resolve_column("count_metric"), - self.builder.resolve_column("avg_metric"), - ], - alias, - offset, - limit, - size=int(args["count"]), - ) diff --git a/tests/sentry/api/endpoints/test_relay_globalconfig_v3.py b/tests/sentry/api/endpoints/test_relay_globalconfig_v3.py index b86cd0126bbe90..f34db28cfd51e6 100644 --- a/tests/sentry/api/endpoints/test_relay_globalconfig_v3.py +++ b/tests/sentry/api/endpoints/test_relay_globalconfig_v3.py @@ -43,7 +43,6 @@ def inner(version, global_): "relay.span-usage-metric": True, "relay.cardinality-limiter.mode": "passive", "profiling.generic_metrics.functions_ingestion.enabled": True, - "relay.compute-metrics-summaries.sample-rate": 1.0, "relay.metric-bucket-distribution-encodings": { "custom": "array", "metric_stats": "array",