Les données Check my Website dans Grafana

Exploration des pistes possibles pour grapher les données Check my Website dans Grafana, solution de tableaux de bord Open Source de plus en plus populaire.

L’idée de pouvoir envoyer les métriques collectées par le service Check my Website dans une base de données compatible Grafana ne date pas d’hier. Le but est de pouvoir consulter les données Check my Website avec le reste de mes métriques (Nginx, PHP-FPM, MariaDB par exemple…) directement dans Grafana et d’éviter une interface de plus… Même si la console Check my Website est bien sexy !

Le choix de la base de données

Grafana est compatible avec Graphite bien sûr, mais aussi InfluxDB, OpenTSBD, KairosDB entre autres, ce qui laisse pas mal de choix de ce côté là. Nous allons donc utiliser une de ces bases pour le stockage des métriques.

Quelque soit le backend choisi, le boulot consiste à lui envoyer les données Check my Website.

J’ai choisi InfluxDB pour les raisons suivantes :

  • Plugin en entrée faisant passer InfluxDB pour un backend Graphite à l’insertion de données. Ce plugin le rend compatible avec tous les collecteurs compatibles Graphite, et ils sont nombreux comme nous le verrons en partie plus bas.
  • Installation hyper facile comparée à Graphite. dpkg -i sur une Debian/Ubuntu et vous êtes prêt.
  • Tous les avantages de InfluxDB en backend comparé à Whisper « la partie stockage de Graphite ».

La seule partie de configuration pour InfluxDB a changer est la suivante :

  # Configure the graphite api
  [input_plugins.graphite]
  enabled = true
  address = "0.0.0.0" # If not set, is actually set to bind-address.
  port = 2003
  database = "metrics"  # store graphite data in this database
  udp_enabled = true # enable udp interface on the same port as the tcp interface

Nous avons désormais un backend InfluxDB compatible Graphite. Ne reste qu’à lui envoyer les données Check my Website pour que celles-ci soient disponibles à l’affichage dans Grafana.

Il y a principalement deux cas de figure.

Pour les utilisateurs de solutions de supervision

Toute solution compatible avec les plugins Nagios, et elles sont nombreuses dans le monde Open Source; peut utiliser le plugin Check my Website pour Nagios pour collecter les données.

C’est seulement dans le traitement des données de performance remontées par le plugin que différe les choses en fonction de la solution.

Sensu, Shinken et cie…

Il y a les solutions « natives Graphite » comme peuvent l’être Sensu ou Shinken et certainement d’autres. Par native, j’entends une configuration minimale pour envoyer ces données dans Graphite.

Dans Sensu, cela passe par le mécanisme des handlers et pour Shinken, par un module broker.

Nagios Core compatibles

Et il y a les solutions construites ou compatibles avec Nagios Core pour lesquelles il faut repasser par le « bon vieux » circuit des commandes perfdata.

Je passe la configuration des données de données de performance pour Nagios Core. Les documentations respectives des plugins d’envoi vers Graphite dont je vais parler maintenant contienne la configuration à faire de ce côté là.

Envoi Nagios vers Graphite

Il existe certainement un paquet de solutions ou plugins pour envoyer des données perfdata Nagios vers Graphite. Il est possible de citer le plugin NagiosPerfdataCollector pour Diamond, logiciel de collecte de données comparable à Collectd.

Mais la plus « connue » est certainement Graphios. À l’instar du plugin Check my Website, il est écrit en python et s’installe par exemple via un simple pip install graphios.

il y a un simple fichier de configuration pour Graphios qui permet de fixer le comportement du démon. Ce démon est chargé de traiter les fichiers de données de performance générés par Nagios pour les envoyer vers Graphite. la partie qui nous concerne plus spécifiquement est la suivante :

enable_carbon = True

# Defaults to using the pickle protocol. Set to True to use the plaintext protocol.
carbon_plaintext = True

# Comma separated list of carbon server IP:Port 's
carbon_servers = 127.0.0.1:2003

Pas vraiment une sinécure à mettre en place mais cela fonctionne et a fait ses preuves.

Pour les autres

Vous êtes comme moi et vous n’utilisez pas de solution de monitoring de type Nagios. Il reste cependant des possibilités dont au moins celles-ci.

Collectd

Son plugin cURL-JSON. La méthode à utiliser est la même que celle décrite pour php5-fpm.

