Graphite - Simple y potente

Estimad@s,

esta vez es para contarles acerca de una herramienta que me ha impresionado por su simplicidad y potencia, se trata de Graphite, una herramienta opensource escrita en Python con licencia Apache 2.0. Ya en su titulo "Scalable Realtime Graphing" nos invita al menos a echarle una mirada, aunque con mi poca experiencia, creo que este titulo no termina de definir las cosas buenas de Graphite.

Que hace graphite? para que sirve?, bueno, en otro artículo nos cuentan en simples palabras que Graphite "almacena números que varían con el tiempo y luego permite graficarlos", esto es cierto, pero las características de Graphite son muchas más.

Una de las cosas que más me ha gustado es la simplicidad con la cual tratabajos con Graphite, ahora bien, hay muchas herramientas que nos faciitan este tipo de trabajo, entonces cual es el valor agregado de Graphite, bien, el valor agregado, desde mi punto de vista, es que nos permitirá almacenar grandes cantidades de datos que serán obtenidos de forma muy eficiente y simple.

Graphite presta servicios para la inyección y obtención de datos, estos servicios no se limitan al uso de un protocolo, en realidad podemos consumir los servicios de diversas formas, entre ellas: http y sockets udp.

Los datos podrán ser obtenidos mediante consultas muy potentes y simples, además estos datos se pueden representar en diversos formatos: png, raw, csv, json y svg

Aquí adjuntaré una serie de características que no son de mi autoria, pertenecen aun colega y amigo cuyo blog es: http://menospeor.tumblr.com


------------------------------------------------------------------------------------------------------------------------------
1) Graphite introduce el concepto de "estadisticas como servicio (EAAS)". Su arquitectura permite que tengas un servidor con graphite en algún lado y después consumas sus servicios desde distintos puntos. Esto es importante porque libera a las aplicaciones de toda la complejidad relacionada. Al momento de realizar una operación que queremos registrar, normalmente basta UNA SOLA LINEA DE CÓDIGO para enviar el dato y olvidarse del asunto.

2) La característica de realtime es importante también Graphite esta preparado para soportar mucha carga, y cuenta con optimizaciones para poder obtener siempre los datos mas frescos. Por ejemplo, carbon va recibiendo datos y escribe a whisper en bloques, pero cuando le haces una consulta, te abstrae la diferencia entre "datos en cola" y "datos en disco". Esto es notable y es la única herramienta con base de datos round-robin (que conozco!) que lo hace. [Aclaración: hablaremos de carbon, whisper y la arquitectura de Graphite en futuros posts]

3) Comparado con rrdtool (mini post aca), otra diferencia importante es que podes indicar el timestamp de los datos a entrar. Por defecto se asume la hora actual, pero podes cargar datos en el futuro y en el pasado de manera muy sencilla. Esto es fundamental para hacer migraciones y en rrdtool no es para nada trivial obtener la misma funcionalidad. Ademas, y gracias a esta característica  te permite enviar datos en lotes para mejorar la performance en red. Podes quedarte juntando datos y mandarlos todos juntos en una sola petición cada 10 minutos, por ejemplo.

4) Soporta Plugins!  <-- aparte.="aparte." esto="esto" merece="merece" post="post" se="se" span="span" un="un">

Gracias Ale!
-------------------------------------------------------------------------------------------------------------------------------

Intentaré mostrar con algunos ejemplos la potencia simpleza y de Graphite:

Ante un requerimiento HTTP/GET de este tipo:
http://graphiteserver/render?target=stats.gauges.metricas.servers.server1.load&from=-10days
Donde stats.gauges.metricas.servers.server1.load es el nombre del indicador y el filtro de consulta es -10days. En otras palabras estoy requiriendo los datos acerca de la carga de mi server1 en los últimos 10 días. Por defecto Graphite nos retornará un png.

Imagen eliminada.


Cambiando el querystring por:
?width=588&height=309&target=stats.gauges.metricas.servers.server*.load&from=00%3A00_20121111&until=23%3A59_20121114&areaMode=stacked
Donde sencillamente le decimos que queremos la carga de todos los servers (stats.gauges.metricas.servers.server*.load) entre el 11 y 14/Nov/2012, el resto de los parámetros son autoexplicativos.

Imagen eliminada.


Creo que se comprende la idea con estos dos ejemplos.

Anexo algunas capturas de la interface gráfica WEB de Graphite obtenidas de la web oficial:

Imagen eliminada.

 

Imagen eliminada.


En futuros post ahondaremos un poco más en el tema.

Espero les sea de utilidad.

Saludos

Mariano