StatsD, Graphite et Companie

Portrait de fira

Récemment devenu apprenti, j'ai enfin pu récupérer quelques sousous pour un serveur dédié histoire de monter une infra de test..
A peu près en même temps des connaissances ont eu besoin d'un serveur de jeu pour une dizaine de personnes, donc j'ai sauté sur l'occasion d'avoir un petit système à mettre en place et monitorer.

Niveau supervision, je me suis tourné vers Shinken, qui est une réécriture moderne de Nagios en Python.
Etant un gros noob dans le domaine, j'ai cherché à garder un GUI tout gentil pour la définition des vérifications et la configuration...
C'est loin d'être l'idéal et très bricolo -- mais on peut faire fonctionner Check_MK ou Centreon sur ce genre de setup..
Shinken étant (majoritairement) compatible avec Nagios (en fait plutôt rigolo à réaliser, et assez simple avec OMD).
Il est ensuite possible d'exporter les données du coeur de supervision vers une base RRD (Round Robin Database) et utiliser des outils bien connus tels PNP4Nagios, Cacti ou les RRDtool pour les grapher.

Shinken cependant propose une alternative, integrée dans sa WebUI native nottament, qui est Graphite.
Le projet Graphite est en fait la combinaison de plusieurs composants, un moteur de stockage, une interface d'injection, et une interface de visualisation...
C'est un projet qui fait beaucoup de bruit en ce moment et vaut le détour.
Malheresement étant assez nouveau la doc' et le support autour du projet sont assez horribles.
Une fois installé par contre, les différents composants et projets s'interfacent assez magiquement.
Il suffit de quelques lignes pour envoyer les données de performance de Shinken dans la base Graphite.

A partir de là, il est possible de créer des dashboards autour des métriques enregistrées dans Graphite très facilement sur l'interface web:
Screen Graphite
Mais l'interface est quand même très violente niveau configuration, et pas des plus esthétiques.

Heuresement on trouve de nombreuses autres frontend pour Graphite sur internet.
Une que j'ai trouvé particulièrement intéressante est Grafana: c'est un script JS qui tourne côté client et assure un rendu et des dashboards plus intéractifs.
En bonus, on a le droit a l'intégration d'ElasticSearch pour permettre de tagguer les dashboards et les rechercher par interêt.
Si vous avez déjà utilisé Kibana pour la gestion de logs, la solution s'en approche beaucoup, jusqu'au visuel.
Une fois encore, quelques lignes de config une fois installé et c'est fini, l'interface est par contre beaucoup plus intuitive, voire magique:
Screen Grafana

Le résultat est vraiment pas mal.
Jusque là on est par contre limité à l'utilisation d'un système de Supervision pour l'injection de données.
Heuresement beaucoup d'autres systèmes de collecte integrent Graphite, dont le bien connu Collectd.
Un outil fortement associé a Graphite qui fait beaucoup parler de lui récemment est Statsd,
qui avait a l'origine été développé pour l'usage interne par Flickr.

Contrairement a Collectd qui permet de collecter des données et les insérer dans la base,
Statsd permet d'aggréger des sources de données directement pour l'injection dans Graphite, entre autres backends.
Statsd expose une simple socket UDP a la quelle on envoie des messages contenant les données des métriques.
C'est tout. Ca peut parraitre assez simple, mais permet de faire des checks beaucoup plus fréquents et ciblés,
et permet de gérer de très grandes sources de métriques sans problème.

Toujours dans l'optique du serveur de jeu, il m'a été assez simple de modifier la source pour envoyer quelques données
intéressantes du jeu a StatsD via UDP. Une fois les sources de données renseignées, il n'y a plus qu'a se faire un
dashboard sur Grafana.
Dans mes tests, l'ensemble Graphite/Apache/Grafana avec 1030 métriques mises à jour chaque seconde ne dépassait pas 2% de CPU.
Et pourtant, là encore le résultat est assez sympa:
Grafana Baystation

En bref, StatsD est un projet assez intéressant -- malgré sa simplicité, il permet très facilement d'integrer des relevés de métriques a presque n'importe quelle application et peut s'utiliser pour des choses très vastes tout comme des métriques très nombreuses et spécifiques.
L'intégration de Grafana avec ElasticSearch peut aussi laisser présager des fonctionnalités intéressantes a venir, surtout étant donné l'explosion de l'utilisation de Graphite. Ces projets sont encore plutôt jeunes et clairement pas prêts a être déployés n'importe où, mais valent clairement le coup d'oeil.

Commentaires

Portrait de Word

Merci pour le retour d'expérience ! Juste par curiosité, comment as-tu généré tes données de test pour le bench ?

Aussi, une partie "liens" serait pas mal mais sinon c'est juste parfait !

Portrait de fira

Yop!

Graphite a une fonction 'randomWalk', et Check_MK permet de générer des métriques aléatoires, mais j'trouvais vraiment plus sympa d'utiliser de 'vraies' données :o
Du coup l'idée était très litérallement de récupérer les données atmosphériques du jeu, et fouttre le feu a quelques salles pour voir a quoi ca ressemble une fois graphé..
Les graphes sont plutôt moches sur mon exemple car j'ai laissé la résolution de 1 point par minute, mais en descendant à un toutes les 2s c'est plus sympa :p

StatsD prends juste des datagrammes UDP du genre "chemin.de.lobjet.metrique:[valeur]|type" puis se débrouille avec pour l'injecter dans graphite, donc ca s'implémente en quelques lignes.
La raison d'être de statsd est aussi qu'on peut envoyer des comptes, timings, ou modifications de valeurs plutôt que des valeurs instantanées, et donc faire tourner une appli distribuée derrière et laisser statsd faire l'aggrégation

Portrait de paul

Cool !