Descubrimiento de scripts de nodejs a traves de pm2 en Zabbix

por | 28 julio, 2023

Bueno continuando con el post anterior ahora entrare a detallar el trabajo que hice para generar el descubrimiento de scripts nodejs a traves de pm2

El comando será mucho mas largo y extenso que los que vimos en el post anterior donde obtuve distintas métricas para enviar a Zabbix y lo iremos desarrollando de a poco, aunque verán que hay partes que se repiten.

Recodemos que para poder crear nuestros descubrimientos tenemos que saber que Zabbix utiliza el formato json por lo que toda nuestra salida debe estructurarse a ese formato.

En general, todos los descubrimientos que hago tienen el mismo formato que consta de tres partes.

  1. la recolección de información y formateo a json
  2. Eliminación de strings innecesarios
  3. cerrar la data en json

A grandes rasgos la etapa 1 será siempre un listado, como en esa etapa no he podido, o no he pensado como hacer un tratamiento de fin de lista le dejo la tarea a la etapa 2 que se encargada de trabajar solamente con el final de todo lo que hayamos generado en la etapa 1. Para finalmente completar los requerimientos de formato json en la etapa 3.

Las últimas dos etapas es sencillo, para eliminar strings coloco el resultado de la primera etapa dentro de una variable, y a esta variable le elimino el ultimo carácter utilizando esta sintaxis.

String=${String%!}

Por ejemplo, imaginemos que tenemos una variable llamada «String» que contiene «Hola mundo!» (un clásico)

#String="Hola mundo!"

obviamente si imprimimos esta variable obtendremos «Hola mundo!»

#echo $String
"Hola mundo!"

Ahora, que sucede si quiero eliminar el signo de exclamación del final, pues para eso podemos usar

String=${String%!}

donde:

  • ${} indica que se está realizando una expansión de parámetros.
  • String es el nombre de la variable cuyo valor se quiere modificar.
  • ! es el carácter que se quiere eliminar al final del valor de la variable String.
  • % indica que se está realizando una eliminación de sufijo.
  • ! es el sufijo que se quiere eliminar.

Si lo que queremos hacer es eliminar un carácter al inicio de una variable usamos # en vez de %.

Con eso ya tenemos la segunda parte parte lista.

Para la tercera es más fácil aún, simplemente colocamos un echo con el formato final incluyendo la salida de la variable que creamos en la parte uno y modificamos en la parte dos

echo {\"data\":[$info]}

Y con eso termino la parte fácil, que siempre es lo mismo.

Ahora procederé a explicar la primera parte que suele ser las más complicada

Para esta parte, haré uso del comando pm2 ls -m que les mostré en el post anterior ya que la salida se acomoda bastante a la necesidad que tengo.

Como ven esta salida a diferencia de pm2 ls nos muestra los datos en forma vertical y no horizontal, lo que me permitirá utilizar la misma salida para obtener todos los datos que necesito. El comando quedó de esta forma.

sudo pm2 ls -m | awk 
'/+---/ {print "{\"{#NAME}\":\""$2"\","} 
/namespace : / {print "\"{#NAMESPACE}\":\""$3"\","} 
/pm2 id : / {print "\"{#ID}\":\""$4"\","} 
/status : / {print "\"{#STATUS}\":\""$3"\","} 
/mode : / {print "\"{#MODE}\":\""$3"\","} 
/error log : / {print "\"{#ERROR-LOG}\":\""$4"\","} 
/watching : / {print "\"{#WATCH}\":\""$3"\"},"}

Como ven hacemos uso intenso de awk y las lineas son muy similares, por lo que solo explicare una de ellas

sudo pm2 ls -m | awk '/+---/ {print "{\"{#NAME}\":\""$2"\","}'

Si notaron en la imagen de la salida del comando sudo pm2 ls -m verán que tenemos una línea por cada propiedad del script. Al colocar / {string} / le estamos indicando a awk que a la linea que tenga la coincidencia de {string} le aplique cierto tratamiento, en este caso del ejemplo awk buscará la linea que contenga «+—«, según el formato que descubrimos anteriormente la línea que contiene ese string también contiene el nombre del script

Monitorea PM2:sudo pm2 ls -m
+--- pm2-logrotate
namespace : default
version : 2.7.0
pid : 2928
pm2 id : 0
status : online
mode : fork
restarted : 0
uptime : 3M
memory usage : 65.7mb
error log : /root/.pm2/logs/pm2-logrotate-error.log
watching : no
PID file : /root/.pm2/pids/pm2-logrotate-0.pid

Por lo que asignamos esta columna, en mi caso, a la macro {#NAME}. La siguiente parte del comando de awk es simplemente agregar los strings necesarios para comenzar a dar formato json

| awk '/+---/ {print "{\"{#NAME}\":\""$2"\","}'

El resultado al aplicar solo esta linea de awk será

sudo pm2 ls -m | awk '/+---/ {print "{\"{#NAME}\":\""$2"\","}'
{"{#NAME}":"pm2-logrotate",

La coma que figura al final la eliminaremos en la etapa dos, Como en este caso solo utilice una sola de las lineas de filtrado total falta un cierre para completar el formato json, pero este cierre esta en la sintaxis del comando completo.

Añadiendo los dos pasos finales y dejando todo en una sola línea para que el archivo de configuración de Zabbix no nos devuelva error

info=$(sudo pm2 ls -m | awk '/+---/ {print "{\"{#NAME}\":\""$2"\","} /namespace : / {print "\"{#NAMESPACE}\":\""$3"\","} /pm2 id : / {print "\"{#ID}\":\""$4"\","} /status : / {print "\"{#STATUS}\":\""$3"\","} /mode : / {print "\"{#MODE}\":\""$3"\","} /error log : / {print "\"{#ERROR-LOG}\":\""$4"\","} /watching : / {print "\"{#WATCH}\":\""$3"\"},"} ') info=${info%,} && echo {\"data\":[$info]}

Y con ya estamos listos, nuestro descubrimiento terminado con las siguientes macros

  • {#NAME}
  • {#NAMESPACE}
  • {#ID}
  • {#STATUS}
  • {#MODE}
  • {#ERROR-LOG}
  • {#WATCH}

Ya solo basta configurar en el frontend los diversos filtros, items triggers, maps y screen que necesitemos y combinando este descubrimiento con el monitoreo del post anterior tenemos casi todo cubierto.

Espero les haya gustado este post si quieren que «desarrolle» algun script para monitorear algo no duden en escribir en los comentarios que los leo!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *