martes, 14 de agosto de 2012

Graphite

Graphite (http://graphite.wikidot.com/) es un soft que básicamente hace dos cosas (documentación sobre el soft se puede encontrar en http://graphite.readthedocs.org):
  • Almacena series cronológicas de datos numéricos.
  • Crea gráficos de esos datos contra demanda.
Tiene 3 componentes
  • carbon - un demonio que queda escuchando a la espera de series cronológicas de datos
  • whisper - una librería para base de datos simples para almacenar las series cronológicas de datos (similar en diseñó a RRD)
  • graphite webapp - Un Django webapp que renderiza los gráficos on-demand usando Cairo

Instalación en Debian

Bajamos Graphite y sus accesorios desde https://launchpad.net/graphite/
wget https://launchpad.net/graphite/0.9/0.9.10/+download/graphite-web-0.9.10.tar.gz
(o la versión más nueva que haya)... lo mismo con Carbon, Whisper y el archivo check-dependencies.py.
Los descomprimimos
tar xzvf graphite-web-0.9.10.tar.gz
... lo mismo para carbon y whisper
Antes de seguir vamos a correr (en realidad se pueden instalar Carbon y Whisper antes de correr esto, que nos dirá si están los prerequisitos de Graphite Web App)
python check-dependencies.py

que nos va a decir que está faltando para poder instalar Graphite... el resultado puede ser algo como esto...

[FATAL] Unable to import the 'whisper' module, please download this package from the Graphite project page and install it.
[FATAL] Unable to import the 'django' module, do you have Django installed for python 2.6.6?
[FATAL] Unable to import the 'tagging' module, do you have django-tagging installed for python 2.6.6?
[WARNING] Unable to import the 'mod_python' module, do you have mod_python installed for python 2.6.6?
mod_python is one of the most common ways to run graphite-web under apache.
Without mod_python you will still be able to use the built in development server; which is not
recommended for production use.
wsgi or other approaches for production scale use are also possible without mod_python
[WARNING]
Unable to import the 'memcache' module, do you have python-memcached installed for python 2.6.6?
This feature is not required but greatly improves performance.

[WARNING]
Unable to import the 'ldap' module, do you have python-ldap installed for python 2.6.6?
Without python-ldap, you will not be able to use LDAP authentication in the graphite webapp.

[WARNING]
Unable to import the 'txamqp' module, this is required if you want to use AMQP.
Note that txamqp requires python 2.5 or greater.
3 necessary dependencies not met. Graphite will not function until these dependencies are fulfilled.
4 optional dependencies not met. Please consider the warning messages before proceeding.


Por lo que procederemos a instalar lo que esté faltando, la primer línea se refiere al whisper que acabamos de bajar.
Para instalarlo simplemente vamos a la carpeta donde lo descargamos
cd whisper-0.9.10
en mi caso... luego ejecutamos
python setup.py install 
(para instalar los 3 programas se procede igual, se entra en el dir donde se descomprimió y se ejecuta python setup.py install)
Se sigue instalando todo lo que haga falta... y listo...

Carbon

Configurando Carbon

La configuración de Carbon se encuentra en /opt/graphite/conf/carbon.conf en un principio no existe y uno debe crearlo, para facilitar las cosas tiene por defecto un archivo carbon.conf.example con un ejemplo de configuración... en el mismo directorio encontrarás otros archivos con configuraciones. Otro archivo que es necesario para poner a andar el daemon es storage-schemas.conf; una vez configurados arrancamos el daemon con:
/opt/graphite/bin/carbon-cache.py start
los logs quedan en opt/graphite/storage/log/carbon-cache/ es bueno verlos para ver si hay algún error tras lanzar el demonio.
(para agregarlo para que inicie cada vez que se inicia linux agregar esa línea al archivo /etc/rc.local)

Graphite Web App

Inicializar la base de datos

vamos a
cd /opt/graphite/webapp/graphite
y ejecutamos
python manage.py syncdb
Debemos luego verificar que opt/graphite/storage/, opt/graphite/storage/log/webapp/ y opt/graphite/storage/graphite.db tengan permisos de escritura para el usuario de apache y permiso de lectura en opt/graphite/storage/whisper/.
La base de datos que se usa por defecto es sqlite.
Una vez instalado es una buena idea darse una vuelta por /opt/graphite/webapp/graphite y ver el archivo local_settings.py para cambiar lo que sea necesario, por ejemplo yo seteo mi timezone a la de Buenos Aires
TIME_ZONE = 'America/Buenos_Aires'

Configurar Apache

Usaré Apache con wsgi, si aun no está instalado hacemos:
apt-get install libapache2-mod-wsgi
luego agregamos esta línea al httpd.conf (en debian en /etc/apache2/httpd.conf)
LoadModule wsgi_module    modules/mod_wsgi.so
Luego habilitamos el host
cp /opt/graphite/examples/example-graphite-vhost.conf /etc/apache2/sites-available/default
(si no esta el default en /etc/apache2/sites-available/default crearlo y hacer el link en sites-enabled)
ahora entrar en /etc/apache2/sites-available/default y modificar la línea del WSGISocketPrefix por
WSGISocketPrefix /var/run/apache2/wsgi
copiamos el arch de settings, debemos cambiar adentro si queremos usar una base de datos que no sea la por defecto.
cp local_settings.py.example local_settings.py
creamos la base de datos
cd /opt/graphite/webapp/graphite/
python manage.py syncdb

reiniciar el apache
/etc/init.d/apache2 restart
y tendríamos que ver todo andando en el localhost, hagamos una prueba...

Un pequeño script en perl que se conecta con Carbon y manda datos para ver en Graphite, manda números al azar durante 2 hs una vez por minuto.

#!/usr/bin/perl
use IO::Socket::INET;
use strict;

my($carbon_server) = '<la ip de su serv>';
my($carbon_port) = <el puerto en gral 2003>;
my ($path) = "pancho.y.z";
my ($dato) = "";
my ($i) = 0;

my($sock) = IO::Socket::INET->new (
 PeerAddr => $carbon_server,
 PeerPort => $carbon_port,
 Proto => 'tcp'
);
die "Unable to connect: $!\n" unless ($sock->connected);
for ($i = 0; $i < 120; $i++)
{
 $dato = $path . " " . int(rand(11)) . " " . time . "\n";
 print $dato;
 $sock->send($dato);
 sleep(60);
}
$sock->shutdown(2);


No hay comentarios:

Publicar un comentario