Skip to content

Commit 17e897b

Browse files
authored
perf(uptime): Bulk load data needed for process_detectors, and call it directly from the uptime result consumer (#96269)
This saves us an extra query reloading things. Previously we did this, but hadn't loaded the required related objects, so it was less efficient. <!-- Describe your PR here. -->
1 parent 84a1b56 commit 17e897b

File tree

2 files changed

+15
-8
lines changed

2 files changed

+15
-8
lines changed

src/sentry/uptime/consumers/results_consumer.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,13 @@
4545
send_uptime_config_deletion,
4646
update_remote_uptime_subscription,
4747
)
48-
from sentry.uptime.types import DATA_SOURCE_UPTIME_SUBSCRIPTION, IncidentStatus, UptimeMonitorMode
48+
from sentry.uptime.types import IncidentStatus, UptimeMonitorMode
4949
from sentry.utils import metrics
5050
from sentry.utils.arroyo_producer import SingletonProducer
5151
from sentry.utils.kafka_config import get_kafka_producer_cluster_options, get_topic_definition
5252
from sentry.workflow_engine.models.data_source import DataPacket
5353
from sentry.workflow_engine.models.detector import Detector
54-
from sentry.workflow_engine.processors.data_packet import process_data_packet
54+
from sentry.workflow_engine.processors import process_detectors
5555

5656
logger = logging.getLogger(__name__)
5757

@@ -310,9 +310,8 @@ def handle_active_result(
310310
subscription=uptime_subscription,
311311
metric_tags=metric_tags,
312312
)
313-
process_data_packet(
314-
DataPacket(source_id=str(uptime_subscription.id), packet=packet),
315-
DATA_SOURCE_UPTIME_SUBSCRIPTION,
313+
process_detectors(
314+
DataPacket(source_id=str(uptime_subscription.id), packet=packet), [detector]
316315
)
317316

318317
# Bail if we're doing issue creation via detectors, we don't want to
@@ -444,7 +443,7 @@ def handle_result(self, subscription: UptimeSubscription | None, result: CheckRe
444443
if should_run_region_checks(subscription, result):
445444
try_check_and_update_regions(subscription, subscription_regions)
446445

447-
detector = get_detector(subscription)
446+
detector = get_detector(subscription, prefetch_workflow_data=True)
448447

449448
# Nothing to do if there's an orphaned project subscription
450449
if not detector:

src/sentry/uptime/models.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -348,7 +348,9 @@ def get_current_instance_count(org: Organization) -> int:
348348
raise NotImplementedError
349349

350350

351-
def get_detector(uptime_subscription: UptimeSubscription) -> Detector | None:
351+
def get_detector(
352+
uptime_subscription: UptimeSubscription, prefetch_workflow_data=False
353+
) -> Detector | None:
352354
"""
353355
Fetches a workflow_engine Detector given an existing uptime_subscription.
354356
This is used during the transition period moving uptime to detector.
@@ -358,9 +360,15 @@ def get_detector(uptime_subscription: UptimeSubscription) -> Detector | None:
358360
type=DATA_SOURCE_UPTIME_SUBSCRIPTION,
359361
source_id=str(uptime_subscription.id),
360362
)
361-
return Detector.objects.select_related("project", "project__organization").get(
363+
qs = Detector.objects.filter(
362364
type=GROUP_TYPE_UPTIME_DOMAIN_CHECK_FAILURE, data_sources=data_source[:1]
363365
)
366+
select_related = ["project", "project__organization"]
367+
if prefetch_workflow_data:
368+
select_related.append("workflow_condition_group")
369+
qs = qs.prefetch_related("workflow_condition_group__conditions")
370+
qs = qs.select_related(*select_related)
371+
return qs.get()
364372
except Detector.DoesNotExist:
365373
return None
366374

0 commit comments

Comments
 (0)