Graphite
Graphite est un outil de graphique, comme son nom le laisse supposer. C'est un projet Python composé de trois parties.
Whisper, une base en roundrobin, qui permet d'envoyer des éléments antidatés, à la différence des RRDTools, facilitant ainsi la création de moulinette lisant des logs.
Carbon, un frontend serveur, qui s'occupe de gérer les accés concurrents, ou de faire relais/routeur. Trois protocoles sont proposés, un format texte avec un retour à la ligne, un autre avec la serialisation pcickle, spécifique à Python, et un AMQP, pour faire pro.
Graphite, le frontend web, une application Django, avec un moteur de graphique basé sur Cairo, rapide, mais un peu pénible comme dépendance. Il est possible de bypasser le frontend et d'utiliser le quasi DSL mis à disposition qui créer ses propres graphiques.
Techniquement, c'est une application python traditionnaliste, peu documenté, avec du Twisted et d'autres dépendances plus ou moins folklorique. La documentation caché propose enfin de faire des installations autrement que tout en dur, obligeant de dédier une VM rien que pour ça. Debian refuse de packager l'ensemble, et seul whisper est disponible. Ce n'est pas de la mauvaise volonté, mais l'application est pas conçu de manière orthodhoxe.
Installation
Le plus sage est de passer par un virtualenv et de conserver la préconisation de tout mettre le bazar dans /opt/graphite. Comme il faut freezer certains paquets, il est plus sage d'éviter les paquets systèmes.
Debian:
apt-get install python-virtualenv gcc python-dev
Tous:
mkdir -p /opt/graphite
virtualenv --no-site-packages /opt/graphite
source /opt/graphite/bin/activate
pip install whisper
pip install carbon
pip install graphite-web
Il faut ensuite créer des fichiers de conf. Le dossier /opt/graphite/conf/ est bien pourvu en exemple. Puis lancer le service carbon. Il faut lire les fichiers de conf largement commentés, pour éviter d'avoir ensuite des surprises, comme le temps de retention qui est super court, par défaut.
cd /opt/graphite/conf/
cp carbon.conf.example carbon.conf
cp storage-schemas.conf.example storage-schemas.conf
Debian :
adduser --disabled-password --quiet --system --home /opt/graphite graphite
chown -R graphite /opt/graphite
Il faut préciser l'utilisateur dans /opt/graphite/conf/carbon.conf ligne 36
USER = graphite
Il faut emballer le script de boot fourni pour gérer le virtualenv : /etc/init.d/carbon
#!/bin/sh
### BEGIN INIT INFO
# Provides: carbon
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Carbon
# Description: Carbon interface for Whisper storage.
### END INIT INFO
# Author: Mathieu Lecarme <mlecarme@bearstech.com>
/opt/graphite/bin/carbon-cache.py $1
Puis l'installer
chmod +x /etc/init.d/carbon
update-rc.d carbon defaults
et le lancer
/etc/init.d/carbon start
OSX:
/opt/graphite/bin/carbon-cache.py start
Normalement, à ce moment, on peut lui causer avec netcat.
echo "local.random.diceroll 4 `date +%s`" | nc localhost 2003
Maintenant, c'est le tour de l'application web, ce qui nécessite un peu plus de sport.
pip install django
pip install django-tagging
cd /opt/graphite/webapp/graphite
cp local_settings.py.example local_settings.py
Il faut éditer le fichier de conf pour paramétrer la base de donnée. Un bon sqlite devrait suffire pour commencer, ligne 141 à 150.
python manage.py syncdb
Les utilisateurs logués pourront faire plus d'actions sur le site, comme enregistrer des vues (un ensemble de graphiques).
Tout marche sauf l'affichage des graphiques. pycairo snobe pip, et de toutes façons, il a des dépendances, il est plus simple de passer par son gestionnaire de package.
Pour OSX:
brew install py2cairo
ln -s /usr/local/Cellar/py2cairo/1.10.0/lib/python2.7/site-packages/cairo /opt/graphite/lib/python2.7/site-packages
Pour Debian:
apt-get install python-cairo
ln -s /usr/lib/pymodules/python2.6/cairo /opt/graphite/lib/python2.6/site-packages
Il faut ensuite lancer le site web (sur le port 8000, par défaut).
Pour OSX:
python manage.py runserver
Pour Debian:
pip install gunicorn
Un petit script de boot :
#!/bin/sh
### BEGIN INIT INFO
# Provides: graphite
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Graphite
# Description: Graphite web frontend.
### END INIT INFO
# Author: Mathieu Lecarme <mlecarme@bearstech.com>
PIDFILE=/opt/graphite/storage/graphite.pid
DAEMON=/opt/graphite/bin/gunicorn_django
HOST=0.0.0.0
PORT=8000
USER=graphite
HOME=/opt/graphite/webapp/graphite
WORKERS=4
case "$1" in
start)
cd $HOME && $DAEMON --pid $PIDFILE -b $HOST:$PORT --daemon --user $USER --workers $WORKERS
;;
stop)
kill -9 `cat $PID`
;;
*)
echo "Usage: graphite {start|stop}" >&2
exit 3
;;
esac
Il faut ensuite l'installer
chmod +x /etc/init.d/graphite
update-rc.d graphite defaults
/etc/init.d/graphite start
Pour être complet, il faut un démon statsd, qui va de manière non intrusive gérer des flots de compteurs, en UDP.
Pour Debian:
apt-get install libevent-1.4-2 libevent-dev
Pour OSX:
brew install libevent
Il existe une version packagé dans Debian, mais sans script de boot, je viens de proposer un patch pour ça.
pip install -e git+https://github.com/bearstech/gstatsd.git#egg=gstatsd
pip install gevent
Debian :
Un script de boot est proposé, mais il faut changer le chemin du daemon : /opt/graphite/bin/gstatsd
wget https://raw.github.com/bearstech/gstatsd/master/init.d/gstatsd
mv gstatsd /etc/init.d
chmod +x /etc/init.d/gstatsd
update-rc.d gstatsd defaults
/etc/init.d/gstatsd start
Il est maintenant possible d'utiliser un des multiples clients statsd pour commencer à publier des statistiques.
Attention, ce produit est conçu pour être utilisé sur un LAN, Carbon ne gère des mots de passe qu'avec son interface AMQP, et Statsd n'en a pas. Graphite fait de trés beau graphique mais son interface est un peu rude, tôt ou tard, il faudra tater de son DSL et de ses règles de consolidation. Il faut jeter un oeil sur les frontaux alternatifs, qui ont souvent plus une approche plus tableau de bord.