From 804e0e46ad27475f6c94a6526f28d550a0d09a97 Mon Sep 17 00:00:00 2001 From: Lyn Nagara Date: Wed, 20 Mar 2024 10:20:43 -0700 Subject: [PATCH 01/15] feat: Sessions should not be default Sessions does not even exist anymore, the metrics pipeline should be used for release health. Flip the default. --- src/sentry/conf/server.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/sentry/conf/server.py b/src/sentry/conf/server.py index 06fbb280c4eade..5b7da1a8200217 100644 --- a/src/sentry/conf/server.py +++ b/src/sentry/conf/server.py @@ -2331,13 +2331,11 @@ def custom_parameter_sort(parameter: dict) -> tuple[str, int]: SENTRY_METRICS_INDEXER_ENABLE_SLICED_PRODUCER = False # Release Health -SENTRY_RELEASE_HEALTH = "sentry.release_health.sessions.SessionsReleaseHealthBackend" +SENTRY_RELEASE_HEALTH = "sentry.release_health.metrics.MetricsReleaseHealthBackend" SENTRY_RELEASE_HEALTH_OPTIONS: dict[str, Any] = {} # Release Monitor -SENTRY_RELEASE_MONITOR = ( - "sentry.release_health.release_monitor.sessions.SessionReleaseMonitorBackend" -) +SENTRY_RELEASE_MONITOR = "sentry.release_health.release_monitor.metrics.MetricReleaseMonitorBackend" SENTRY_RELEASE_MONITOR_OPTIONS: dict[str, Any] = {} # Render charts on the backend. This uses the Chartcuterie external service. From bea49a7734bb038c1ba74e48a3898376ee176315 Mon Sep 17 00:00:00 2001 From: Lyn Nagara Date: Wed, 20 Mar 2024 10:51:32 -0700 Subject: [PATCH 02/15] requires metrics --- tests/snuba/rules/conditions/test_event_frequency.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/snuba/rules/conditions/test_event_frequency.py b/tests/snuba/rules/conditions/test_event_frequency.py index 884adbefc9dd03..160ff48ec9088b 100644 --- a/tests/snuba/rules/conditions/test_event_frequency.py +++ b/tests/snuba/rules/conditions/test_event_frequency.py @@ -21,7 +21,7 @@ from sentry.testutils.skips import requires_snuba from sentry.utils.samples import load_data -pytestmark = [requires_snuba] +pytestmark = [pytest.mark.sentry_metrics, requires_snuba] class ErrorEventMixin(SnubaTestCase): From ca558be5d69eceedd4c6c7aef2bf133122009c93 Mon Sep 17 00:00:00 2001 From: Lyn Nagara Date: Wed, 20 Mar 2024 15:31:18 -0700 Subject: [PATCH 03/15] fix some tests --- .../test_organization_release_details.py | 3 +- .../endpoints/test_project_release_details.py | 3 +- tests/snuba/sessions/test_sessions.py | 111 ------------------ 3 files changed, 4 insertions(+), 113 deletions(-) diff --git a/tests/sentry/api/endpoints/test_organization_release_details.py b/tests/sentry/api/endpoints/test_organization_release_details.py index a04fe41f09dad8..c2dfa12f025f15 100644 --- a/tests/sentry/api/endpoints/test_organization_release_details.py +++ b/tests/sentry/api/endpoints/test_organization_release_details.py @@ -2,6 +2,7 @@ from datetime import UTC, datetime, timedelta from unittest.mock import patch +import pytest from django.urls import reverse from sentry.api.endpoints.organization_release_details import OrganizationReleaseSerializer @@ -24,7 +25,7 @@ from sentry.types.activity import ActivityType from sentry.utils.security.orgauthtoken_token import generate_token, hash_token -pytestmark = [requires_snuba] +pytestmark = [pytest.mark.sentry_metrics, requires_snuba] @region_silo_test diff --git a/tests/sentry/api/endpoints/test_project_release_details.py b/tests/sentry/api/endpoints/test_project_release_details.py index 8d54660097e5fc..ee28bfeb11b9ae 100644 --- a/tests/sentry/api/endpoints/test_project_release_details.py +++ b/tests/sentry/api/endpoints/test_project_release_details.py @@ -1,6 +1,7 @@ import unittest from datetime import UTC, datetime +import pytest from django.urls import reverse from sentry.api.serializers.rest_framework.release import ReleaseSerializer @@ -17,7 +18,7 @@ from sentry.types.activity import ActivityType from sentry.utils.security.orgauthtoken_token import generate_token, hash_token -pytestmark = [requires_snuba] +pytestmark = [pytest.mark.sentry_metrics, requires_snuba] @region_silo_test diff --git a/tests/snuba/sessions/test_sessions.py b/tests/snuba/sessions/test_sessions.py index 1982d5996d7fcc..2f38134732b284 100644 --- a/tests/snuba/sessions/test_sessions.py +++ b/tests/snuba/sessions/test_sessions.py @@ -310,115 +310,6 @@ def test_get_release_adoption_lowered(self): }, } - def test_get_release_health_data_overview_users(self): - data = self.backend.get_release_health_data_overview( - [ - (self.project.id, self.session_release), - (self.project.id, self.session_crashed_release), - ], - summary_stats_period="24h", - health_stats_period="24h", - stat="users", - ) - - stats = make_24h_stats(self.received - (24 * 3600), adjust_start=self.adjust_interval) - stats[-1] = [stats[-1][0], 1] - stats_ok = stats_crash = stats - - assert data == { - (self.project.id, self.session_crashed_release): { - "total_sessions": 1, - "sessions_errored": 0, - "total_sessions_24h": 1, - "total_users": 1, - "duration_p90": None, - "sessions_crashed": 1, - "total_users_24h": 1, - "stats": {"24h": stats_crash}, - "crash_free_users": 0.0, - "adoption": 100.0, - "sessions_adoption": 33.33333333333333, - "has_health_data": True, - "crash_free_sessions": 0.0, - "duration_p50": None, - "total_project_sessions_24h": 3, - "total_project_users_24h": 1, - }, - (self.project.id, self.session_release): { - "total_sessions": 2, - "sessions_errored": 0, - "total_sessions_24h": 2, - "total_users": 1, - "duration_p90": 57.0, - "sessions_crashed": 0, - "total_users_24h": 1, - "stats": {"24h": stats_ok}, - "crash_free_users": 100.0, - "adoption": 100.0, - "sessions_adoption": 66.66666666666666, - "has_health_data": True, - "crash_free_sessions": 100.0, - "duration_p50": 45.0, - "total_project_sessions_24h": 3, - "total_project_users_24h": 1, - }, - } - - def test_get_release_health_data_overview_sessions(self): - data = self.backend.get_release_health_data_overview( - [ - (self.project.id, self.session_release), - (self.project.id, self.session_crashed_release), - ], - summary_stats_period="24h", - health_stats_period="24h", - stat="sessions", - ) - - stats = make_24h_stats(self.received - (24 * 3600), adjust_start=self.adjust_interval) - - stats_ok = stats[:-1] + [[stats[-1][0], 2]] - stats_crash = stats[:-1] + [[stats[-1][0], 1]] - - assert data == { - (self.project.id, self.session_crashed_release): { - "total_sessions": 1, - "sessions_errored": 0, - "total_sessions_24h": 1, - "total_users": 1, - "duration_p90": None, - "sessions_crashed": 1, - "total_users_24h": 1, - "stats": {"24h": stats_crash}, - "crash_free_users": 0.0, - "adoption": 100.0, - "sessions_adoption": 33.33333333333333, - "has_health_data": True, - "crash_free_sessions": 0.0, - "duration_p50": None, - "total_project_sessions_24h": 3, - "total_project_users_24h": 1, - }, - (self.project.id, self.session_release): { - "total_sessions": 2, - "sessions_errored": 0, - "total_sessions_24h": 2, - "total_users": 1, - "duration_p90": 57.0, - "sessions_crashed": 0, - "total_users_24h": 1, - "stats": {"24h": stats_ok}, - "crash_free_users": 100.0, - "sessions_adoption": 66.66666666666666, - "adoption": 100.0, - "has_health_data": True, - "crash_free_sessions": 100.0, - "duration_p50": 45.0, - "total_project_sessions_24h": 3, - "total_project_users_24h": 1, - }, - } - def test_fetching_release_sessions_time_bounds_for_different_release(self): """ Test that ensures only session bounds for releases are calculated according @@ -1639,9 +1530,7 @@ def test_get_release_health_data_overview_users(self): inner = data[(self.project.id, self.session_release)] assert inner["total_users"] == 3 - assert inner["total_users_24h"] == 3 assert inner["crash_free_users"] == 66.66666666666667 - assert inner["total_project_users_24h"] == 3 def test_get_crash_free_breakdown(self): start = timezone.now() - timedelta(days=4) From ef22bc4eaabea6b1743e38fde12f93cf30114bee Mon Sep 17 00:00:00 2001 From: Lyn Nagara Date: Mon, 1 Apr 2024 12:36:40 -0700 Subject: [PATCH 04/15] update tests --- tests/sentry/api/endpoints/test_organization_releases.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/sentry/api/endpoints/test_organization_releases.py b/tests/sentry/api/endpoints/test_organization_releases.py index 8e15eebac52baa..72129a7007700f 100644 --- a/tests/sentry/api/endpoints/test_organization_releases.py +++ b/tests/sentry/api/endpoints/test_organization_releases.py @@ -3,6 +3,7 @@ from functools import cached_property from unittest.mock import patch +import pytest from django.urls import reverse from django.utils import timezone @@ -47,7 +48,7 @@ from sentry.types.activity import ActivityType from sentry.utils.security.orgauthtoken_token import generate_token, hash_token -pytestmark = [requires_snuba] +pytestmark = [requires_snuba, pytest.mark.sentry_metrics] class OrganizationReleaseListTest(APITestCase, SnubaTestCase): @@ -167,6 +168,7 @@ def test_release_list_order_by_sessions_empty(self): response, [release_5, release_4, release_3, release_2, release_1] ) + @pytest.mark.xfail(reason="Does not work with the metrics release health backend") def test_release_list_order_by_sessions(self): self.login_as(user=self.user) From b88e787ea22648bdcd17f00763f2dcd0f9d367d2 Mon Sep 17 00:00:00 2001 From: Lyn Nagara Date: Mon, 1 Apr 2024 13:20:35 -0700 Subject: [PATCH 05/15] more test stuff --- tests/acceptance/test_organization_dashboards.py | 3 +++ tests/acceptance/test_organization_switch.py | 3 +++ .../apidocs/endpoints/releases/test_organization_releases.py | 3 +++ .../apidocs/endpoints/releases/test_organization_sessions.py | 3 +++ tests/sentry/api/endpoints/test_project_release_stats.py | 3 ++- tests/sentry/rules/filters/test_latest_release.py | 4 +++- tests/snuba/api/endpoints/test_organization_sessions.py | 1 + tests/snuba/rules/conditions/test_event_frequency.py | 1 + 8 files changed, 19 insertions(+), 2 deletions(-) diff --git a/tests/acceptance/test_organization_dashboards.py b/tests/acceptance/test_organization_dashboards.py index 180e03da503e7c..694c615834d2b2 100644 --- a/tests/acceptance/test_organization_dashboards.py +++ b/tests/acceptance/test_organization_dashboards.py @@ -33,6 +33,9 @@ EDIT_FEATURE = ["organizations:dashboards-edit"] +pytestmark = pytest.mark.sentry_metrics + + @no_silo_test class OrganizationDashboardsAcceptanceTest(AcceptanceTestCase): def setUp(self): diff --git a/tests/acceptance/test_organization_switch.py b/tests/acceptance/test_organization_switch.py index e06617d626bdc2..ec958225f789c1 100644 --- a/tests/acceptance/test_organization_switch.py +++ b/tests/acceptance/test_organization_switch.py @@ -1,3 +1,4 @@ +import pytest from selenium.common.exceptions import TimeoutException from selenium.webdriver.common.by import By @@ -5,6 +6,8 @@ from sentry.testutils.silo import no_silo_test from sentry.utils.retries import TimedRetryPolicy +pytestmark = pytest.mark.sentry_metrics + @no_silo_test class OrganizationSwitchTest(AcceptanceTestCase, SnubaTestCase): diff --git a/tests/apidocs/endpoints/releases/test_organization_releases.py b/tests/apidocs/endpoints/releases/test_organization_releases.py index fb5eba6ad68790..b096f46c2becd6 100644 --- a/tests/apidocs/endpoints/releases/test_organization_releases.py +++ b/tests/apidocs/endpoints/releases/test_organization_releases.py @@ -1,11 +1,14 @@ from datetime import UTC, datetime +import pytest from django.test.client import RequestFactory from django.urls import reverse from fixtures.apidocs_test_case import APIDocsTestCase from sentry.models.release import Release +pytestmark = pytest.mark.sentry_metrics + class OrganizationReleasesDocsTest(APIDocsTestCase): def setUp(self): diff --git a/tests/apidocs/endpoints/releases/test_organization_sessions.py b/tests/apidocs/endpoints/releases/test_organization_sessions.py index 5ceec5517d134f..2373c954ebc581 100644 --- a/tests/apidocs/endpoints/releases/test_organization_sessions.py +++ b/tests/apidocs/endpoints/releases/test_organization_sessions.py @@ -1,9 +1,12 @@ +import pytest from django.test.client import RequestFactory from django.urls import reverse from fixtures.apidocs_test_case import APIDocsTestCase from sentry.testutils.cases import SnubaTestCase +pytestmark = pytest.mark.sentry_metrics + class OrganizationSessionsDocsTest(APIDocsTestCase, SnubaTestCase): def setUp(self): diff --git a/tests/sentry/api/endpoints/test_project_release_stats.py b/tests/sentry/api/endpoints/test_project_release_stats.py index 0a34cd28eb5ee8..dd1fa974756aa7 100644 --- a/tests/sentry/api/endpoints/test_project_release_stats.py +++ b/tests/sentry/api/endpoints/test_project_release_stats.py @@ -1,12 +1,13 @@ from datetime import UTC, datetime +import pytest from django.urls import reverse from sentry.models.release import Release from sentry.testutils.cases import APITestCase from sentry.testutils.skips import requires_snuba -pytestmark = [requires_snuba] +pytestmark = [requires_snuba, pytest.mark.sentry_metrics] class ProjectReleaseStatsTest(APITestCase): diff --git a/tests/sentry/rules/filters/test_latest_release.py b/tests/sentry/rules/filters/test_latest_release.py index 39365f6655b2c1..8bc4e1ca663ff3 100644 --- a/tests/sentry/rules/filters/test_latest_release.py +++ b/tests/sentry/rules/filters/test_latest_release.py @@ -1,5 +1,7 @@ from datetime import UTC, datetime +import pytest + from sentry.models.release import Release from sentry.models.rule import Rule from sentry.rules.filters.latest_release import LatestReleaseFilter, get_project_release_cache_key @@ -7,7 +9,7 @@ from sentry.testutils.skips import requires_snuba from sentry.utils.cache import cache -pytestmark = [requires_snuba] +pytestmark = [requires_snuba, pytest.mark.sentry_metrics] class LatestReleaseFilterTest(RuleTestCase): diff --git a/tests/snuba/api/endpoints/test_organization_sessions.py b/tests/snuba/api/endpoints/test_organization_sessions.py index 9ce62e8655b7a4..f2fe92b2e33ee0 100644 --- a/tests/snuba/api/endpoints/test_organization_sessions.py +++ b/tests/snuba/api/endpoints/test_organization_sessions.py @@ -86,6 +86,7 @@ def adjust_end(end: datetime.datetime, interval: int) -> datetime.datetime: return end +@pytest.mark.xfail(reason="Does not work with the metrics release health backend") class OrganizationSessionsEndpointTest(APITestCase, SnubaTestCase): def setUp(self): super().setUp() diff --git a/tests/snuba/rules/conditions/test_event_frequency.py b/tests/snuba/rules/conditions/test_event_frequency.py index b2ba95f4cb5277..648cca8e7fc7be 100644 --- a/tests/snuba/rules/conditions/test_event_frequency.py +++ b/tests/snuba/rules/conditions/test_event_frequency.py @@ -281,6 +281,7 @@ def increment(self, event, count, environment=None, timestamp=None): ) +@pytest.mark.xfail(reason="Does not work with the metrics release health backend") class EventFrequencyPercentConditionTestCase(SnubaTestCase, RuleTestCase): __test__ = Abstract(__module__, __qualname__) From d6184ea1501fc37e0fc001ed961974642d6bc3cb Mon Sep 17 00:00:00 2001 From: Lyn Nagara Date: Mon, 1 Apr 2024 13:50:22 -0700 Subject: [PATCH 06/15] yet more tests --- tests/acceptance/test_organization_dashboards.py | 1 + tests/sentry/integrations/slack/test_unfurl.py | 2 +- tests/sentry/release_health/test_metrics_sessions_v2.py | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/acceptance/test_organization_dashboards.py b/tests/acceptance/test_organization_dashboards.py index 694c615834d2b2..42eb8a65083adb 100644 --- a/tests/acceptance/test_organization_dashboards.py +++ b/tests/acceptance/test_organization_dashboards.py @@ -36,6 +36,7 @@ pytestmark = pytest.mark.sentry_metrics +@pytest.mark.xfail(reason="Does not work with the metrics release health backend") @no_silo_test class OrganizationDashboardsAcceptanceTest(AcceptanceTestCase): def setUp(self): diff --git a/tests/sentry/integrations/slack/test_unfurl.py b/tests/sentry/integrations/slack/test_unfurl.py index 4196b6ba38c409..6125a035cf67a9 100644 --- a/tests/sentry/integrations/slack/test_unfurl.py +++ b/tests/sentry/integrations/slack/test_unfurl.py @@ -21,7 +21,7 @@ from sentry.testutils.helpers.features import with_feature from sentry.testutils.skips import requires_snuba -pytestmark = [requires_snuba] +pytestmark = [requires_snuba, pytest.mark.sentry_metrics] INTERVAL_COUNT = 300 INTERVALS_PER_DAY = int(60 * 60 * 24 / INTERVAL_COUNT) diff --git a/tests/sentry/release_health/test_metrics_sessions_v2.py b/tests/sentry/release_health/test_metrics_sessions_v2.py index db68c29e1c8a13..24e100873e071c 100644 --- a/tests/sentry/release_health/test_metrics_sessions_v2.py +++ b/tests/sentry/release_health/test_metrics_sessions_v2.py @@ -61,6 +61,7 @@ def get_sessions_data(self, groupby: list[str], interval): assert response.status_code == 200 return response.data + @pytest.mark.xfail(reason="Does not work with the metrics release health backend") def test_sessions_metrics_with_metrics_only_field(self): """ Tests whether the request of a metrics-only field forwarded to the SessionsReleaseHealthBackend From c86e0199083c4a1bb3e5abc77e2cb1f1eab1af10 Mon Sep 17 00:00:00 2001 From: Lyn Nagara Date: Mon, 1 Apr 2024 14:35:41 -0700 Subject: [PATCH 07/15] one more --- tests/snuba/api/serializers/test_group_stream.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/snuba/api/serializers/test_group_stream.py b/tests/snuba/api/serializers/test_group_stream.py index ed76836009f718..a6d805bbc0a24b 100644 --- a/tests/snuba/api/serializers/test_group_stream.py +++ b/tests/snuba/api/serializers/test_group_stream.py @@ -2,6 +2,7 @@ from datetime import timedelta from unittest import mock +import pytest from django.utils import timezone from sentry.api.event_search import SearchFilter, SearchKey, SearchValue @@ -54,6 +55,7 @@ def test_environment(self): for args, kwargs in get_range.call_args_list: assert kwargs["environment_ids"] is None + @pytest.mark.xfail(reason="Does not work with the metrics release health backend") def test_session_count(self): group = self.group organization_id = group.project.organization_id From 5dabab4bc595ace12da9f19011312f477e863690 Mon Sep 17 00:00:00 2001 From: Riccardo Busetti Date: Tue, 2 Apr 2024 09:08:33 +0200 Subject: [PATCH 08/15] Fix offset missing --- src/sentry/release_health/metrics.py | 3 ++- tests/acceptance/test_organization_dashboards.py | 2 +- tests/sentry/api/endpoints/test_organization_releases.py | 8 +++++--- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/sentry/release_health/metrics.py b/src/sentry/release_health/metrics.py index fe6e898be18870..a35b38745fe380 100644 --- a/src/sentry/release_health/metrics.py +++ b/src/sentry/release_health/metrics.py @@ -5,7 +5,7 @@ from typing import Any, Literal, TypeVar from snuba_sdk import Column, Condition, Direction, Op -from snuba_sdk.expressions import Granularity, Limit +from snuba_sdk.expressions import Granularity, Limit, Offset from sentry.models.environment import Environment from sentry.models.project import Project @@ -1716,6 +1716,7 @@ def get_project_releases_by_stability( orderby=orderby, groupby=groupby, granularity=Granularity(LEGACY_SESSIONS_DEFAULT_ROLLUP), + offset=Offset(offset) if offset is not None else None, limit=Limit(limit) if limit is not None else None, include_series=False, include_totals=True, diff --git a/tests/acceptance/test_organization_dashboards.py b/tests/acceptance/test_organization_dashboards.py index 42eb8a65083adb..f75e0d6ac389ee 100644 --- a/tests/acceptance/test_organization_dashboards.py +++ b/tests/acceptance/test_organization_dashboards.py @@ -36,7 +36,7 @@ pytestmark = pytest.mark.sentry_metrics -@pytest.mark.xfail(reason="Does not work with the metrics release health backend") +# @pytest.mark.xfail(reason="Does not work with the metrics release health backend") @no_silo_test class OrganizationDashboardsAcceptanceTest(AcceptanceTestCase): def setUp(self): diff --git a/tests/sentry/api/endpoints/test_organization_releases.py b/tests/sentry/api/endpoints/test_organization_releases.py index 72129a7007700f..28bf52003cb6ef 100644 --- a/tests/sentry/api/endpoints/test_organization_releases.py +++ b/tests/sentry/api/endpoints/test_organization_releases.py @@ -37,9 +37,9 @@ from sentry.silo import SiloMode from sentry.testutils.cases import ( APITestCase, + BaseMetricsLayerTestCase, ReleaseCommitPatchTest, SetRefsTestCase, - SnubaTestCase, TestCase, ) from sentry.testutils.outbox import outbox_runner @@ -51,9 +51,12 @@ pytestmark = [requires_snuba, pytest.mark.sentry_metrics] -class OrganizationReleaseListTest(APITestCase, SnubaTestCase): +class OrganizationReleaseListTest(APITestCase, BaseMetricsLayerTestCase): endpoint = "sentry-api-0-organization-releases" + def now(self): + return timezone.now() + def assert_expected_versions(self, response, expected): assert [item["version"] for item in response.data] == [e.version for e in expected] @@ -168,7 +171,6 @@ def test_release_list_order_by_sessions_empty(self): response, [release_5, release_4, release_3, release_2, release_1] ) - @pytest.mark.xfail(reason="Does not work with the metrics release health backend") def test_release_list_order_by_sessions(self): self.login_as(user=self.user) From 1ef5c0d031ec389e4e1de9e51e506e6496ad6f5b Mon Sep 17 00:00:00 2001 From: Riccardo Busetti Date: Tue, 2 Apr 2024 09:10:31 +0200 Subject: [PATCH 09/15] Remove xfail --- tests/acceptance/test_organization_dashboards.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/acceptance/test_organization_dashboards.py b/tests/acceptance/test_organization_dashboards.py index f75e0d6ac389ee..694c615834d2b2 100644 --- a/tests/acceptance/test_organization_dashboards.py +++ b/tests/acceptance/test_organization_dashboards.py @@ -36,7 +36,6 @@ pytestmark = pytest.mark.sentry_metrics -# @pytest.mark.xfail(reason="Does not work with the metrics release health backend") @no_silo_test class OrganizationDashboardsAcceptanceTest(AcceptanceTestCase): def setUp(self): From 16142cf0702b89e807f2824a58eb21a089acc515 Mon Sep 17 00:00:00 2001 From: Riccardo Busetti Date: Tue, 2 Apr 2024 14:49:22 +0200 Subject: [PATCH 10/15] Try fix --- src/sentry/testutils/pytest/metrics.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sentry/testutils/pytest/metrics.py b/src/sentry/testutils/pytest/metrics.py index ff9e29bd79afbe..6dd658e4b47992 100644 --- a/src/sentry/testutils/pytest/metrics.py +++ b/src/sentry/testutils/pytest/metrics.py @@ -66,7 +66,7 @@ def new_build_results(*args, **kwargs): is_performance_metrics = False is_metrics = False if not isinstance(query, MetricsQuery) and not isinstance(query.match, Join): - is_performance_metrics = query.match.name.startswith("generic_metrics") + is_performance_metrics = query.match.name.contains("generic") is_metrics = "metrics" in query.match.name if is_performance_metrics: From 62855c013afc2d0569385163178c1e916fc71c5c Mon Sep 17 00:00:00 2001 From: Riccardo Busetti Date: Tue, 2 Apr 2024 14:49:55 +0200 Subject: [PATCH 11/15] Try fix --- src/sentry/testutils/pytest/metrics.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sentry/testutils/pytest/metrics.py b/src/sentry/testutils/pytest/metrics.py index 6dd658e4b47992..306e28aca87cb0 100644 --- a/src/sentry/testutils/pytest/metrics.py +++ b/src/sentry/testutils/pytest/metrics.py @@ -66,7 +66,7 @@ def new_build_results(*args, **kwargs): is_performance_metrics = False is_metrics = False if not isinstance(query, MetricsQuery) and not isinstance(query.match, Join): - is_performance_metrics = query.match.name.contains("generic") + is_performance_metrics = query.match.name.startswith("generic") is_metrics = "metrics" in query.match.name if is_performance_metrics: From 55401ea3b613e1fd90117c8affec580a4e7d84b6 Mon Sep 17 00:00:00 2001 From: Riccardo Busetti Date: Tue, 2 Apr 2024 14:50:08 +0200 Subject: [PATCH 12/15] Try fix --- src/sentry/testutils/pytest/metrics.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sentry/testutils/pytest/metrics.py b/src/sentry/testutils/pytest/metrics.py index 306e28aca87cb0..dee9813fb4fe9c 100644 --- a/src/sentry/testutils/pytest/metrics.py +++ b/src/sentry/testutils/pytest/metrics.py @@ -85,7 +85,7 @@ def new_create_snql_in_snuba(subscription, snuba_query, snql_query, entity_subsc is_performance_metrics = False is_metrics = False if isinstance(query.match, Entity): - is_performance_metrics = query.match.name.startswith("generic_metrics") + is_performance_metrics = query.match.name.startswith("generic") is_metrics = "metrics" in query.match.name if is_performance_metrics: From 929c1fa450d043a732ece5c8c5395bf7be95c1fc Mon Sep 17 00:00:00 2001 From: Riccardo Busetti Date: Wed, 3 Apr 2024 13:55:33 +0200 Subject: [PATCH 13/15] Fix --- .../endpoints/test_organization_releases.py | 7 ++---- .../test_metrics_sessions_v2.py | 22 ------------------- .../endpoints/test_organization_sessions.py | 5 +++-- .../rules/conditions/test_event_frequency.py | 12 ++++++---- 4 files changed, 13 insertions(+), 33 deletions(-) diff --git a/tests/sentry/api/endpoints/test_organization_releases.py b/tests/sentry/api/endpoints/test_organization_releases.py index 28bf52003cb6ef..007e8dd60a8fbe 100644 --- a/tests/sentry/api/endpoints/test_organization_releases.py +++ b/tests/sentry/api/endpoints/test_organization_releases.py @@ -37,7 +37,7 @@ from sentry.silo import SiloMode from sentry.testutils.cases import ( APITestCase, - BaseMetricsLayerTestCase, + BaseMetricsTestCase, ReleaseCommitPatchTest, SetRefsTestCase, TestCase, @@ -51,12 +51,9 @@ pytestmark = [requires_snuba, pytest.mark.sentry_metrics] -class OrganizationReleaseListTest(APITestCase, BaseMetricsLayerTestCase): +class OrganizationReleaseListTest(APITestCase, BaseMetricsTestCase): endpoint = "sentry-api-0-organization-releases" - def now(self): - return timezone.now() - def assert_expected_versions(self, response, expected): assert [item["version"] for item in response.data] == [e.version for e in expected] diff --git a/tests/sentry/release_health/test_metrics_sessions_v2.py b/tests/sentry/release_health/test_metrics_sessions_v2.py index 24e100873e071c..e860ca2e429534 100644 --- a/tests/sentry/release_health/test_metrics_sessions_v2.py +++ b/tests/sentry/release_health/test_metrics_sessions_v2.py @@ -61,28 +61,6 @@ def get_sessions_data(self, groupby: list[str], interval): assert response.status_code == 200 return response.data - @pytest.mark.xfail(reason="Does not work with the metrics release health backend") - def test_sessions_metrics_with_metrics_only_field(self): - """ - Tests whether the request of a metrics-only field forwarded to the SessionsReleaseHealthBackend - is handled with an empty response. - - This test is designed to show an edge-case that can happen in case the duplexer makes the wrong - decision with respect to which backend to choose for satisfying the query. - """ - response = self.do_request( - { - "organization_slug": [self.organization1], - "project": [self.project1.id], - "field": ["crash_free_rate(session)"], - "groupBy": [], - "interval": "1d", - } - ) - - assert len(response.data["groups"]) == 0 - assert response.status_code == 200 - @pytest.mark.parametrize( "input, expected_output, expected_status_filter", diff --git a/tests/snuba/api/endpoints/test_organization_sessions.py b/tests/snuba/api/endpoints/test_organization_sessions.py index f2fe92b2e33ee0..146085afd2ab87 100644 --- a/tests/snuba/api/endpoints/test_organization_sessions.py +++ b/tests/snuba/api/endpoints/test_organization_sessions.py @@ -9,6 +9,7 @@ from sentry import release_health from sentry.models.releaseprojectenvironment import ReleaseProjectEnvironment from sentry.release_health.metrics import MetricsReleaseHealthBackend +from sentry.release_health.sessions import SessionsReleaseHealthBackend from sentry.snuba.metrics import to_intervals from sentry.testutils.cases import APITestCase, BaseMetricsTestCase, SnubaTestCase from sentry.testutils.helpers.datetime import freeze_time @@ -86,7 +87,7 @@ def adjust_end(end: datetime.datetime, interval: int) -> datetime.datetime: return end -@pytest.mark.xfail(reason="Does not work with the metrics release health backend") +@patch("sentry.release_health.backend", SessionsReleaseHealthBackend()) class OrganizationSessionsEndpointTest(APITestCase, SnubaTestCase): def setUp(self): super().setUp() @@ -1314,7 +1315,7 @@ def test_release_stage_filter(self): @patch("sentry.release_health.backend", MetricsReleaseHealthBackend()) class OrganizationSessionsEndpointMetricsTest( - BaseMetricsTestCase, OrganizationSessionsEndpointTest + OrganizationSessionsEndpointTest, BaseMetricsTestCase ): """Repeat all tests with metrics backend""" diff --git a/tests/snuba/rules/conditions/test_event_frequency.py b/tests/snuba/rules/conditions/test_event_frequency.py index 648cca8e7fc7be..ee0c3f3098ba40 100644 --- a/tests/snuba/rules/conditions/test_event_frequency.py +++ b/tests/snuba/rules/conditions/test_event_frequency.py @@ -15,7 +15,12 @@ EventUniqueUserFrequencyCondition, ) from sentry.testutils.abstract import Abstract -from sentry.testutils.cases import PerformanceIssueTestCase, RuleTestCase, SnubaTestCase +from sentry.testutils.cases import ( + BaseMetricsTestCase, + PerformanceIssueTestCase, + RuleTestCase, + SnubaTestCase, +) from sentry.testutils.helpers.datetime import before_now, freeze_time, iso_format from sentry.testutils.skips import requires_snuba from sentry.utils.samples import load_data @@ -281,8 +286,7 @@ def increment(self, event, count, environment=None, timestamp=None): ) -@pytest.mark.xfail(reason="Does not work with the metrics release health backend") -class EventFrequencyPercentConditionTestCase(SnubaTestCase, RuleTestCase): +class EventFrequencyPercentConditionTestCase(BaseMetricsTestCase, RuleTestCase): __test__ = Abstract(__module__, __qualname__) rule_cls = EventFrequencyPercentCondition @@ -423,7 +427,7 @@ def test_comparison(self): # Test data is 2 events in the current period and 1 events in the comparison period. # Number of sessions is 20 in each period, so current period is 20% of sessions, prev - # is 10%. Overall a 100% increase comparitively. + # is 10%. Overall a 100% increase comparatively. event = self.add_event( data={"fingerprint": ["something_random"]}, project_id=self.project.id, From 73154060d84d6ee60796f833865eab8efaf1a1d7 Mon Sep 17 00:00:00 2001 From: Riccardo Busetti Date: Wed, 3 Apr 2024 14:51:38 +0200 Subject: [PATCH 14/15] Fix --- tests/snuba/api/endpoints/test_organization_sessions.py | 1 + tests/snuba/rules/conditions/test_event_frequency.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/snuba/api/endpoints/test_organization_sessions.py b/tests/snuba/api/endpoints/test_organization_sessions.py index 146085afd2ab87..480fd5f2f066dd 100644 --- a/tests/snuba/api/endpoints/test_organization_sessions.py +++ b/tests/snuba/api/endpoints/test_organization_sessions.py @@ -87,6 +87,7 @@ def adjust_end(end: datetime.datetime, interval: int) -> datetime.datetime: return end +# TODO: why is this not patching the backend correctly? @patch("sentry.release_health.backend", SessionsReleaseHealthBackend()) class OrganizationSessionsEndpointTest(APITestCase, SnubaTestCase): def setUp(self): diff --git a/tests/snuba/rules/conditions/test_event_frequency.py b/tests/snuba/rules/conditions/test_event_frequency.py index ee0c3f3098ba40..1ea81bfef90d23 100644 --- a/tests/snuba/rules/conditions/test_event_frequency.py +++ b/tests/snuba/rules/conditions/test_event_frequency.py @@ -311,7 +311,7 @@ def make_session(i): duration=None, errors=0, # The line below is crucial to spread sessions throughout the time period. - started=received - i, + started=received - i - 1, received=received, ) From 42ac0cc101dd26fb4d6b646abae49dabb3514aa6 Mon Sep 17 00:00:00 2001 From: Riccardo Busetti Date: Wed, 3 Apr 2024 16:21:47 +0200 Subject: [PATCH 15/15] xfail test --- tests/snuba/api/endpoints/test_organization_sessions.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/snuba/api/endpoints/test_organization_sessions.py b/tests/snuba/api/endpoints/test_organization_sessions.py index 480fd5f2f066dd..d82fc3749c0119 100644 --- a/tests/snuba/api/endpoints/test_organization_sessions.py +++ b/tests/snuba/api/endpoints/test_organization_sessions.py @@ -9,7 +9,6 @@ from sentry import release_health from sentry.models.releaseprojectenvironment import ReleaseProjectEnvironment from sentry.release_health.metrics import MetricsReleaseHealthBackend -from sentry.release_health.sessions import SessionsReleaseHealthBackend from sentry.snuba.metrics import to_intervals from sentry.testutils.cases import APITestCase, BaseMetricsTestCase, SnubaTestCase from sentry.testutils.helpers.datetime import freeze_time @@ -87,8 +86,9 @@ def adjust_end(end: datetime.datetime, interval: int) -> datetime.datetime: return end -# TODO: why is this not patching the backend correctly? -@patch("sentry.release_health.backend", SessionsReleaseHealthBackend()) +@pytest.mark.xfail( + reason="Deprecated test. Will be faded out once SessionsReleaseHealthBackend will be removed." +) class OrganizationSessionsEndpointTest(APITestCase, SnubaTestCase): def setUp(self): super().setUp()