diff --git a/src/sentry/snuba/snuba_query_validator.py b/src/sentry/snuba/snuba_query_validator.py index 10b8fa8db896e8..da12d3377d58c9 100644 --- a/src/sentry/snuba/snuba_query_validator.py +++ b/src/sentry/snuba/snuba_query_validator.py @@ -352,6 +352,13 @@ def _validate_time_window(self, value: int, dataset: Dataset): return time_window_seconds def _validate_performance_dataset(self, dataset): + if features.has( + "organizations:discover-saved-queries-deprecation", self.context["organization"] + ): + raise serializers.ValidationError( + f"The {dataset.value} dataset is being deprecated. Please use the 'events_analytics_platform' dataset with the `is_transaction:true` filter instead." + ) + if dataset != Dataset.Transactions: return dataset diff --git a/tests/sentry/incidents/endpoints/test_organization_alert_rule_index.py b/tests/sentry/incidents/endpoints/test_organization_alert_rule_index.py index f4f3a833cfedbf..12c621daa31ae4 100644 --- a/tests/sentry/incidents/endpoints/test_organization_alert_rule_index.py +++ b/tests/sentry/incidents/endpoints/test_organization_alert_rule_index.py @@ -1693,6 +1693,47 @@ def test_metric_alert_limit_unlimited_plan(self) -> None: alert_rule = AlertRule.objects.get(id=resp.data["id"]) assert alert_rule.name == "JustAValidTestRule" + def test_eap_alert_with_invalid_time_window(self) -> None: + data = deepcopy(self.alert_rule_dict) + data["dataset"] = "events_analytics_platform" + data["alertType"] = "eap_metrics" + data["timeWindow"] = 1 + with self.feature(["organizations:incidents", "organizations:performance-view"]): + resp = self.get_error_response(self.organization.slug, status_code=400, **data) + assert ( + resp.data["nonFieldErrors"][0] + == "Invalid Time Window: Time window for this alert type must be at least 5 minutes." + ) + + def test_transactions_dataset_deprecation_validation(self) -> None: + data = deepcopy(self.alert_rule_dict) + data["dataset"] = "transactions" + data["alertType"] = "performance" + + with self.feature( + ["organizations:incidents", "organizations:discover-saved-queries-deprecation"] + ): + resp = self.get_error_response(self.organization.slug, status_code=400, **data) + assert ( + resp.data["dataset"][0] + == "The transactions dataset is being deprecated. Please use the 'events_analytics_platform' dataset with the `is_transaction:true` filter instead." + ) + + def test_generic_metrics_dataset_deprecation_validation(self) -> None: + data = deepcopy(self.alert_rule_dict) + data["dataset"] = "generic_metrics" + data["alertType"] = "performance" + data["aggregate"] = "p95(transaction.duration)" + + with self.feature( + ["organizations:incidents", "organizations:discover-saved-queries-deprecation"] + ): + resp = self.get_error_response(self.organization.slug, status_code=400, **data) + assert ( + resp.data["dataset"][0] + == "The generic_metrics dataset is being deprecated. Please use the 'events_analytics_platform' dataset with the `is_transaction:true` filter instead." + ) + @freeze_time() class AlertRuleCreateEndpointTestCrashRateAlert(AlertRuleIndexBase): @@ -1821,18 +1862,6 @@ def test_crash_rate_alerts_kicks_off_slack_async_job( } mock_find_channel_id_for_alert_rule.assert_called_once_with(kwargs=kwargs) - def test_eap_alert_with_invalid_time_window(self) -> None: - data = deepcopy(self.alert_rule_dict) - data["dataset"] = "events_analytics_platform" - data["alertType"] = "eap_metrics" - data["timeWindow"] = 1 - with self.feature(["organizations:incidents", "organizations:performance-view"]): - resp = self.get_error_response(self.organization.slug, status_code=400, **data) - assert ( - resp.data["nonFieldErrors"][0] - == "Invalid Time Window: Time window for this alert type must be at least 5 minutes." - ) - @freeze_time() class MetricsCrashRateAlertCreationTest(AlertRuleCreateEndpointTestCrashRateAlert): diff --git a/tests/sentry/incidents/endpoints/test_serializers.py b/tests/sentry/incidents/endpoints/test_serializers.py index 7a67adfae6cfd5..d498e4a11565eb 100644 --- a/tests/sentry/incidents/endpoints/test_serializers.py +++ b/tests/sentry/incidents/endpoints/test_serializers.py @@ -187,6 +187,37 @@ def test_span_alert_time_window_validation(self) -> None: }, ) + def test_transactions_dataset_deprecation_validation(self) -> None: + """Test that transactions dataset is rejected when discover-saved-queries-deprecation flag is enabled""" + params = self.valid_transaction_params.copy() + + with self.feature("organizations:discover-saved-queries-deprecation"): + self.run_fail_validation_test( + params, + { + "dataset": [ + "The transactions dataset is being deprecated. Please use the 'events_analytics_platform' dataset with the `is_transaction:true` filter instead." + ] + }, + ) + + def test_generic_metrics_dataset_deprecation_validation(self) -> None: + """Test that generic_metrics dataset is rejected when discover-saved-queries-deprecation flag is enabled""" + params = self.valid_params.copy() + params["dataset"] = Dataset.PerformanceMetrics.value + params["event_types"] = [SnubaQueryEventType.EventType.TRANSACTION.name.lower()] + params["aggregate"] = "p95(transaction.duration)" + + with self.feature("organizations:discover-saved-queries-deprecation"): + self.run_fail_validation_test( + params, + { + "dataset": [ + "The generic_metrics dataset is being deprecated. Please use the 'events_analytics_platform' dataset with the `is_transaction:true` filter instead." + ] + }, + ) + def test_dataset(self) -> None: invalid_values = ["Invalid dataset, valid values are %s" % [item.value for item in Dataset]] self.run_fail_validation_test({"dataset": "events_wrong"}, {"dataset": invalid_values})