CreaRack-SL

Servicio de Consulta de Ventanas de Mantenimiento (SLA)

Descripción

Función is_in_maintenance_window(target) en monitoring/services/sla_service.py que determina si un objetivo está actualmente bajo una ventana de mantenimiento que suprime insights.

Firma

def is_in_maintenance_window(target: MonitoringTarget) -> bool

Retorna True si el target está en una ventana activa que suprime insights.

Lógica

Una ventana de mantenimiento suprime insights si:

  1. Pertenece a la misma organización que el target
  2. Está habilitada para suprimir (suppress_insights=True)
  3. Es temporalmente activa (start_at ≤ now ≤ end_at)
  4. Y es org-wide (targets.isnull()) O incluye explícitamente este target

Implementación Anterior (N+1)

windows = MaintenanceWindow.objects.filter(
    organization=target.organization,
    suppress_insights=True,
    start_at__lte=now,
    end_at__gte=now,
)
return any(not w.targets.exists() or w.targets.filter(id=target.id).exists() for w in windows)

Problema: Cargaba TODAS las ventanas activas, luego probaba M2M por cada una.

Implementación Actual (sa4 B12)

return (
    MaintenanceWindow.objects.filter(
        organization=target.organization,
        suppress_insights=True,
        start_at__lte=now,
        end_at__gte=now,
    )
    .filter(Q(targets__isnull=True) | Q(targets=target))
    .exists()
)

Beneficio: Una sola query con filtro Q compuesto. El ORM de Django maneja la lógica OR en SQL.

Dependencias

  • Modelos: MaintenanceWindow, MonitoringTarget, Organization
  • Django: timezone.now(), Q()

Integración

Llamada por:

  • Evaluador de alertas (antes de crear un nuevo AlertEvent)
  • Checks de SLA para excluir ventanas de mantenimiento del cálculo

Véase también

  • [[feature—monitoring—sa4-baja-cleanup]]
  • [[entity—monitoring—model—maintenance-window]]
  • [[entity—monitoring—service—sla-metrics-calculator]]
  • [[concept—monitoring—maintenance-window]]