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.