Técnicas avanzadas de Debugging para Node.JS

leonardo.manzella
dev front
Desde chico me ha gustado la Computación y Resolución de Problemas Complejos. Me inicie en el mundo de la Programación desde los 16 años.
Siempre fui muy autodidacta, me gusta aprender por mi cuenta, sobretodo hoy en día que esta lleno de Herramientas Online para aprender.

Amo usar lo ultimo en tecnologías de Javascript basadas en React y NodeJS

En lo personal creo fuertemente en la importancia de las habilidades blandas: ser sociable y una buena comunicación es crucial para el trabajo en equipo.
Y es gracias a este y el uso de metodologías ágiles permite crear desarrollos orientados a la solución de problemas de negocio y cumplir objetivos reales
También es importante el tener flexibilidad y adaptación al cambio.

Como líder me he dado cuenta que el pensamiento crítico, la empatía y honestidad son skills cruciales para un buen liderazgo.

Buen día, en esta ocasión quiero contarles sobre distintas herramientas de debugging, porque siento que es una de las partes más importantes de desarrollar productos digitales, ya que al programar, la resolución de problemas y análisis es donde más tiempo se dedica.

 

Node inspect & Chrome dev tools

En la práctica usar console.log no nos lleva muy lejos para entender realmente porque suceden los errores. Para errores complejos uno quiere ir paso a paso para entender cómo se comporta nuestra aplicación.

Para esto existe una opción muy útil de node llamada ‘Node Inspect’, esta nos permite conectarnos con Chrome DevTools a nuestra aplicación de backend de node, permitiendo ver las variables y pila de ejecución en tiempo real, agregar breakpoints y controlar la ejecución línea a línea.

Para usar node inspect con tu aplicación de node, simplemente llámala con la opción `–inspect-brk`, ejemplo:

node –inspect-brk your_app_or_script_name

Luego si te diriges en Chrome a la dirección chrome://inspect, abrirás las Chrome Dev Tools y te conectarás al proceso de node como si lo estuvieras usando para debug de una aplicación web, con todas sus capacidades.

 

 

 

NDB – Dev Tools independiente para debugging en node

NDB es una aplicación independiente creada por Google que tiene todas las capacidades de Chrome Devtools, solo que es local e independiente, pero además cuenta con la posibilidad de edición directa de archivos, es decir: modificar en tiempo real el código y que se guarde la modificación, ideal para solucionar errores rápidamente

Puedes instalar NDB desde el repositorio oficial de Google: https://github.com/GoogleChromeLabs/ndb

 

Inspeccionar una aplicación finalizada

Probablemente lo desconocías, pero una aplicación de node que fue finalizada por un error puede analizarse para encontrar el problema que lo causó; esto puede realizarse usando una herramienta llamada llnode (https://github.com/nodejs/llnode).

Llnode puede usarse para inspeccionar la pila de ejecución y objetos de javascript al mapearlos contra los de C/C++ del proceso.

Pero para esto primero debes asegurarte que tu aplicación al fallar genere un ‘core dump’, es decir, debes asegurarte que tu aplicación utilice process.abort en vez de process.exit al cerrarse por un error.
De esta manera Node al cerrar el programa se asegura de crear el ‘core dump’ como un archivo.

Un video interesante si quieres aprender más sobre esta herramienta es https://asciinema.org/a/29589

Usar agrupaciones para tus mensajes de log

Existe una utilidad llamada ‘debug’ (https://www.npmjs.com/package/debug) que permite asignar agrupaciones o ‘namespaces’ a tus mensajes de logs, por ejemplo basados en el archivo, módulo o nombre de la función a la cual pertenecen.

Esto hará que cada log dentro de una agrupación sea escrito con el nombre del grupo en color y además muestra el tiempo que pasó desde el último mensaje de log, para análisis de performance.

Además nos permite seleccionar qué grupos se mostrarán al ejecutar nuestra aplicación de Node indicando el grupo con DEBUG=your_group haciendo más sencillo inspeccionar un modelo o función durante la ejecución del programa.

De esta manera es mucho más fácil de seguir por la consola la ejecución de un programa, donde falló y que estaba realizando el mismo al momento de fallar.

 

Obtener más información de la pila de trabajo en operaciones asincrónicas

Si no lo notaste, cuando ocurre un error de origen asincrónico en Node, no te muestra toda la pila de trabajo entera sino acotada, esto puede ser un gran problema porque oculta información que necesitamos para ver el origen y causa del error.

Trace (https://github.com/AndreasMadsen/trace) permite que se muestre toda la descripción de la pila de trabajo cuando ocurren errores asíncronos.

Ahora esto trae un problema: nos da demasiada información. Para solucionarlo existe otro modulo llamado Clarify (https://github.com/AndreasMadsen/clarify), que remueve toda la información interna de ejecución de Node.JS, que generalmente no es útil, para poder concentrarnos en la información propia de la aplicación

Si bien estos módulos pueden parecer mágicos, hay que evitar dejarlos habilitados en producción y sólo utilizarlos para debug local.

 

No te olvides de usar herramientas de logs convencionales

Ningún sistema productivo debería estar completo sin una buena librería de logs, porque si bien tendemos a llenar de console.log nuestras aplicaciones locales, esto no es escalable en producción.
Además como el hecho de usar logs afecta el rendimiento de las aplicaciones, deberás armar una estrategia para identificar la información realmente importante para guardar y descartar los demás (o definir niveles de logs para filtrarlos por default y solo habilitarlos cuando lo necesitas).

Puedes usar la librería Winston (https://github.com/winstonjs/winston) ya que es fácil de configurar y muy flexible. Permite definir niveles de logs para solo imprimir estos ignorando los demás hasta ser activado y copiar los logs a herramientas externas (y otros endpoints) como LogStash, Papertrail o incluso Slack.

Nota final: Ejemplos

Todos los ejemplos de donde saque las capturas anteriores pueden experimentarse en https://github.com/LeonardoManzella/node-debugging-examples en un formato interactivo como mini-juego para solucionar errores aplicando estas herramientas