diff --git a/src/sentry/monitors/serializers.py b/src/sentry/monitors/serializers.py index cc685027f3f3..145661f27cee 100644 --- a/src/sentry/monitors/serializers.py +++ b/src/sentry/monitors/serializers.py @@ -109,10 +109,29 @@ def get_attrs( ) } + # Build date_added mapping, starting with cached monitors + date_added_by_monitor_id = {} + uncached_monitor_ids = set[int]() + + for monitor_env in item_list: + if monitor_env.is_field_cached("monitor"): + # Extract date_added from cached monitor + date_added_by_monitor_id[monitor_env.monitor_id] = monitor_env.monitor.date_added + else: + # Need to fetch this monitor + uncached_monitor_ids.add(monitor_env.monitor_id) + + # Batch query for uncached monitors - only fetch date_added field + if uncached_monitor_ids: + date_added_by_monitor_id.update( + Monitor.objects.filter(id__in=uncached_monitor_ids).values_list("id", "date_added") + ) + return { monitor_env: { "environment": environments.get(monitor_env.environment_id), "active_incident": serialized_incidents.get(monitor_env.id), + "date_added": date_added_by_monitor_id[monitor_env.monitor_id], } for monitor_env in item_list } @@ -123,7 +142,7 @@ def serialize(self, obj, attrs, user, **kwargs) -> MonitorEnvironmentSerializerR "name": environment.name if environment else "[removed]", "status": obj.get_status_display(), "isMuted": obj.is_muted, - "dateCreated": obj.monitor.date_added, + "dateCreated": attrs["date_added"], "lastCheckIn": obj.last_checkin, "nextCheckIn": obj.next_checkin, "nextCheckInLatest": obj.next_checkin_latest, @@ -239,6 +258,12 @@ def get_attrs(self, item_list, user, **kwargs): ) monitor_environments = list(monitor_environments_qs) + + # Pre-cache monitors on the environments to avoid queries in MonitorEnvironmentSerializer + monitors_by_id = {monitor.id: monitor for monitor in item_list} + for monitor_env in monitor_environments: + monitor_env.set_cached_field_value("monitor", monitors_by_id[monitor_env.monitor_id]) + serialized_monitor_environments = defaultdict(list) for monitor_env, serialized in zip(