Skip to content

Commit 7b261d2

Browse files
authored
feat(aci): Add alert rule id to detector (#95912)
Going from the detector to the alert rule is very helpful in the ui. "Go to old ui" Ideally removed once we stop mirroring detectors to alert rules.
1 parent e673fb2 commit 7b261d2

File tree

3 files changed

+55
-0
lines changed

3 files changed

+55
-0
lines changed

src/sentry/workflow_engine/endpoints/serializers.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
from sentry.utils.cursors import Cursor, CursorResult
2323
from sentry.workflow_engine.models import (
2424
Action,
25+
AlertRuleDetector,
2526
DataCondition,
2627
DataConditionGroup,
2728
DataSource,
@@ -310,6 +311,17 @@ def get_attrs(
310311
for detector_id, workflow_id in detector_workflows:
311312
workflows_map[detector_id].append(str(workflow_id))
312313

314+
# Fetch alert rule mappings
315+
# TODO: Remove alert rule mappings as they're deprecated
316+
alert_rule_mappings = list(AlertRuleDetector.objects.filter(detector__in=item_list))
317+
alert_rule_map = {
318+
mapping.detector_id: {
319+
"alert_rule_id": mapping.alert_rule_id,
320+
"rule_id": mapping.rule_id,
321+
}
322+
for mapping in alert_rule_mappings
323+
}
324+
313325
filtered_item_list = [item for item in item_list if item.type == ErrorGroupType.slug]
314326
project_ids = [item.project_id for item in filtered_item_list]
315327

@@ -331,6 +343,13 @@ def get_attrs(
331343
str(item.workflow_condition_group_id)
332344
)
333345
attrs[item]["workflow_ids"] = workflows_map[item.id]
346+
attrs[item]["alert_rule_mapping"] = alert_rule_map.get(
347+
item.id,
348+
{
349+
"alert_rule_id": None,
350+
"rule_id": None,
351+
},
352+
)
334353
if item.id in configs:
335354
attrs[item]["config"] = configs[item.id]
336355
else:
@@ -342,6 +361,7 @@ def get_attrs(
342361
return attrs
343362

344363
def serialize(self, obj: Detector, attrs: Mapping[str, Any], user, **kwargs) -> dict[str, Any]:
364+
alert_rule_mapping = attrs.get("alert_rule_mapping", {})
345365
return {
346366
"id": str(obj.id),
347367
"projectId": str(obj.project_id),
@@ -356,6 +376,8 @@ def serialize(self, obj: Detector, attrs: Mapping[str, Any], user, **kwargs) ->
356376
"conditionGroup": attrs.get("condition_group"),
357377
"config": convert_dict_key_case(attrs.get("config"), snake_to_camel_case),
358378
"enabled": obj.enabled,
379+
"alertRuleId": alert_rule_mapping.get("alert_rule_id"),
380+
"ruleId": alert_rule_mapping.get("rule_id"),
359381
}
360382

361383

tests/sentry/workflow_engine/endpoints/test_organization_detector_details.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
from sentry.testutils.silo import assume_test_silo_mode, region_silo_test
2222
from sentry.testutils.skips import requires_kafka, requires_snuba
2323
from sentry.workflow_engine.models import (
24+
AlertRuleDetector,
2425
DataCondition,
2526
DataConditionGroup,
2627
DataSource,
@@ -108,6 +109,34 @@ def test_pending_deletion(self):
108109
detector.save()
109110
self.get_error_response(self.organization.slug, detector.id, status_code=404)
110111

112+
def test_with_alert_rule_mapping(self):
113+
# Create a metric alert rule mapping
114+
metric_alert_id = 12345
115+
AlertRuleDetector.objects.create(alert_rule_id=metric_alert_id, detector=self.detector)
116+
117+
response = self.get_success_response(self.organization.slug, self.detector.id)
118+
119+
assert response.data["alertRuleId"] == metric_alert_id
120+
assert response.data["ruleId"] is None
121+
122+
def test_with_issue_rule_mapping(self):
123+
# Create an issue alert rule mapping
124+
issue_rule_id = 67890
125+
AlertRuleDetector.objects.create(rule_id=issue_rule_id, detector=self.detector)
126+
127+
response = self.get_success_response(self.organization.slug, self.detector.id)
128+
129+
assert response.data["ruleId"] == issue_rule_id
130+
assert response.data["alertRuleId"] is None
131+
132+
def test_without_alert_rule_mapping(self):
133+
"""Test that alertRuleId and ruleId are null when no mapping exists"""
134+
response = self.get_success_response(self.organization.slug, self.detector.id)
135+
136+
# Verify the mapping fields are null when no mapping exists
137+
assert response.data["alertRuleId"] is None
138+
assert response.data["ruleId"] is None
139+
111140

112141
@region_silo_test
113142
class OrganizationDetectorDetailsPutTest(OrganizationDetectorDetailsBaseTest):

tests/sentry/workflow_engine/endpoints/test_serializers.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ def test_serialize_simple(self):
5050
},
5151
"owner": None,
5252
"enabled": detector.enabled,
53+
"alertRuleId": None,
54+
"ruleId": None,
5355
}
5456

5557
def test_serialize_full(self):
@@ -164,6 +166,8 @@ def test_serialize_full(self):
164166
},
165167
"owner": self.user.get_actor_identifier(),
166168
"enabled": detector.enabled,
169+
"alertRuleId": None,
170+
"ruleId": None,
167171
}
168172

169173
def test_serialize_bulk(self):

0 commit comments

Comments
 (0)