CreaRack-SL

Runbook: chequeo diario de alertas ciegas de vmalert (alertas-ciegas-check.sh)

Propósito

Chequeo diario, corrido en OPS, que responde una pregunta muy concreta: ¿cada alarma de vmalert sigue apuntando a una métrica que la aplicación realmente produce? Nace de un incidente real — [[incident—20260915—vmalert-alertas-ciegas]] — donde dos alarmas de salud llevaban meses sin poder dispararse porque nombraban métricas inexistentes, y nada lo detectó hasta una auditoría manual. Este script convierte esa auditoría puntual en vigilancia continua.

Cómo funciona

  1. Lee observability/victoriametrics/alerts.yml desde origin/main del clon de CreaRack Pro en /opt/crearack-pro.
  2. Extrae de cada regla las métricas nombradas en su expresión PromQL (mismo criterio que el test de contrato tests/observability/test_alert_rules_metrics_exist_310.py).
  3. Pregunta a VictoriaMetrics de PROD (count(<métrica>), puerto 8428, alcanzable por NetBird — vmalert, en el puerto 8880, no lo es desde OPS) si esa métrica tiene series recientes. Desde el 25-09-2026 (mega-auditoría B-45, commit f90cb92) ese puerto pasa por el proxy vmauth y pide credencial ([[decision—20260925—vmauth-auth-netbird-b45]]): el script llama curl --netrc-file con el usuario de solo lectura alertas (restringido a /api/v1/query, sin permiso de borrado), leído de /opt/alertas-ciegas/.netrc. Si el fichero falta, el script aborta con un error claro sin sellar estado — no cuenta como ceguera real, es la sonda sin credencial la que falla.
  4. Para contadores que solo nacen con su primer evento (como django_db_errors_total), no comprueba la métrica directamente sino su “hermana de vida” (django_db_execute_total) — así no confunde “sistema sano, cero errores todavía” con “motor de métricas apagado”.
  5. Si una alarma queda sin series, la marca CIEGA; si VictoriaMetrics no responde (o rechaza la credencial), el script aborta sin sellar estado, para que sea el heartbeat — y no una ceguera falsa — quien avise.

Uso

  • alertas-ciegas-check.sh — modo normal, el que corre en el cron.
  • --dry-run — imprime el resultado sin sellar estado ni enviar correo.
  • --rules-file <yml> — usa un fichero de reglas alternativo (combinable con --dry-run).
  • --test-alert — simulacro del camino de fallo: inyecta una regla con una métrica inventada y envía el correo real marcado como prueba.

Avisa a infra@esfericlabs.com solo en transiciones (nueva ceguera o recuperación), vía send_maintenance_email del MCP del workspace — mismo patrón sin ruido que servicios-check y cron-heartbeat.

Despliegue

  • Instalado en /opt/alertas-ciegas/ en OPS.
  • Cron diario a las 06:45 UTC (/etc/cron.d/alertas-ciegas).
  • Vigilado por el propio cron-heartbeat (ventana de 26 horas).
  • Inventariado en public/supercontext/AUTOMATISMOS.md.
  • Desde el 25-09-2026 (B-45): requiere /opt/alertas-ciegas/.netrc (permisos 600, root) con el usuario de solo lectura alertas de vmauth — receta para crearlo/rotarlo en context/INFRA.md del repo Pro, sección vmauth. La contraseña completa del equipo nunca se deja en OPS.

Primera pasada

Verificada el 15-09-2026: 5 de 5 alarmas sanas, y el simulacro --test-alert generó el correo real en infra@, confirmado por el conector de Zoho.

Véase también

  • [[incident—20260915—vmalert-alertas-ciegas]]
  • [[runbook—observability—alerting-setup-dokploy]]
  • [[entity—observability—service—vmalert]]
  • [[crearack-tech—observability—alarmas-prod]]
  • [[crearack-tech—admin—monitoring-tools]]
  • [[decision—20260925—vmauth-auth-netbird-b45]]