Grafana: L'interface web de Graphite

Grafana est l'une des meilleures interfaces disponibles pour Graphite et un excellent complément à Kibana.

Lors du billet de présentation sur Graphite, je vous disais que l’interface de celui-ci n’était pas son point fort. C’est une brèche dans laquelle se sont engouffrés pas mal de projets dont Grafana qui sort du lot par sa volonté de devenir l’interface la plus complète à Graphite. Il se pourrait qu’il fasse bien plus un jour.

Grafana est également compatible avec InfluxDB comme back-end, il est donc temps de donner un coup de frais à la partie métrologie de votre solution de supervision.

Un petit air de Kibana

Si vous avez déjà utilisé Kibana, vous ne serez pas dépaysé avec Grafana. Et pour cause, celui-ci partage la même base de code que Kibana et les interfaces sont donc très proches au niveau design et utilisation.

Grafana et Kibana3 nécessitent Elasticsearch pour fonctionner à une différence notable. Grafana ne s’en sert que pour stocker des préférences et autres configurations de tableaux de bord; là où Kibana s’en sert aussi comme source de données pour ses traitements.

Kibana excelle pour travailler sur les messages. Grafana se veut de son côté l’outil ultime pour travailler sur les données fournies par Graphite via son API web.

Il serait presque possible de parier sur la convergence des deux logiciels à terme tant il sont complémentaires sur une base commune. Je l’espère en tout cas.

Une configuration pas si évidente

Il n’y a pas de raison de parler d’installation à proprement parlé pour Grafana. Il suffit de simplement déposer l’archive décompressée dans un dossier du serveur web.

Là où ça se complique, c’est pour la configuration. À l’instar de Kibana une nouvelle fois, Grafana a besoin que votre navigateur puisse discuter directement avec les serveurs Elasticsearch et Graphite.

Et les choses peuvent sérieusement se compliquer, que ce soit techniquement ou d’un point de vue sécurité.

Il faut pouvoir exposer le port 9200 par défaut du serveur Elasticsearch au navigateur client tout en essayant de rester sur le même domaine pour éviter d’entrer dans des problèmes de requêtes « cross domain origin ». C’est en effet au chargement de Grafana dans votre navigateur que celui-ci va émettre ses requêtes vers le serveur Elasticsearch.

Ce que je viens de dire est également vrai pour le port 8080 par défaut du serveur web Graphite.

La situation se gère très différemment suivant que l’application Django Graphite est servie par un serveur Apache, Nginx ou autres.

Je vous laisse quelques pointeurs que j’ai consulté pour m’en sortir:

Exemple avec Nginx et Chaussette

Je reste dans la logique de notre doc d’installation de Graphite et ai décidé de continuer à utiliser Chaussette. Je vais donc placer tous les appels faits depuis Internet sur le même serveur et même port. Je vais utiliser Nginx en reverse proxy HTTP pour cacher toute la cuisine interne que voici.

Configuration de Grafana avec Nginx
Configuration de Grafana avec Nginx

Nginx sert à la fois de serveur web pour les fichiers statiques de Grafana installés dans /usr/share/nginx/html/grafana et de reverse-proxy pour contacter les installations Graphite et Elasticsearch.

Quant le navigateur demande l’url http://server/es, Nginx redirige la requête vers le port 9200 du serveur Elasticsearch et quand il demande http://server/render, il redirige la requête sur le port 8080 du serveur Graphite, soit vers le serveur Chaussette dans notre cas. Même chose pour la requête /metrics.

Ceci se traduit de cette façon dans le fichier de configuration Nginx.

server {
        listen       80;
        server_name  grafana.checkmy.ws;

        index index.html index.htm;
        expires off;

        location / {
                root /usr/share/nginx/html/grafana;
        }

        location /render {
                proxy_pass          http://001.graphite:8080/render;
        }
        
        location /metrics {
                proxy_pass          http://001.graphite:8080/metrics;
        }

        location /es {
                proxy_pass          http://001.elasticsearch:9200/;
        }
}

Il reste à mettre en accord avec cette configuration le fichier config.js de Grafana pour que tout fonctionne.

