Skip to content
Merged
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
34 changes: 27 additions & 7 deletions src/sentry/api/serializers/models/alert_rule.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from __future__ import annotations

import logging
from collections import defaultdict
from collections.abc import Mapping, MutableMapping, Sequence
from datetime import datetime
Expand Down Expand Up @@ -31,6 +32,8 @@
from sentry.snuba.models import SnubaQueryEventType
from sentry.utils.actor import ActorTuple

logger = logging.getLogger(__name__)


class AlertRuleSerializerResponseOptional(TypedDict, total=False):
environment: str | None
Expand Down Expand Up @@ -330,20 +333,37 @@ def get_attrs(
incident_map[incident.id] = serialize(incident, user=user)

serialized_alert_rules = serialize(alert_rules, user=user)
rules = serialize(
serialized_map_by_id = {
serialized_alert["id"]: serialized_alert for serialized_alert in serialized_alert_rules
}

serialized_issue_rules = serialize(
[x for x in item_list if isinstance(x, Rule)],
user=user,
serializer=RuleSerializer(expand=self.expand),
)
serialized_issue_rule_map_by_id = {
serialized_rule["id"]: serialized_rule for serialized_rule in serialized_issue_rules
}

for item in item_list:
if isinstance(item, AlertRule):
alert_rule = serialized_alert_rules.pop(0)
item_id = str(item.id)
if item_id in serialized_map_by_id:
serialized_alert_rule = serialized_map_by_id[item_id]
if "latestIncident" in self.expand:
alert_rule["latestIncident"] = incident_map.get(item.incident_id) # type: ignore[attr-defined]
results[item] = alert_rule
elif isinstance(item, Rule):
results[item] = rules.pop(0)
serialized_alert_rule["latestIncident"] = incident_map.get(item.incident_id)
results[item] = serialized_alert_rule
elif item_id in serialized_issue_rule_map_by_id:
results[item] = serialized_issue_rule_map_by_id[item_id]
else:
logger.error(
"Alert Rule found but dropped during serialization",
extra={
"id": item_id,
"issue_rule": isinstance(item, Rule),
"metric_rule": isinstance(item, AlertRule),
},
)

return results

Expand Down