30 sep

Send graphite data

Bueno después de explicar como instalar y configurar graphite con wsgi, vamos a ver como hacer un pequeño script para enviar los datos a graphite, pero como somos un poco vagos, vamos a utilizar uno hecho por el compañero Tomas, que podemos encontrarlo en su github basic-monitoring.sh

Con ese script de base, os explico que hace cada cosa y como tratar los datos.

Pues venga vamos al lío.

Primero de todo debemos entender como tenemos que enviarle la información a graphite, debemos enviarla con una estructura predefinida, nombredelametrica valor timestamp, un ejemplo para que se vea más claro.

servers.raspberry.loadavg_1min 0.03 1373628644

Donde

servers.raspberry.loadavg_1min -> Sera la estructura de carpetas que tendremos siendo el ultimo valor (loadavg_1min) la metrica.

0.03 -> Sera el valor de la metrica

1373628644 -> el tiempo en unixtime (segundos)

Pues vamos a ir montando opciones para cada tipo de valor.

CPU

Podemos sacar la carga de la CPU tal que así.

#!/bin/bash
now=`date +%s`
host=raspberry

#Load average
read un cinc quinze resta < /proc/loadavg
data="servers.$host.loadavg_1min $un $now n servers.$host.loadavg_5min $cinc $now n servers.$host.loadavg_15min $quinze $now n"

Si hacemos un echo $data veremos

servers.raspberry.loadavg_1min 0.03 1373628644 n servers.raspberry.loadavg_5min 0.08 1373628644 n servers.raspberry.loadavg_15min 0.08 1373628644 n

Como tenemos que enviar valor tras valor utilizaremos echo con la opcion -e para que coja cada n y lo convierta en salto de linea. Una vez tenemos los datos estructurados debemos enviarlo al puerto 2003 del servidor de graphite y esto es  tan fácil como hacer un nc.

Pues aqui el ejemplo.

echo -e $data |nc -w 5 ipdelservidor 2003 2>&2

Pues visto esto vamos a sacar las métricas de la memoria.

Memoria

Aquí lo que hacemos es sacar la información del comando free -o y lo pasamos a %,  después lo añadimos a la métrica anterior.

data="$data `free -o|awk -v host=$host -v now=$now '(NR==2) {printf("servers.%s.memory %s %s \n ", host, $3/$2*100, now)} (NR==3) {printf("servers.%s.swap %s %s\n ", host, $3/$2*100, now)}'`"

Ahora los datos de CPU y disco, que los sacaremos con el comando sar. (debemos instalar el sar si no lo tenemos, sudo apt-get install sysstat)

data="$data `sar -u 3|awk -v host=$host -v now=$now 'END {printf("servers.%s.cpu %s %s \n ", host, 100-$8, now)}'`"

data="$data `sar -b 3|awk -v host=$host -v now=$now 'END {printf("servers.%s.disk.totalops %s %s \n servers.%s.disk.readops %s %s \n servers.%s.disk.writeops %s %s \n servers.%s.disk.breads %s %s \n servers.%s.disk.bwrites %s %s \n ", host, $2, now, host, $3, now, host, $4, now, host, $5, now, host, $6, now)}'`"

Y lo enviamos todo con

echo -e $data |nc -w 5 $carbon_server 2003 2>&2

Y con esto deberíamos empezar a ver los datos aparecer en nuestro Graphite!

Bonus track

Hace poco encontré como sacar la temperatura de nuestra rasbperry y aquí os pongo los comando, que podéis unir a la lista de arriba para enviar a graphite.

# Temperatura
tempcpu=$((`cat /sys/class/thermal/thermal_zone0/temp|cut -c1-2`)).$((`cat /sys/class/thermal/thermal_zone0/temp|cut -c3-5`))
echo servers.$host.tempcpu $tempcpu $now | nc -w 5 ipservergraphite 2003 2>&2
tempgpu=`/opt/vc/bin/vcgencmd measure_temp|cut -c6-9`
echo servers.$host.tempgpu $tempgpu $now | nc -w 5 ipservergraphite 2003 2>&2

La verdad es que hay que cambiar algunas cosas partiendo del script de compañero Tomas, así que os dejo el que yo utilizo, ya que de esa forma si lo pones debe funcionar a la primera.

#!/bin/bash
now=`date +%s`
host=raspberry

#Load average
read un cinc quinze resta < /proc/loadavg
data="servers.$host.loadavg_1min $un $now n servers.$host.loadavg_5min $cinc $now n servers.$host.loadavg_15min $quinze $now n"

#Memoria
data="$data `free -o|awk -v host=$host -v now=$now '(NR==2) {printf("servers.%s.memory %s %s \n ", host, $3/$2*100, now)} (NR==3) {printf("servers.%s.swap %s %s\n ", host, $3/$2*100, now)}'`"

#Recollim CPU
data="$data `sar -u 3 3|awk -v host=$host -v now=$now 'END {printf("servers.%s.cpu %s %s \n ", host, 100-$8, now)}'`"

#Recollim dades de disc
data="$data `sar -b 3 3|awk -v host=$host -v now=$now 'END {printf("servers.%s.disk.totalops %s %s \n servers.%s.disk.readops %s %s \n servers.%s.disk.writeops %s %s \n servers.%s.disk.breads %s %s \
n servers.%s.disk.bwrites %s %s \n ", host, $2, now, host, $3, now, host, $4, now, host, $5, now, host, $6, now)}'`"

# Temperatura
tempcpu=$((`cat /sys/class/thermal/thermal_zone0/temp|cut -c1-2`)).$((`cat /sys/class/thermal/thermal_zone0/temp|cut -c3-5`))
echo servers.$host.tempcpu $tempcpu $now | nc -w 5 ipgraphite 2003 2>&2
tempgpu=`/opt/vc/bin/vcgencmd measure_temp|cut -c6-9`
echo servers.$host.tempgpu $tempgpu $now | nc -w 5 ipgraphite 2003 2>&2
#Enviem dades
echo -e $data | sed 's:,:.:g' | nc -w 5 ipgraphite 2003 2>&2
exit $?

Resultado?
El siguiente….

Captura de pantalla de 2013-07-25 17:34:48

Ale a disfrutarlo!!