Skip to content

Commit 4ec2131

Browse files
committed
perf(alerts): Limit GroupEvent processing to relevant groups
1 parent e984248 commit 4ec2131

File tree

2 files changed

+32
-3
lines changed

2 files changed

+32
-3
lines changed

src/sentry/rules/processing/delayed_processing.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -297,12 +297,17 @@ def get_group_to_groupevent(
297297
groups = Group.objects.filter(id__in=group_ids)
298298
group_id_to_group = {group.id: group for group in groups}
299299

300+
# Filter down to only the event data for the groups we've been asked to process.
301+
relevant_rulegroup_to_event_data = {
302+
key: value for key, value in parsed_rulegroup_to_event_data.items() if key[1] in group_ids
303+
}
304+
300305
# Use a list comprehension for event_ids
301306
event_ids: list[str] = [
302307
event_id
303308
for event_id in (
304309
instance_data.get("event_id")
305-
for instance_data in parsed_rulegroup_to_event_data.values()
310+
for instance_data in relevant_rulegroup_to_event_data.values()
306311
)
307312
if event_id is not None
308313
]
@@ -312,7 +317,7 @@ def get_group_to_groupevent(
312317
occurrence_id
313318
for occurrence_id in (
314319
instance_data.get("occurrence_id")
315-
for instance_data in parsed_rulegroup_to_event_data.values()
320+
for instance_data in relevant_rulegroup_to_event_data.values()
316321
)
317322
if occurrence_id is not None
318323
]
@@ -325,7 +330,7 @@ def get_group_to_groupevent(
325330
}
326331

327332
return build_group_to_groupevent(
328-
parsed_rulegroup_to_event_data,
333+
relevant_rulegroup_to_event_data,
329334
bulk_event_id_to_events,
330335
bulk_occurrence_id_to_occurrence,
331336
group_id_to_group,

tests/sentry/rules/processing/test_delayed_processing.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -378,6 +378,30 @@ def test_invalid_group_ids(self):
378378
result = get_group_to_groupevent(self.parsed_data, self.project.id, {0})
379379
assert len(result) == 0
380380

381+
def test_filtered_group_ids(self):
382+
"""Test that get_group_to_groupevent only requests events for specified group IDs."""
383+
# Track which event IDs are requested
384+
requested_event_ids = set()
385+
386+
original_bulk_fetch_events = bulk_fetch_events
387+
388+
def mock_bulk_fetch_events(event_ids, project_id):
389+
requested_event_ids.update(event_ids)
390+
return original_bulk_fetch_events(event_ids, project_id)
391+
392+
with patch(
393+
"sentry.rules.processing.delayed_processing.bulk_fetch_events",
394+
side_effect=mock_bulk_fetch_events,
395+
):
396+
# Call get_group_to_groupevent with only group1
397+
result = get_group_to_groupevent(self.parsed_data, self.project.id, {self.group1.id})
398+
399+
# Verify only event1 was requested
400+
assert requested_event_ids == {self.event1.event_id}
401+
assert len(result) == 1
402+
assert result[self.group1] == self.event1
403+
assert self.group2 not in result
404+
381405

382406
class GetRulesToFireTest(TestCase):
383407
def setUp(self):

0 commit comments

Comments
 (0)