Curso de Node.js Avanzado

Costo real de observabilidad en Node.js

Curso de Node.js Avanzado

Contenido del curso

Costo real de observabilidad en Node.js

Resumen

Observar el rendimiento de una aplicación Node.js implica un costo real en performance, y entender qué métricas vigilar y qué herramientas usar marca la diferencia entre una app que escala y otra que colapsa. Aquí verás cómo la instrumentación impacta tus requests por minuto, qué métricas únicas tiene Node.js y qué herramientas conviene usar en desarrollo o en producción.

¿Cuánto afecta la observabilidad al performance de Node.js?

La instrumentación es la técnica con la que escuchas eventos dentro de tu código para obtener información de performance. El problema es que ese código extra se ejecuta junto con el tuyo, y muchas veces bloquea el event loop.

En un benchmark hecho desde NodeSource con Fastify, el framework más optimizado para performance en Node.js, los números hablan solos:

  • Node sin observabilidad: 63,000 requests por minuto.
  • N|Solid: 60,453 requests por minuto.
  • N|Solid con tracing activado: 54,000 requests por minuto.
  • Datadog: 15,000 requests por minuto.
  • Dynatrace: 5,000 requests por minuto.

Entre menos óptima sea la instrumentación del APM, mayor es el golpe al rendimiento. Pasar de 63,000 a 5,000 requests significa que necesitas mucha más infraestructura y máquinas para soportar la misma demanda. Y eso es dinero. [01:30]

¿Qué es la instrumentación en Node.js? Es la técnica de insertar código que escucha eventos internos de tu aplicación para reportar métricas de performance. Tiene un costo: añade overhead y puede bloquear el event loop.

¿Qué métricas debes vigilar en una aplicación Node.js?

Las métricas se agrupan por nivel, desde lo más general del sistema hasta lo específico del runtime de JavaScript. [03:20]

Métricas del proceso y del sistema

En este nivel encuentras información que cualquier lenguaje reportaría: nombre y versión de la aplicación, número de cores de CPU, modelo y arquitectura, total y memoria libre, carga del sistema y system uptime.

Del proceso en sí: el block input count y block output count (operaciones de bloqueo), uso de CPU, uptime del proceso y el RSS o memoria residente, que es el total de memoria usada por el proceso.

Métricas de memoria propias de JavaScript

Aquí está la particularidad de Node.js. JavaScript maneja la memoria de forma muy específica gracias a V8, y eso da lugar a métricas que no existen en otros ecosistemas:

  • Heap total: el espacio donde tu programa instancia objetos.
  • Heap limit: normalmente 2 GB definidos por V8, modificables.
  • Heap used: cuánto de ese total estás usando ahora mismo.
  • Memoria externa: memoria fuera del heap, por ejemplo la que usan módulos nativos de C++.

Event loop y garbage collector

La métrica más importante para medir si tu aplicación respira bien es el event loop utilization, que te dice qué tan ocupado está tu event loop. Junto a ella mides el lag estimado, el tiempo que descansa y cuántas iteraciones ha hecho. [05:40]

Como JavaScript usa asignación dinámica de memoria, también necesitas vigilar al garbage collector: cuántas veces se ejecuta y cuánto tarda en recolectar memoria que ya no se usa.

A esto se suman las métricas más generales: HTTP (cantidad de peticiones, latencia) y primitivas de entrada y salida como consumo de red y lectura de archivos.

¿Cuál es la métrica más crítica del event loop? El event loop utilization. Indica qué tan saturado está el ciclo principal de Node.js. Si sube demasiado, tu app deja de responder a tiempo.

¿Cómo elegir entre herramientas locales y de producción?

Existen dos estrategias claras según el momento de tu desarrollo. [07:50]

Herramientas para entorno de desarrollo local

Clinic.js con Clinic Doctor es una de las más usadas en el ecosistema. Encapsula tu proceso y mide métricas mientras se ejecuta. Se combina muy bien con Autocannon, una herramienta de load testing que simula carga de usuarios y te permite ver cómo reaccionan CPU y memoria bajo presión.

Otra opción es 0x, enfocada en analizar el uso de CPU. Se ejecuta con un comando muy simple:

bash npx 0x -o tu-script.js

Esto te da acceso a una UI con el detalle del consumo de CPU. Ambas herramientas son ideales para desarrollo, pero no para producción: el overhead que generan y la necesidad de encapsular el proceso las hacen incompatibles con entornos como Docker o Kubernetes, que requieren acceso directo al proceso de Node.js.

Herramientas APM para producción

Cuando tu aplicación ya está desplegada, necesitas un APM (Application Performance Monitoring) que entregue métricas en tiempo real: memoria, CPU, red y comportamiento general.

N|Solid de NodeSource es un runtime open source 100% compatible con Node.js. Te da observabilidad en tiempo real tanto en desarrollo local como en producción, ejecutando directamente el proceso sin necesidad de encapsularlo.

¿Por qué Clinic.js no sirve en producción? Porque encapsula el proceso de Node.js y genera overhead alto, además de chocar con orquestadores como Docker o Kubernetes que necesitan acceso directo al proceso.

Elige la herramienta según el momento: local para iterar mientras desarrollas, APM para vigilar lo que pasa cuando tus usuarios reales están dentro. ¿Tú con cuál has trabajado y qué resultados viste en tu event loop?