Skip to content

Commit c7a6710

Browse files
authored
chore: Prevent users from creating txn alerts thru api (#101177)
It's already prevented in the UI when the flag is enabled
1 parent 9007b32 commit c7a6710

File tree

3 files changed

+79
-12
lines changed

3 files changed

+79
-12
lines changed

src/sentry/snuba/snuba_query_validator.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,13 @@ def _validate_time_window(self, value: int, dataset: Dataset):
352352
return time_window_seconds
353353

354354
def _validate_performance_dataset(self, dataset):
355+
if features.has(
356+
"organizations:discover-saved-queries-deprecation", self.context["organization"]
357+
):
358+
raise serializers.ValidationError(
359+
f"The {dataset.value} dataset is being deprecated. Please use the 'events_analytics_platform' dataset with the `is_transaction:true` filter instead."
360+
)
361+
355362
if dataset != Dataset.Transactions:
356363
return dataset
357364

tests/sentry/incidents/endpoints/test_organization_alert_rule_index.py

Lines changed: 41 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1693,6 +1693,47 @@ def test_metric_alert_limit_unlimited_plan(self) -> None:
16931693
alert_rule = AlertRule.objects.get(id=resp.data["id"])
16941694
assert alert_rule.name == "JustAValidTestRule"
16951695

1696+
def test_eap_alert_with_invalid_time_window(self) -> None:
1697+
data = deepcopy(self.alert_rule_dict)
1698+
data["dataset"] = "events_analytics_platform"
1699+
data["alertType"] = "eap_metrics"
1700+
data["timeWindow"] = 1
1701+
with self.feature(["organizations:incidents", "organizations:performance-view"]):
1702+
resp = self.get_error_response(self.organization.slug, status_code=400, **data)
1703+
assert (
1704+
resp.data["nonFieldErrors"][0]
1705+
== "Invalid Time Window: Time window for this alert type must be at least 5 minutes."
1706+
)
1707+
1708+
def test_transactions_dataset_deprecation_validation(self) -> None:
1709+
data = deepcopy(self.alert_rule_dict)
1710+
data["dataset"] = "transactions"
1711+
data["alertType"] = "performance"
1712+
1713+
with self.feature(
1714+
["organizations:incidents", "organizations:discover-saved-queries-deprecation"]
1715+
):
1716+
resp = self.get_error_response(self.organization.slug, status_code=400, **data)
1717+
assert (
1718+
resp.data["dataset"][0]
1719+
== "The transactions dataset is being deprecated. Please use the 'events_analytics_platform' dataset with the `is_transaction:true` filter instead."
1720+
)
1721+
1722+
def test_generic_metrics_dataset_deprecation_validation(self) -> None:
1723+
data = deepcopy(self.alert_rule_dict)
1724+
data["dataset"] = "generic_metrics"
1725+
data["alertType"] = "performance"
1726+
data["aggregate"] = "p95(transaction.duration)"
1727+
1728+
with self.feature(
1729+
["organizations:incidents", "organizations:discover-saved-queries-deprecation"]
1730+
):
1731+
resp = self.get_error_response(self.organization.slug, status_code=400, **data)
1732+
assert (
1733+
resp.data["dataset"][0]
1734+
== "The generic_metrics dataset is being deprecated. Please use the 'events_analytics_platform' dataset with the `is_transaction:true` filter instead."
1735+
)
1736+
16961737

16971738
@freeze_time()
16981739
class AlertRuleCreateEndpointTestCrashRateAlert(AlertRuleIndexBase):
@@ -1821,18 +1862,6 @@ def test_crash_rate_alerts_kicks_off_slack_async_job(
18211862
}
18221863
mock_find_channel_id_for_alert_rule.assert_called_once_with(kwargs=kwargs)
18231864

1824-
def test_eap_alert_with_invalid_time_window(self) -> None:
1825-
data = deepcopy(self.alert_rule_dict)
1826-
data["dataset"] = "events_analytics_platform"
1827-
data["alertType"] = "eap_metrics"
1828-
data["timeWindow"] = 1
1829-
with self.feature(["organizations:incidents", "organizations:performance-view"]):
1830-
resp = self.get_error_response(self.organization.slug, status_code=400, **data)
1831-
assert (
1832-
resp.data["nonFieldErrors"][0]
1833-
== "Invalid Time Window: Time window for this alert type must be at least 5 minutes."
1834-
)
1835-
18361865

18371866
@freeze_time()
18381867
class MetricsCrashRateAlertCreationTest(AlertRuleCreateEndpointTestCrashRateAlert):

tests/sentry/incidents/endpoints/test_serializers.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,37 @@ def test_span_alert_time_window_validation(self) -> None:
187187
},
188188
)
189189

190+
def test_transactions_dataset_deprecation_validation(self) -> None:
191+
"""Test that transactions dataset is rejected when discover-saved-queries-deprecation flag is enabled"""
192+
params = self.valid_transaction_params.copy()
193+
194+
with self.feature("organizations:discover-saved-queries-deprecation"):
195+
self.run_fail_validation_test(
196+
params,
197+
{
198+
"dataset": [
199+
"The transactions dataset is being deprecated. Please use the 'events_analytics_platform' dataset with the `is_transaction:true` filter instead."
200+
]
201+
},
202+
)
203+
204+
def test_generic_metrics_dataset_deprecation_validation(self) -> None:
205+
"""Test that generic_metrics dataset is rejected when discover-saved-queries-deprecation flag is enabled"""
206+
params = self.valid_params.copy()
207+
params["dataset"] = Dataset.PerformanceMetrics.value
208+
params["event_types"] = [SnubaQueryEventType.EventType.TRANSACTION.name.lower()]
209+
params["aggregate"] = "p95(transaction.duration)"
210+
211+
with self.feature("organizations:discover-saved-queries-deprecation"):
212+
self.run_fail_validation_test(
213+
params,
214+
{
215+
"dataset": [
216+
"The generic_metrics dataset is being deprecated. Please use the 'events_analytics_platform' dataset with the `is_transaction:true` filter instead."
217+
]
218+
},
219+
)
220+
190221
def test_dataset(self) -> None:
191222
invalid_values = ["Invalid dataset, valid values are %s" % [item.value for item in Dataset]]
192223
self.run_fail_validation_test({"dataset": "events_wrong"}, {"dataset": invalid_values})

0 commit comments

Comments
 (0)