elasticsearch: "//" + window.location.hostname + "/es",
graphiteUrl: "//" + window.location.hostname,     

Ce point de configuration reste la seule difficulté pour arriver à une installation fonctionnelle de Grafana. Le panneau de test proposé par défaut permet de se rendre compte très rapidement de ce bon fonctionnement ou non. Quand vous voyez le graphe de test fonctionner, vous savez que votre installation est prête.

Tableaud de bord par défaut de Grafana
Tableaud de bord par défaut de Grafana

Mais quelle belle récompense

Une fois l’étape de réussir à contacter les serveurs Graphite et Elasticsearch, il est temps de « jouer » un peu avec cette interface.

Et là comme pour Kibana, une fois la logique comprise, il est très facile et agréable de produire des tableaux de bord à partir des métriques stockées dans Graphite. Les possibilités sont infinies et le rendu bien supérieur à ce qu’il est possible d’obtenir avec l’interface standard de Graphite.

Vous créez un tableau de bord, ensuite les rangées qui composent ce tableau de bord et enfin ajoutez des panneaux à vos rangées. Ces panneaux comprennent deux type d’informations, soit du texte à rédiger au format HTML ou Markdown, soit des graphiques Graphite. Après tout, c’est ce qu’on lui demande.

Créer un premier graphe ne pose pas de problème et Grafana dispose d’un mode assisté pour cela. Cliquez sur Edit dans le menu apparaissant au niveau du titre du graphe de test.

Menu attaché au graphe
Menu attaché au graphe

Vous arrivez fort logiquement dans l’écran d’édition du graphe de test.

Écran d’édition d’un graphe
Écran d’édition d’un graphe

Au passage, vous pouvez constater que le graphe de test est composé de valeurs aléatoirement proposées « randomWalk(‘random walk’) » par Graphite. Changeons ces valeurs par de « vraies » valeurs issues de métriques système récupérées par Collectd. Deux possibilités s’ouvrent à moi :

  • Je connais le nom de la métrique à afficher et je peux alors cliquer le crayon à droite pour entrer directement cette valeur sous la forme collectd.host.metric..
  • Je ne connais pas ce nom de métrique et je me laisse guider par Grafana. Je clique alors sur select metric à gauche.
Sélection d’une métrique
Sélection d’une métrique

L’icône + à droite de select metric permet d’appliquer les options et transformations à la métrique représentée. Toutes les options et transformations disponibles dans Graphite le sont ici bien sûr.

Vous pouvez ajouter autant de lignes que nécessaires à votre graphe avec le bouton Add query.

Chaque métrique, graphe, tableau de bord peut être exporté/importé au format JSON et sauvegardé sur votre systèmes de fichiers ou dans Elasticsearch. Il est donc très facile avec ce système de se fabriquer des « templates » de graphes ou dashboards.

je suis arrivé en moins de 10 minutes à créer le tableau de bord suivant :

Premier tableau de bord
Premier tableau de bord

Ce tableau de bord présente simplement les indicateurs remontés par Collectd pour un serveur Linux/Nginx, juste le minimum. Ce n’est pas le tableau de bord du siècle mais j’aurais le temps de revenir sur quelque chose de plus consistant plus tard. Le but était de réaliser un premier essai.

Ce n’est que le commencement

Nous avons désormais dans notre arsenal de quoi stocker mais surtout grapher et présenter toutes les métriques qu’il est possible de collecter via Graphite, StatsD; ce qui en fait un bon paquet.

Vous sentez la boucle se boucler ? Grafana nous amenant naturellement vers Kibana, c’est donc le tandem Logstash, Kibana que nous aborderons une prochaine fois. Au passage, Kibana vient d’ailleurs de sortir en version 3.0 et Logstash en version 1.4.0.

Nous aurons alors une solution interne permettant de collecter toutes métriques et messages provenant de nos sites et applications web. Gageons que celle-ci pourrait être un joli complément de notre service de monitoring externe. Un pont Check my Website - Graphite Messieurs les développeurs ?

Olivier Jan

À propos de l’auteur

| Cofondateur de Check my Website.

Check My Website a arrêté son activité en 2017, n'hésitez pas à vous tourner vers Dareboost.