Creación de un plugin de munin para mldonkey

shell

Munin es una herramienta de monitorización que recopila multitud de datos del sistema y los presenta en forma de gráficas incrustadas en una página web. La gran virtud de munin es su extrema sencillez a la hora de instalarlo y configurarlo. Trae de serie una grandísima cantidad de plugins para monitorizar casi cualquier variable del sistema.

En esta receta veremos que también es extremadamente sencillo crear nuevos plugins para munin. Como ejemplo crearemos un plugin para monitorizar el consumo de ancho de banda de la aplicación mldonkey.

Cómo crear un plugin para munin

Si conocemos un poco de lenguages de script y la naturaleza de los datos que queremos monitorizar, crear un plugin para munin es algo muy sencillo.

Obtención de los datos

Para el caso de mldonkey, utilizaremos el programa mldonkey_command que puede encontrarse en /usr/bin o bien en /usr/lib/mldonkey/. Este programa se conecta mediante telnet al servidor de mldonkey y ejecuta el comando que le pasemos como argumento. Para obtener los valores de velocidad de subida y descarga en ese mismo instante hay que utilizar el comando bw_stats. En el siguiente ejemplo veremos la salida que produce la ejecución:

$ /usr/lib/mldonkey/mldonkey_command -p "password" bw_stats
> bw_stats
Down: 11.4 KB/s ( 64 + 11592 ) | Up: 9.9 KB/s ( 17 + 10118 ) | Shared: 1118/98.95G | Downloaded: 33.7M | Uploaded: 52.1M
MLdonkey command-line:
>

Los datos que queremos monitorizar están ahí, tan solo tenemos que limpiar un poco el texto. Utilizaremos los comandos grep y cut. Por supuesto cada uno puede utilizar lo que mejor sepa usar. Estos son los filtros que usaré para obtener cada una de las cifras:

$ /usr/lib/mldonkey/mldonkey_command -p "" bw_stats | grep ^Down | cut -d "|" -f 1 | cut -d " " -f 2
11.4
$ /usr/lib/mldonkey/mldonkey_command -p "" bw_stats | grep ^Down | cut -d "|" -f 2 | cut -d " " -f 3
9.9

Con esto ya sabemos como obtener los datos en bruto. Para que munin acepte estos valores tan solo tendremos que ofrecérselo de una forma algo estructurada. Algo así:

$ echo "download.value " -n; /usr/lib/mldonkey/mldonkey_command -p "" bw_stats | grep ^Down | cut -d "|" -f 1 | cut -d " " -f 2
download.value 11.4
$ echo "upload.value " -n ; /usr/lib/mldonkey/mldonkey_command -p "" bw_stats | grep ^Down | cut -d "|" -f 2 | cut -d " " -f 3
upload.value 9.9

Aquí observamos que creamos una especie de variable e invocamos su atributo valor, asignándole el dato que hemos leído. Ya tenemos lo complicado del script. El resto es tan solo dar formato a los datos.

La confiuración del plugin

Para que munin sepa mas acerca de la naturaleza de los datos, así como información mas detallada de la representación gráfica, debemos proporcionarsela en nuestro script. Munin lo hace invocando el plugin con el argumento config. En ese momento deberemos imprimir por pantalla las opciones de configuración. Para nuestro plugin serán las siguientes.

graph_title MLDonkey traffic: Indica que el título de la gráfica será MLDonkey traffic.
graph_info This graph shows MLDonkey DL/UL rates.: Es una breve descripción de lo que representa la gráfica.
graph_category mldonkey: Con esto indicamos que nuestra gráfica estará en una categoría llamada "mldonkey". Podríamos perfectamente ubicarla dentro de la categoría "Network".
graph_order upload download: Indica el orden de las variables.
graph_args -l 0 --base 1024: Indicamos que el valor mínimo es 0 y que las medidas serán en múltiplos de 1024.
graph_period second: Indicamos que el periodo de medición de la gŕafica será el segundo. Eso significa que el valor en bruto que obtenemos es la velocidad medida en ese preciso instante.
graph_vlabel bytes per ${graph_period}: Esta es la etiqueta que utilizamos para indicar en que unidades se mide el eje vertical. Como se ve, medimos en bytes por segundo.

Ahora, para cada una de las variables, debemos ajustar algunos parámetros. Como se vio anteriormente, la lectura de velocidad que ofrece el servidor de mldonkey, pero nosotros queremos representarlo en bytes por segundo. Para convertir el dato no es necesario modificarlo en el script, munin lo puede hacer por nosotros. Estos son los datos de configuración para cada variable.

download.label download speed: Esto sirve para darle un nombre descriptivo a la variable.
download.max 50000: Con esto establecemos un valor máximo. 50.000 bytes por segundo parece un buen valor.
download.min 0: Este es el valor mínimo que puede alcanzar la variable.
download.cdef download,1024,*: Por último, multiplicamos la lectura por 1024 para obtener el valor en bytes, ya que el servidor de mldonkey nos da el valor en KB, que asumiremos que se trata de KiB.

Con la variable upload haremos exactamente lo mismo. Y con esto ya tenemos toda la información necesaria para montar nuestro plugin.

El plugin completo en un script

Tan solo nos resta meter todo lo dicho antes en un script, mas alguna cosa mas que se explicará posteriormente.

#!/bin/sh
 
if [ "$1" = "autoconf" ]; then
    if [ -z "/usr/lib/mldonkey/mldonkey_command" ]; then
        echo "$0: error: mldonkey_command not installed"
        exit 1
     else
        echo yes
        exit 0
     fi
fi
 
if [ "$1" = "config" ]; then
    echo "graph_title MLDonkey traffic"
    echo 'graph_info This graph shows MLDonkey DL/UL rates.'
    echo 'graph_category mldonkey'
    echo "graph_order upload download"
    echo 'graph_vlabel bytes per ${graph_period}'
    echo 'graph_args -l 0 --base 1024'
    echo 'graph_period second'
 
    echo 'download.label download speed'
    echo 'download.max 50000'
    echo 'download.min 0'
    echo 'download.cdef download,1024,*'
 
    echo 'upload.label upload speed'
    echo 'upload.max 50000'
    echo 'upload.min 0'
    echo 'upload.cdef upload,1024,*'
    exit 0
fi;
 
MLBW=$(/usr/lib/mldonkey/mldonkey_command -p "" bw_stats 2> /dev/null | grep ^Down)
 
if [ $? -eq 0 ]; then
   DOWN=$(echo $MLBW | cut -d "|" -f 1 | cut -d " " -f 2)
   UP=$(echo $MLBW | cut -d "|" -f 2 | cut -d " " -f 3)
else
   DOWN=0;
   UP=0;
fi
 
echo "download.value $DOWN"
echo "upload.value $UP"

Cuando el script se invoca con el parámetro autoconf el plugin comprueba que tiene todo lo necesario para ejecutarse. En el segundo bloque viene todo lo explicado anteriormente, que no es mas que una enumeración de todos los parámetros de la gráfica. Muchos de esos valores son opcionales y no dudes en jugar con ellos hasta dar con los mas adecuados. Puedes consultar una referencia completa de todos los argumentos en [3].

Al final se ve que el plugin solo se limita a imprimir las variables con los valores de la forma que se explicó al principio de la receta.

Sólo nos quedaría grabar el script en un fichero, darle atributos de ejecución, grabarlo en /etc/munin/plugins y reiniciar el demonio munin-node.

Referencias

[1] How To Write Munin Plugins
[2] Plugins de munin para aMule (este plugin está basado en él)
[3] Todos los parámetros de una grafica