Skip to content

Commit 52b4012

Browse files
author
Cathy Teng
committed
use singular preferred detector in workflow processing
1 parent f69458f commit 52b4012

File tree

3 files changed

+23
-10
lines changed

3 files changed

+23
-10
lines changed

src/sentry/workflow_engine/processors/detector.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,10 @@ def get_detectors_for_event(
301301

302302

303303
def get_detector_by_event(event_data: WorkflowEventData) -> Detector:
304+
"""
305+
Returns the detector from the GroupEvent in event_data.
306+
"""
307+
304308
evt = event_data.event
305309

306310
if not isinstance(evt, GroupEvent):
@@ -311,7 +315,7 @@ def get_detector_by_event(event_data: WorkflowEventData) -> Detector:
311315
issue_occurrence = evt.occurrence
312316

313317
try:
314-
if issue_occurrence is None or evt.group.issue_type.detector_settings is None:
318+
if issue_occurrence is None or evt.group.issue_type == ErrorGroupType:
315319
# if there are no detector settings, default to the error detector
316320
detector = Detector.get_error_detector_for_project(evt.project_id)
317321
else:
@@ -361,9 +365,16 @@ def get_detector_by_group(group: Group) -> Detector:
361365

362366

363367
def get_detector_from_event_data(event_data: WorkflowEventData) -> Detector:
368+
"""
369+
Essentially the same as get_detectors_for_event except we look up the detector for the Activity instead of expecting it to be passed in.
370+
"""
371+
364372
try:
365373
if isinstance(event_data.event, GroupEvent):
366-
return get_detector_by_event(event_data)
374+
event_detectors = get_detectors_for_event(event_data)
375+
if event_detectors is None:
376+
raise Detector.DoesNotExist("No detectors found for event")
377+
return event_detectors.preferred_detector
367378
elif isinstance(event_data.event, Activity):
368379
return get_detector_by_group(event_data.group)
369380
else:

src/sentry/workflow_engine/processors/workflow.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from collections.abc import Collection, Sequence
1+
from collections.abc import Sequence
22
from dataclasses import asdict, replace
33
from datetime import datetime
44
from enum import StrEnum
@@ -380,7 +380,7 @@ def get_environment_by_event(event_data: WorkflowEventData) -> Environment | Non
380380

381381
@scopedstats.timer()
382382
def _get_associated_workflows(
383-
detectors: Collection[Detector], environment: Environment | None, event_data: WorkflowEventData
383+
detector: Detector, environment: Environment | None, event_data: WorkflowEventData
384384
) -> set[Workflow]:
385385
"""
386386
This is a wrapper method to get the workflows associated with a detector and environment.
@@ -394,7 +394,7 @@ def _get_associated_workflows(
394394
workflows = set(
395395
Workflow.objects.filter(
396396
environment_filter,
397-
detectorworkflow__detector_id__in=[detector.id for detector in detectors],
397+
detectorworkflow__detector_id=detector.id,
398398
enabled=True,
399399
)
400400
.select_related("environment")
@@ -421,7 +421,7 @@ def _get_associated_workflows(
421421
"event_data": asdict(event_data),
422422
"event_environment_id": environment.id if environment else None,
423423
"workflows": [workflow.id for workflow in workflows],
424-
"detector_types": [detector.type for detector in detectors],
424+
"detector_type": detector.type,
425425
},
426426
)
427427

@@ -500,7 +500,9 @@ def process_workflows(
500500
if features.has("organizations:workflow-engine-process-workflows-logs", organization):
501501
log_context.set_verbose(True)
502502

503-
workflows = _get_associated_workflows(event_detectors.detectors, environment, event_data)
503+
workflows = _get_associated_workflows(
504+
event_detectors.preferred_detector, environment, event_data
505+
)
504506
workflow_evaluation_data.workflows = workflows
505507

506508
if not workflows:

tests/sentry/workflow_engine/processors/test_workflow.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -464,8 +464,8 @@ def test_uses_issue_stream_workflows(self) -> None:
464464
assert len(result.data.triggered_actions) == 0
465465

466466
@override_options({"workflow_engine.exclude_issue_stream_detector": False})
467-
def test_multiple_detectors(self) -> None:
468-
issue_stream_workflow, issue_stream_detector, _, _ = self.create_detector_and_workflow(
467+
def test_multiple_detectors__preferred(self) -> None:
468+
_, issue_stream_detector, _, _ = self.create_detector_and_workflow(
469469
name_prefix="issue_stream",
470470
workflow_triggers=self.create_data_condition_group(),
471471
detector_type=IssueStreamGroupType.slug,
@@ -476,7 +476,7 @@ def test_multiple_detectors(self) -> None:
476476
)
477477

478478
result = process_workflows(self.batch_client, self.event_data, FROZEN_TIME)
479-
assert result.data.triggered_workflows == {self.error_workflow, issue_stream_workflow}
479+
assert result.data.triggered_workflows == {self.error_workflow}
480480
assert result.data.associated_detector == self.error_detector
481481

482482

0 commit comments

Comments
 (0)