sábado, 30 de junio de 2012

RRDTool Primeros pasos - Parte 1


Este sera la primera de dos entradas en mi blog donde hablare un poco RRDtool, una herramienta que apenas estoy conociendo, pero que me resulta mucho muy divertida. Hoy en día varios proyectos de software lo usan como centreon, mrtg, ipcop, cacti, etc.

En lo poco que he explorado a RRDtool puedo comentarles que me ha ayudado a graficar valores en 2D sobre una linea de tiempo, haciendo uso de archivos con una estructura muy parecida a una base de datos donde almacena muchos parámetros y valores.

Graficando.

Nuestro objetivo en esta entrada va a ser graficar los tiempos de respuesta ICMP hacia un servidor en Internet. Para comenzar a graficar se requiere el conjunto de RRDtool, esto lo hacemos en Debian instalando el siguiente paquete:
sudo apt-get install rrdtool

La información de las graficas se almacenan en archivos con el postfijo "rrd", el primer paso es definir y crear estos archivos. Lo que hace divertido graficar es que nuestras graficas únicamente estan limitadas por nuestra imaginación y dominio de gnu shell. Vamos entonces a definir nuestro archivo rrd para la latencia hacia un servidor de google:
user@localhost:~/rrd$ rrdtool create latency.rrd --step 60 DS:latency:GAUGE:300:0:100000000 RRA:AVERAGE:0.5:1:259200 RRA:AVERAGE:0.5:12:100946

El parámetro step, nos indica que tendremos representaciones lineales individuales cada 60 segundos, el DS:latency indica que nuestro DasaSource se llama "latency", el GAUGE indica que usaremos este Datasource para medir los valores que le pasaremos en el futuro. Después de esta definición, se crea el archivo "latency.rrd" y podemos ver la información de sus parámetros con:
user@localhost:~/rrd$ rrdtool info latency.rrd
filename = "latency.rrd"
rrd_version = "0003"
step = 60
last_update = 1341035342
header_size = 740
ds[latency].index = 0
ds[latency].type = "GAUGE"
ds[latency].minimal_heartbeat = 300
ds[latency].min = 0.0000000000e+00
ds[latency].max = 1.0000000000e+08
ds[latency].last_ds = "143"
ds[latency].value = 2.9254425200e+02
ds[latency].unknown_sec = 0
rra[0].cf = "AVERAGE"
rra[0].rows = 259200
rra[0].cur_row = 103763
rra[0].pdp_per_row = 1
rra[0].xff = 5.0000000000e-01
rra[0].cdp_prep[0].value = NaN
rra[0].cdp_prep[0].unknown_datapoints = 0
rra[1].cf = "AVERAGE"
rra[1].rows = 100946
rra[1].cur_row = 74902
rra[1].pdp_per_row = 12
rra[1].xff = 5.0000000000e-01
rra[1].cdp_prep[0].value = 1.4305392777e+02
rra[1].cdp_prep[0].unknown_datapoints = 0

Una vez que tenemos nuestra base de datos RRD, nos queda estar actualizandolo para estar alimentandolo de información. En la secuencia siguiente primeramente vemos como conseguir el tiempo de respuesta usando la salida del comando ping, después indicamos como se alimenta el archivo con un valor contante y finalmente indicamos como lo actualizamos con el tiempo de respuesta, el cual tiene que estar cambiando en canda instante del tiempo.
user@localhost:~/rrd$ ping -c 1 8.8.8.8 | grep -o time=[0-9]* | cut -d "=" -f2
145
user@localhost:~/rrd$ rrdtool update ~/rrd/latency.rrd N:100
user@localhost:~/rrd$ rrdtool update ~/rrd/latency.rrd N:`ping -c 1 8.8.8.8 | grep -o time=[0-9]* | cut -d "=" -f2`

Siendo mas prácticos podemos colocar esta ultima linea en nuestro cron par que se actualice cada minuto.
*/1 * * * * /usr/bin/rrdtool update ~/rrd/latency.rrd N:`ping -c 1 8.8.8.8 | egrep -o time=[0-9]* | cut -d "=" -f2`

Hasta aquí vamos a estar actualizando el archivo cada minuto. Lo ultimo que nos queda es conseguir graficas de estos datos que estamos pasando. Las graficas las podemos hacer basandonos en un periodo de tiempo, por ejemplo si quisieramos las ultimas 3 horas y colocarlo en el archivo latency.png:
user@localhost:~/rrd$ rrdtool graph latency.png --title="Latencia" --vertical-label "Time (ms)" --end now --start end-10800s DEF:time=latency.rrd:latency:AVERAGE  LINE1:time#ff0000:Tiempo
497x173
user@localhost:~/rrd$



Puede ser que solo queremos ver la ultima hora, podemos graficarlo así:
user@localhost:~/rrd$ rrdtool graph latency.png --title="Latencia" --vertical-label "Time (ms)" --end now --start end-3600s DEF:time=latency.rrd:latency:AVERAGE  LINE1:time#ff0000:Tiempo
497x173
user@localhost:~/rrd$



Finalmente podemos ver que es posible graficar muchas cosas con la ayuda de varios comandos. En la próxima entrada les mostrare como estoy graficando algunos de los recursos de mi notebook y graficas con un poco de mejor diseño.