Cómo implementar un control de salud en Node.js

La salud es realmente importante. Hay un dicho popular que dice que la salud es riqueza; esto es cierto incluso en la ingeniería de software. ¡Sí! Al igual que los seres vivos, una aplicación también puede estropearse si no la cuidamos. ¿Cómo implementar un control de salud en Node.js? Vamos a verlo…

Cómo implementar un control de salud en Node.js

Los controles de salud en el software nos ayudan a identificar carencias en nuestras aplicaciones para mantenerlas mejor.

Al igual que vemos a un médico para saber si algo está mal con nosotros, cierto, el mismo principio se aplica al software cuando prestamos atención al servidor o al tiempo de respuesta, por ejemplo.

Cómo implementar un control de salud en Node.js

Por qué necesita hacerse controles de salud

Como ya hemos mencionado en la introducción; salud es riqueza. Antes de pasar a cómo implementar la verificación de estado en Node.js, hablemos sobre su importancia y por qué debería adquirir el hábito de realizar estas comprobaciones.

Primero debemos reconocer que la disponibilidad del software o la funcionalidad es extremadamente importante. La verificación rutinaria del estado de la disponibilidad de las API, por ejemplo, lo ayuda a conocer problemas cruciales y solucionarlos lo más rápido posible.

Si se produce un tiempo de inactividad, el propietario de la aplicación puede ser informado de inmediato para que se resuelva rápidamente.

Los controles de estado se vuelven aún más importantes a medida que crece la infraestructura de nuestro software, y la necesidad de asegurarse de que todos los microservicios y puntos finales funcionen sin problemas se vuelve más vital para las aplicaciones que administramos.

Algunas de las cosas que verificamos cuando consideramos la salud del software en cualquier lenguaje de programación o pila son el tiempo de respuesta de un servidor cuando se realiza una solicitud y cómo se conecta el servidor a la base de datos (si la hay).

Otra razón por la que es necesario un control de salud es para mantener la disponibilidad de sus servicios. Su aplicación o producto no debe verse como el que tiene más tiempo de inactividad entre sus competidores.

Implementando un chequeo de salud en Node.js

En este tutorial vamos a ver como implementar un control de salud (o health check) en Node.js, que puede ser integrado en cualquier software o proyecto Node.js que ya tenga desarrollado o vaya a desarrollar en el futuro.

Puedes clonar o descargar el código directamente desde el repositorio de github: https://github.com/jdzuri/nodejs-health-check.git

Usa git clone para clonar el repositorio en tu propia máquina:

git clone https://github.com/jdzuri/nodejs-health-check.git

Una vez clonado el proyecto, hay que ir al directorio del proyecto cd nodejs-health-check e instalar las dependencias con el comando npm install.

En caso de querer seguir el tutorial sin más, el único requisito es tener instalado el módulo express: npm install express --save

Añadir una ruta de comprobación de estado

En este caso vamos a crear un fichero routes/health_checker.jsque contendrá el código y endpoint o enturado de chequeo de salud:

'use strict';

const express = require('express');
const router = express.Router({});

class HealthChecker {

  static check() {
   return {
      uptime: process.uptime(),
      response: process.hrtime(),
      message: 'OK',
      timestamp: Date.now()
    };
  }
}

router.get('/', async (_req, res, _next) => {
  try {
    res.send(HealthChecker.check());
  } catch (error) {

    res.status(503).send(error);
  }
});

// export router with all routes included
module.exports = router;

Lo que se hace en este fichero es crear una clase HealthChecker para devolver, mediante el método check los datos que consideremos relevantes como información sobre la salud el servicio. En este caso destacamos dos:

  • uptime: Que contiene el tiempo de actividad del servicio, obtenido mediante process.uptime()
  • response: Que contiene el tiempo real (nanosegundos) de respuesta del servicio, obtenido mediante process.hrtime()

En caso de que la aplicación tuviese base de datos, como MongoDB, MySQL o Postgre, sería muy interesante  verificar la conexión y tiempos de respuesta de la base de datos mediante alguna consulta simple. En este caso la estructura de la clase y del enrutador variará pues lo ideal es que le pase la información de conexión mediante el contructor de la colase y enrute mediante un método o enrute a un nivel superior.

También tenemos una captura de errores, por si se produce algún error durante el proceso poder obtener información sobre él (por ejemplo, imagine que la base de datos esté caída). Si existe una excepción, responde con un error (el valor del mensaje en el objeto de control de salud se convierte en el error) y envía un estado de 503.

Finalmente, al final del archivo se exporta el módulo enrutador (router) de express, module.exports = router;

Integración de la ruta de control de salud

Una vez que hayamos creado la ruta, edite el archivo index.js (o el que corresponda en su proyecto). Simplemente agregue esta línea de código:

app.use('/healthcheck', require('./routes/health_checker'));

En este caso, el fichero index.js de ejemplo quedaría como sigue:

'use strict';

const express = require('express');
const app = express();

app.use('/health', require('./routes/health_checker'));

const PORT = process.env.PORT || 3000;
app.listen(PORT, console.log(`Server has started at port ${PORT}`));

Prueba de funcionamiento

Para probar el funcionamiento de nuestro sistema de control de salud en Node.js tan sólo tendremos que arrancar el servicio desde la carpeta raíz de nuestro proyecto con el siguiente comando:

node index.js

nodejs health checker server output

Y en el navegador tan solo tendremos que dirigirnos a la siguiente URL: http://localhost:3000/health

nodejs health checker browser output


Espero que el artículo «Cómo implementar un control de salud en Node.js» te haya sido de ayuda ❤️

Compartir:

Deja un comentario