Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions src/sentry/snuba/snuba_query_validator.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down Expand Up @@ -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):
Expand Down
31 changes: 31 additions & 0 deletions tests/sentry/incidents/endpoints/test_serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -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})
Expand Down