From 6ee5c57255b84b5596626a58b2838b8a0a9f875b Mon Sep 17 00:00:00 2001 From: Dominik Buszowiecki Date: Fri, 12 Apr 2024 11:03:48 -0400 Subject: [PATCH 1/7] cache.item_size into metrics --- src/sentry/search/events/constants.py | 1 + src/sentry/snuba/metrics/naming_layer/mri.py | 1 + .../snuba/metrics/naming_layer/public.py | 1 + src/sentry/testutils/cases.py | 26 +++++++++++------- .../sentry/snuba/metrics/fields/test_base.py | 1 + ..._organization_events_stats_span_metrics.py | 27 +++++++++++++++++++ 6 files changed, 47 insertions(+), 10 deletions(-) diff --git a/src/sentry/search/events/constants.py b/src/sentry/search/events/constants.py index b630dfc596985c..edf65b6a38dd29 100644 --- a/src/sentry/search/events/constants.py +++ b/src/sentry/search/events/constants.py @@ -327,6 +327,7 @@ class ThresholdDict(TypedDict): "http.response_content_length": "d:spans/http.response_content_length@byte", "http.decoded_response_content_length": "d:spans/http.decoded_response_content_length@byte", "http.response_transfer_size": "d:spans/http.response_transfer_size@byte", + "cache.item_size": "d:spans/cache.item_size@byte", } SELF_TIME_LIGHT = "d:spans/exclusive_time_light@millisecond" # 50 to match the size of tables in the UI + 1 for pagination reasons diff --git a/src/sentry/snuba/metrics/naming_layer/mri.py b/src/sentry/snuba/metrics/naming_layer/mri.py index ad6727e1eb4ae7..55dc60e4774012 100644 --- a/src/sentry/snuba/metrics/naming_layer/mri.py +++ b/src/sentry/snuba/metrics/naming_layer/mri.py @@ -168,6 +168,7 @@ class SpanMRI(Enum): SELF_TIME_LIGHT = "d:spans/exclusive_time_light@millisecond" RESPONSE_CONTENT_LENGTH = "d:spans/http.response_content_length@byte" DECODED_RESPONSE_CONTENT_LENGTH = "d:spans/http.decoded_response_content_length@byte" + CACHE_ITEM_SIZE = "d:spans/cache.item_size@byte" RESPONSE_TRANSFER_SIZE = "d:spans/http.response_transfer_size@byte" # Derived diff --git a/src/sentry/snuba/metrics/naming_layer/public.py b/src/sentry/snuba/metrics/naming_layer/public.py index 314614c500a9fc..40d262b90fab0b 100644 --- a/src/sentry/snuba/metrics/naming_layer/public.py +++ b/src/sentry/snuba/metrics/naming_layer/public.py @@ -120,6 +120,7 @@ class SpanMetricKey(Enum): RESPONSE_CONTENT_LENGTH = "http.response_content_length" DECODED_RESPONSE_CONTENT_LENGTH = "http.decoded_response_content_length" RESPONSE_TRANSFER_SIZE = "http.response_transfer_size" + CACHE_ITEM_SIZE = "cache.item_size" HTTP_ERROR_COUNT = "span.http_error_count" HTTP_ERROR_RATE = "span.http_error_rate" diff --git a/src/sentry/testutils/cases.py b/src/sentry/testutils/cases.py index 420b1d13539add..bb98341d229fad 100644 --- a/src/sentry/testutils/cases.py +++ b/src/sentry/testutils/cases.py @@ -647,16 +647,21 @@ def detect_performance_problems_interceptor( perf_problem.fingerprint = fingerprint return perf_problems - with mock.patch( - "sentry.issues.ingest.send_issue_occurrence_to_eventstream", - side_effect=send_issue_occurrence_to_eventstream, - ) as mock_eventstream, mock.patch( - "sentry.event_manager.detect_performance_problems", - side_effect=detect_performance_problems_interceptor, - ), mock.patch.object( - issue_type, "noise_config", new=NoiseConfig(noise_limit, timedelta(minutes=1)) - ), override_options( - {"performance.issues.all.problem-detection": 1.0, detector_option: 1.0} + with ( + mock.patch( + "sentry.issues.ingest.send_issue_occurrence_to_eventstream", + side_effect=send_issue_occurrence_to_eventstream, + ) as mock_eventstream, + mock.patch( + "sentry.event_manager.detect_performance_problems", + side_effect=detect_performance_problems_interceptor, + ), + mock.patch.object( + issue_type, "noise_config", new=NoiseConfig(noise_limit, timedelta(minutes=1)) + ), + override_options( + {"performance.issues.all.problem-detection": 1.0, detector_option: 1.0} + ), ): event = perf_event_manager.save(project_id) if mock_eventstream.call_args: @@ -2015,6 +2020,7 @@ class MetricsEnhancedPerformanceTestCase(BaseMetricsLayerTestCase, TestCase): "span.self_time": "metrics_distributions", "http.response_content_length": "metrics_distributions", "http.decoded_response_content_length": "metrics_distributions", + "cache.item_size": "metrics_distributions", "http.response_transfer_size": "metrics_distributions", "measurements.lcp": "metrics_distributions", "measurements.fp": "metrics_distributions", diff --git a/tests/sentry/snuba/metrics/fields/test_base.py b/tests/sentry/snuba/metrics/fields/test_base.py index 18462dc3649fe5..bd262d0c0d44c1 100644 --- a/tests/sentry/snuba/metrics/fields/test_base.py +++ b/tests/sentry/snuba/metrics/fields/test_base.py @@ -71,6 +71,7 @@ def get_entity_of_metric_mocked(_, metric_mri, use_case_id): SpanMRI.RESPONSE_CONTENT_LENGTH.value: EntityKey.MetricsDistributions, SpanMRI.DECODED_RESPONSE_CONTENT_LENGTH.value: EntityKey.MetricsDistributions, SpanMRI.RESPONSE_TRANSFER_SIZE.value: EntityKey.MetricsDistributions, + SpanMRI.CACHE_ITEM_SIZE.value: EntityKey.MetricsDistributions, }[metric_mri] diff --git a/tests/snuba/api/endpoints/test_organization_events_stats_span_metrics.py b/tests/snuba/api/endpoints/test_organization_events_stats_span_metrics.py index b5fc4427731f00..88f36ae695c509 100644 --- a/tests/snuba/api/endpoints/test_organization_events_stats_span_metrics.py +++ b/tests/snuba/api/endpoints/test_organization_events_stats_span_metrics.py @@ -270,6 +270,33 @@ def test_resource_transfer_size(self): assert not data[0][1][0]["count"] assert data[1][1][0]["count"] == 4.0 + def test_cache_item_size(self): + self.store_span_metric( + 4, + metric="cache.item_size", + timestamp=self.day_ago + timedelta(minutes=1), + tags={"transaction": "foo"}, + ) + + response = self.do_request( + data={ + "start": iso_format(self.day_ago), + "end": iso_format(self.day_ago + timedelta(minutes=2)), + "interval": "1m", + "yAxis": "avg(cache.item_size)", + "project": self.project.id, + "dataset": "spansMetrics", + "excludeOther": 0, + }, + ) + + assert response.status_code == 200 + + data = response.data["data"] + assert len(data) == 2 + assert not data[0][1][0]["count"] + assert data[1][1][0]["count"] == 4.0 + class OrganizationEventsStatsSpansMetricsEndpointTestWithMetricLayer( OrganizationEventsStatsSpansMetricsEndpointTest From df88618f9cda2191330ac8289a83f2c64d63c52a Mon Sep 17 00:00:00 2001 From: Dominik Buszowiecki Date: Mon, 15 Apr 2024 15:55:51 -0400 Subject: [PATCH 2/7] add cache.hit? --- src/sentry/search/events/constants.py | 1 + src/sentry/sentry_metrics/indexer/strings.py | 1 + .../endpoints/test_organization_events_stats_span_metrics.py | 3 ++- 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/sentry/search/events/constants.py b/src/sentry/search/events/constants.py index edf65b6a38dd29..8d8ae986795e20 100644 --- a/src/sentry/search/events/constants.py +++ b/src/sentry/search/events/constants.py @@ -311,6 +311,7 @@ class ThresholdDict(TypedDict): "query_hash", "release", "resource.render_blocking_status", + "cache.hit", "satisfaction", "sdk", "session.status", diff --git a/src/sentry/sentry_metrics/indexer/strings.py b/src/sentry/sentry_metrics/indexer/strings.py index 87ca1ff07a5e11..271a07cded5231 100644 --- a/src/sentry/sentry_metrics/indexer/strings.py +++ b/src/sentry/sentry_metrics/indexer/strings.py @@ -198,6 +198,7 @@ "outcome.id": PREFIX + 276, "outcome.reason": PREFIX + 277, "cardinality.window": PREFIX + 278, + "cache.hit": PREFIX + 279, # GENERAL/MISC (don't have a category) "": PREFIX + 1000, } diff --git a/tests/snuba/api/endpoints/test_organization_events_stats_span_metrics.py b/tests/snuba/api/endpoints/test_organization_events_stats_span_metrics.py index 88f36ae695c509..b84d3ecd559831 100644 --- a/tests/snuba/api/endpoints/test_organization_events_stats_span_metrics.py +++ b/tests/snuba/api/endpoints/test_organization_events_stats_span_metrics.py @@ -275,7 +275,7 @@ def test_cache_item_size(self): 4, metric="cache.item_size", timestamp=self.day_ago + timedelta(minutes=1), - tags={"transaction": "foo"}, + tags={"transaction": "foo", "cache.hit": "true"}, ) response = self.do_request( @@ -287,6 +287,7 @@ def test_cache_item_size(self): "project": self.project.id, "dataset": "spansMetrics", "excludeOther": 0, + "field": ["cache.hit"], }, ) From 15ce1decc9912ccc9ef97350813b4133e6d93804 Mon Sep 17 00:00:00 2001 From: Dominik Buszowiecki Date: Tue, 16 Apr 2024 13:54:12 -0400 Subject: [PATCH 3/7] wip --- src/sentry/sentry_metrics/indexer/strings.py | 1 + ..._organization_events_stats_span_metrics.py | 25 +++++++++++++++++-- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/sentry/sentry_metrics/indexer/strings.py b/src/sentry/sentry_metrics/indexer/strings.py index 271a07cded5231..37f5d74575a071 100644 --- a/src/sentry/sentry_metrics/indexer/strings.py +++ b/src/sentry/sentry_metrics/indexer/strings.py @@ -226,6 +226,7 @@ "d:spans/webvital.score.weight.inp@ratio": PREFIX + 416, "d:spans/webvital.inp@millisecond": PREFIX + 417, "c:spans/usage@none": PREFIX + 418, + "d:spans/cache.item_size@byte": PREFIX + 419, # Last possible index: 499 } diff --git a/tests/snuba/api/endpoints/test_organization_events_stats_span_metrics.py b/tests/snuba/api/endpoints/test_organization_events_stats_span_metrics.py index b84d3ecd559831..90ef3dade1f7b4 100644 --- a/tests/snuba/api/endpoints/test_organization_events_stats_span_metrics.py +++ b/tests/snuba/api/endpoints/test_organization_events_stats_span_metrics.py @@ -275,7 +275,7 @@ def test_cache_item_size(self): 4, metric="cache.item_size", timestamp=self.day_ago + timedelta(minutes=1), - tags={"transaction": "foo", "cache.hit": "true"}, + tags={"transaction": "foo"}, ) response = self.do_request( @@ -287,7 +287,6 @@ def test_cache_item_size(self): "project": self.project.id, "dataset": "spansMetrics", "excludeOther": 0, - "field": ["cache.hit"], }, ) @@ -298,6 +297,28 @@ def test_cache_item_size(self): assert not data[0][1][0]["count"] assert data[1][1][0]["count"] == 4.0 + def test_cache_hit(self): + self.store_span_metric( + 4, + metric="cache.item_size", + timestamp=self.day_ago + timedelta(minutes=1), + tags={"cache.hit": "true", "transaction": "foo"}, + ) + + response = self.do_request( + data={ + "start": iso_format(self.day_ago), + "end": iso_format(self.day_ago + timedelta(minutes=2)), + "interval": "1m", + "field": ["transaction"], + "yAxis": ["count()"], + "project": self.project.id, + "dataset": "spansMetrics", + }, + ) + + assert response.status_code == 200 + class OrganizationEventsStatsSpansMetricsEndpointTestWithMetricLayer( OrganizationEventsStatsSpansMetricsEndpointTest From b295347dc861c4c9ee5a675836092ef7ab22ad3b Mon Sep 17 00:00:00 2001 From: Dominik Buszowiecki Date: Tue, 16 Apr 2024 16:00:30 -0400 Subject: [PATCH 4/7] fix --- ..._organization_events_stats_span_metrics.py | 22 ------------------- 1 file changed, 22 deletions(-) diff --git a/tests/snuba/api/endpoints/test_organization_events_stats_span_metrics.py b/tests/snuba/api/endpoints/test_organization_events_stats_span_metrics.py index 90ef3dade1f7b4..88f36ae695c509 100644 --- a/tests/snuba/api/endpoints/test_organization_events_stats_span_metrics.py +++ b/tests/snuba/api/endpoints/test_organization_events_stats_span_metrics.py @@ -297,28 +297,6 @@ def test_cache_item_size(self): assert not data[0][1][0]["count"] assert data[1][1][0]["count"] == 4.0 - def test_cache_hit(self): - self.store_span_metric( - 4, - metric="cache.item_size", - timestamp=self.day_ago + timedelta(minutes=1), - tags={"cache.hit": "true", "transaction": "foo"}, - ) - - response = self.do_request( - data={ - "start": iso_format(self.day_ago), - "end": iso_format(self.day_ago + timedelta(minutes=2)), - "interval": "1m", - "field": ["transaction"], - "yAxis": ["count()"], - "project": self.project.id, - "dataset": "spansMetrics", - }, - ) - - assert response.status_code == 200 - class OrganizationEventsStatsSpansMetricsEndpointTestWithMetricLayer( OrganizationEventsStatsSpansMetricsEndpointTest From 41cb97d04d4eb8db7fe1bf6908405c53476d2e01 Mon Sep 17 00:00:00 2001 From: Dominik Buszowiecki Date: Wed, 17 Apr 2024 13:04:23 -0400 Subject: [PATCH 5/7] remove from strings.py --- src/sentry/sentry_metrics/indexer/strings.py | 4 ---- .../endpoints/test_organization_events_stats_span_metrics.py | 3 ++- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/sentry/sentry_metrics/indexer/strings.py b/src/sentry/sentry_metrics/indexer/strings.py index 615e96b73cfcf2..87ca1ff07a5e11 100644 --- a/src/sentry/sentry_metrics/indexer/strings.py +++ b/src/sentry/sentry_metrics/indexer/strings.py @@ -198,9 +198,6 @@ "outcome.id": PREFIX + 276, "outcome.reason": PREFIX + 277, "cardinality.window": PREFIX + 278, - "cardinality.limit": PREFIX + 279, - "cardinality.scope": PREFIX + 280, - "cache.hit": PREFIX + 281, # GENERAL/MISC (don't have a category) "": PREFIX + 1000, } @@ -228,7 +225,6 @@ "d:spans/webvital.score.weight.inp@ratio": PREFIX + 416, "d:spans/webvital.inp@millisecond": PREFIX + 417, "c:spans/usage@none": PREFIX + 418, - "d:spans/cache.item_size@byte": PREFIX + 419, # Last possible index: 499 } diff --git a/tests/snuba/api/endpoints/test_organization_events_stats_span_metrics.py b/tests/snuba/api/endpoints/test_organization_events_stats_span_metrics.py index 88f36ae695c509..74f58a749b3074 100644 --- a/tests/snuba/api/endpoints/test_organization_events_stats_span_metrics.py +++ b/tests/snuba/api/endpoints/test_organization_events_stats_span_metrics.py @@ -275,7 +275,7 @@ def test_cache_item_size(self): 4, metric="cache.item_size", timestamp=self.day_ago + timedelta(minutes=1), - tags={"transaction": "foo"}, + tags={"transaction": "foo", "cache.hit": "true"}, ) response = self.do_request( @@ -284,6 +284,7 @@ def test_cache_item_size(self): "end": iso_format(self.day_ago + timedelta(minutes=2)), "interval": "1m", "yAxis": "avg(cache.item_size)", + "field": ["cache.hit"], "project": self.project.id, "dataset": "spansMetrics", "excludeOther": 0, From 428303e39e5037e689919b61b9a036d6a4b29457 Mon Sep 17 00:00:00 2001 From: Dominik Buszowiecki Date: Thu, 18 Apr 2024 10:31:12 -0400 Subject: [PATCH 6/7] fix tests --- src/sentry/search/events/builder/metrics.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/sentry/search/events/builder/metrics.py b/src/sentry/search/events/builder/metrics.py index 44b5e5abfbd525..a5d64debd28988 100644 --- a/src/sentry/search/events/builder/metrics.py +++ b/src/sentry/search/events/builder/metrics.py @@ -353,10 +353,11 @@ def is_performance(self) -> bool: @property def use_case_id(self) -> UseCaseID: - if self.is_performance: - return UseCaseID.TRANSACTIONS - elif self.spans_metrics_builder: + + if self.spans_metrics_builder: return UseCaseID.SPANS + elif self.is_performance: + return UseCaseID.TRANSACTIONS else: return UseCaseID.SESSIONS From e08106b6c8eefb3a41080bad8c7579c8dcbca8a8 Mon Sep 17 00:00:00 2001 From: Dominik Buszowiecki Date: Thu, 18 Apr 2024 10:36:13 -0400 Subject: [PATCH 7/7] merge conflict --- src/sentry/sentry_metrics/indexer/strings.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/sentry/sentry_metrics/indexer/strings.py b/src/sentry/sentry_metrics/indexer/strings.py index 87ca1ff07a5e11..85094b93d9e298 100644 --- a/src/sentry/sentry_metrics/indexer/strings.py +++ b/src/sentry/sentry_metrics/indexer/strings.py @@ -198,6 +198,8 @@ "outcome.id": PREFIX + 276, "outcome.reason": PREFIX + 277, "cardinality.window": PREFIX + 278, + "cardinality.limit": PREFIX + 279, + "cardinality.scope": PREFIX + 280, # GENERAL/MISC (don't have a category) "": PREFIX + 1000, }