Ir al contenido
AppsSDAR

Un /health que no consulta la base de datos está mintiendo

5 min de lectura

Casi todo sistema en producción termina con un endpoint /health que un panel de monitoreo consulta cada cierto tiempo. El error más común, y el más fácil de cometer sin darse cuenta, es que ese endpoint responda 200 OK con solo comprobar que el proceso sigue corriendo — sin verificar nada de lo que ese proceso en realidad necesita para funcionar.

Un proceso vivo no es lo mismo que un sistema funcionando

Node.js puede seguir respondiendo peticiones HTTP perfectamente aunque la conexión a PostgreSQL se haya caído hace diez minutos. Si el /health solo hace res.send('ok') sin tocar la base de datos, va a seguir devolviendo verde mientras cualquier operación real del sistema —iniciar sesión, guardar un pedido, procesar un pago— está fallando en silencio. El panel de monitoreo, mientras tanto, muestra todo en orden.

Qué debería verificar de verdad

Un health check útil hace al menos una consulta real y barata contra cada dependencia crítica del sistema —típicamente, un SELECT 1 contra la base de datos— y solo devuelve 200 si esa consulta responde a tiempo. Si la base de datos no responde, o tarda más de lo razonable, el endpoint debe devolver 503 Service Unavailable, no un 200 con un mensaje de error en el cuerpo que nadie automatizado va a leer. El código de estado HTTP es lo que un panel de monitoreo revisa primero; el contenido de la respuesta casi nunca se inspecciona con el mismo cuidado.

Por qué esto es una política, no una sugerencia

En AppsSDAR, todo sistema que llega a producción se engancha al panel interno de monitoreo con esta regla fija: el /health tiene que consultar la base de datos y devolver 503 si falla, sin excepción. No es una buena práctica opcional — es la diferencia entre enterarme de un problema en el sistema de un cliente por una alerta automática en minutos, o enterarme porque ese cliente escribe molesto horas después preguntando por qué su sistema no funciona.

Un extra que vale la pena: separar "vivo" de "listo"

En sistemas con más de una dependencia —base de datos, un servicio de pagos, un proveedor de correo— conviene distinguir dos preguntas distintas: si el proceso está vivo (liveness, útil para que el orquestador sepa si reiniciar el proceso) y si el sistema está listo para atender tráfico de verdad (readiness, la que de verdad le importa a un cliente). Mezclarlas en un único endpoint funciona para sistemas simples, pero en cuanto hay varias dependencias externas, separar ambas preguntas evita reinicios innecesarios por un problema que en realidad es de un proveedor externo, no del propio proceso.