CreaRack-SL

Dos alertas de salud de vmalert que nunca podían disparar (métrica inexistente)

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

  • HighResponseTime apuntaba a un nombre de métrica que no coincidía con el que expone django-prometheus (django_http_requests_latency_seconds_by_view_method_bucket es el real).
  • DatabaseConnectionError dependía de django_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]]