Logstash

J’imagine sans avoir testé qu’il est possible d’entreprende quelque chose avec Logstash. Une entrée de type exec ou pipe combiné à un codec json doit pouvoir faire l’affaire. Avec pourquoi pas, au prix d’un effort de configuration plus conséquent, le bénéfice de réagir en direct en fonction des différentes valeurs.

Script DIY

Pour finir, il reste le script qui permet de consommer directement le flux JSON produit par l’API Check my Website. Ce flux ressemble à ceci, tronqué pour ne pas lasser :

{
  "_id": "ea726685-9b45-4b…",
  "laststatechange_bin": 1426583734,
  "lastvalues": {
    "httptime": {
      "CA:MRL:OVZ:DC": 729,
      "FR:RBX:OVH:DC": 31,
      "US:NY:DGO:DC": 757
    }
  },
  "metas": {
    "base64Size": 128264,
    "code": 200,
    "contentLength": 2987351,
    "cssSize": 141648,
    "htmlSize": 205031,
  },
  "state": 0,
  "state_code": 200,
  "state_code_str": "200 Ok",
  "state_str": "Ok",
  "states": {
    "CA:MRL:OVZ:DC": 0,
    "FR:RBX:OVH:DC": 0,
    "US:NY:DGO:DC": 0
  }
}

Il s’obtient par un simple appel sur https://api.checkmy.ws/api/status/ avec les commandes curl ou wget par exemple.

Script Bash

J’ai écrit ce petit script pour illustrer le peu de traitement à faire pour consommer ce flux et l’envoyer vers Graphite. Ce script n’est pas à utiliser tel que en production bien sûr, il ne contient aucun contrôle d’erreurs entre autres. Il serait certainement plus élégant et efficace en Python, Ruby ou autres langages de haut niveau. Rien d’impossible puisque je l’ai fait en Bash ! Faîtes passer si vous avez quelques chose de mieux… Merci.

Dans tous les langages, le principe est le même : S’appuyer sur une bonne librairie pour analyser un flux JSON. Il ne reste ensuite qu’à formater la sortie pour la rendre compatible Graphite, ce qui est très simple comme le montre un exemple tiré du flux ci-dessus.

cmws.www.tsugi.fr.httptime.ca.mrl.ovz.dc 729 1427450281000

Un simple espace entre le nom de la métrique, sa valeur et la date au format EPOCH suffit.

Mon script utilise JQ pour l’analyse JSON, et la simple commande netcat pour l’envoi. il attend l’ID du site en argument

./cmws2graphite ea726685-9b45-4b…

Script Python

William a quant à lui écrit une version en Python, plus propice à la mise en production. C’est ce que j’ai fait !

./cmws2graphite.py ea726685-9b45-4b07…

Vous pouvez aussi préciser directement sur la ligne de commande les paramètres du serveur Graphite.

./cmws2graphite.py ea726685-9b45-4b07… --graphite=127.0.0.1:2003

Un exemple de tableau de bord

La récompense comme toujours est composée par les graphes et tableaux de bord qu’on peut faire dans Grafana à partir de ces données pour leur donner sens. Ces possibilités augmentent de jour en jour, aux rythmes des sorties de Grafana et de InfluxDB, tous deux des projets très dynamiques.

Tbaleaux de bord Grafana avec données Check my Website
Tbaleaux de bord Grafana avec données Check my Website

J’ai pris ce tableau de bord comme exemple, n’ont pas qu’il possède des qualités esthétiques exceptionnelles mais qu’il démontre assez bien les possibilités de ELK + InfluxDB + Grafana. Ce tableau de bord est en effet composé de trois sources distinctes de métriques toutes stockées dans InfluxDB via le plugin d’entrée Graphite.

  1. Des données collectées par mon script bash… Pardon, le script en Python de William ! Les deux premières rangées.
  2. Des données collectées à partir des logs Nginx traitées par Logstash. C’est la troisième rangée du tableau de bord.
  3. Des données collectées à partir de Diamond. Dernière rangée du tableau de bord.

Vous en voulez plus

N’hésitez pas à laisser en commentaires les pistes que vous aimeriez voir développer sous forme de tutoriels ou articles plus approfondis. Celui-ci n’avait d’autres ambitions que de démontrer la variété des circuits possibles pour récupérer les données Check my Website dans Grafana.

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.