Cuándo
15-09-2026 (v1.132.14, task #310).
Síntomas visibles
Ninguno directamente visible — ese es el problema: dos reglas de alerta de vmalert (HighResponseTime y DatabaseConnectionError) llevaban tiempo configuradas pero no podían disparar nunca, porque apuntaban a métricas que la aplicación no emitía. Un incidente real de latencia alta o de errores de conexión a base de datos no habría generado ningún aviso.
Causa raíz
HighResponseTimeapuntaba a un nombre de métrica que no coincidía con el que exponedjango-prometheus(django_http_requests_latency_seconds_by_view_method_bucketes el real).DatabaseConnectionErrordependía dedjango_db_errors_total, una métrica que solo existe si el motor de base de datos está instrumentado — y no lo estaba en producción, desarrollo ni test.
Sin un test que compare cada métrica nombrada en alerts.yml contra las métricas que la app realmente registra, una regla de alerta puede quedar “ciega” indefinidamente sin que nada lo note.
Fix aplicado
8a76981 — corrige el nombre de la métrica de HighResponseTime; activa el motor de BD instrumentado de django-prometheus en production.py, dev.py y test.py para que django_db_errors_total exista de verdad. Añade un test de contrato: toda métrica nombrada en alerts.yml debe estar registrada por la app (tests/observability/test_alert_rules_metrics_exist_310.py, 77 líneas) — para que esta clase de regresión no pueda volver a colarse en silencio.
Lecciones
Una regla de alerta mal configurada es peor que no tener regla: da falsa sensación de cobertura. El síntoma no es un pico ni un log — es la AUSENCIA de un disparo que debería haber ocurrido, y eso solo se descubre auditando la configuración contra las métricas reales, no esperando al incidente.
Preventivos futuros
El test de contrato queda como gate: cualquier alerta nueva en alerts.yml que nombre una métrica no registrada rompe CI antes de llegar a producción.
Véase también
- [[incident—20260916—graficas-bandwidth-caidas-falsas-eurofinance]]
- [[entity—monitoring—targetlistout-payload-slim]]
- [[incident—20260921—dashboards-informes-sai-wifi-campos-sin-consulta]]
Referenciado desde
- 40 caídas falsas en 4h en las gráficas de Bandwidth — ventana de consulta demasiado corta para el ciclo lento del Agente
- Gráficas de SAI y WiFi vacías por desajuste de nombre de campo entre tablero/informe y servidor
- MonitoringTargetListOut — lista de equipos sin las claves solo-Agente (1,05 MB → ~0,1 MB)
- Runbook: chequeo diario de alertas ciegas de vmalert (alertas-ciegas-check.sh)