Chocoblog

Chocoblog

Billets sur l'informatique, les logiciels libres et retours d'utilisation sont au programme avec la possibilité de publier des billets de copains.

Monitoring de son serveur avec Collectd, InfluxDB et Grafana

Après une migration de serveur je me suis dis qu'il était temps de changer Cacti pour quelque chose de plus sexy (vous me direz, pas bien difficile).

J'ai décidé d'utiliser trois outils :

  • Collectd (version 5.4 pour ma Debian) pour monitorer la machine. Il possède pas mal de plugins et est plutôt simple niveau configuration. Le principal soucis est la quantité de dépendances qu'il requiert à l'installation (Debian).
  • InfluxDB pour la base de données spécialisée dans la métrologie. Les requêtes d'interrogation se font via une API HTTP et ont une syntaxe proche de SQL. Ce qui tombe bien, c'est qu'il propose (dans la version 0.9) une interface permettant de récupérer les données envoyées par Collectd. Il est fait en Go et est relativement jeune. Faut donc voir comment ça évolue.
  • Grafana (version 2.4 à l'heure où j'écris ces lignes) pour grapher les données récupérées de Collectd. Fait en Go et JavaScript (beaucoup de travail côté client) il a le vent en poupe et permet d'avoir des rendu franchement sympa

https://lutim.cpy.re/UoavL1Nu

Pour information, Facette peut-être utilisé en remplacement de InfluxDB et Grafana. Vous pourrez en apprendre plus à son sujet à l'aide de dadall.

Collectd

Commençons par installer Collectd :

# apt-get install collectd

Vous trouverez la conf' dans /etc/collectd.conf. Il suffit d'activer les différents plugins dont vous avez besoin et de les configurer à l'aide du wiki. Personnellement j'ai activé entre autres cpu, curl_xml (pour monitorer rtorrent), df, disk, memory, mysql, network, nginx et tail (pour les mails).

Parmi ces plugins il y en a un qui nous intéresse plus particulièrement : network. Il va nous permettre de demander à Collectd d'envoyer ses données à un serveur (qui sera en réalité notre InfluxDB).

Il faut donc décommenter la ligne :

LoadPlugin network

Dans cette présentation nous considérons qu'InfluxDB est sur la même machine et qu'il écoute sur le port 25826 :

<Plugin network>
  Server "127.0.0.1" "25826"
</Plugin>

N'oubliez pas de redémarrer Collectd :

systemctl restart collectd

InfluxDB

Pour l'installer (vérifiez la dernière version avant de copier ces lignes) :

wget https://s3.amazonaws.com/influxdb/influxdb_0.9.3_amd64.deb
sudo dpkg -i influxdb_0.9.3_amd64.deb

La configuration se trouve dans /etc/opt/influxdb/influxdb.conf.

Vous allez devoir activer le listener pour récupérer les données de Collectd :

[collectd]
  enabled = true
  bind-address = ":25826"
  database = "collectd_db"
  typesdb = "/usr/share/collectd/types.db"

L'autre partie de la configuration qui nous intéresse se situe dans ** [http] **. En effet, InfluxDB propose une interface de type API REST. Nous utiliserons donc le port 8086 pour faire nos requêtes HTTP. Pour information vous pouvez aussi avoir accès à une interface d'administration sur le port 8084 permettant de faciliter la création de requêtes.

Là encore, il vous faut redémarrer InfluxDB :

systemctl restart influxdb

Si vous avez activé le plugin disk du côté de Collectd, vous pouvez tester que tout fonctionne bien en regardant si la table disk_read se remplit bien des données envoyées par notre logiciel de monitoring :

curl -G 'http://localhost:8086/query?pretty=true' --data-urlencode "db=collectd_db" --data-urlencode "q=SELECT value FROM disk_read"

Si vous avez des résultats c'est que normalement tout est bon. Dans le cas contraire il faut savoir si ça vient de Collectd ou de InfluxDB (ou peut-être de la communication entre les deux qui est mal paramétrée).

Vous pourrez en apprendre un peu plus sur la façon d'interroger InfluxDB à l'aide de sa documentation (ne vous y méprenez pas, vous en aurez forcément besoin lorsque vous voudrez construire vos graphes :p) : https://influxdb.com/docs/v0.9/guides/querying_data.html.

À ce niveau là vous devriez avoir votre base de données se remplir petit à petit. Nous pouvons donc commencer à grapher :)

Grafana

Ne faites pas attention au "wheezy" même si vous êtes sous Jessie.

echo 'deb https://packagecloud.io/grafana/stable/debian/ wheezy main' >> /etc/apt/sources.list
curl https://packagecloud.io/gpg.key | sudo apt-key add -
apt-get install -y apt-transport-https
apt-get update
sudo apt-get install grafana

Vous trouverez le fichier de configuration dans /etc/grafana/grafana.ini. Je vous laisse y jeter un coup d'oeil et modifier les options selon la configuration voulue.

Démarrons le serveur :

systemctl start grafana-server

Grafana écoute sur le port 3000 par défaut. Vous pouvez vous connecter avec les logins spécifiés dans le fichier de configuration.

Il nous faut ensuite ajouter des sources (en l'occurrence la source sera notre base InfluxDB). Pour cela vous devez vous rendre dans Data sources puis Add new. Remplissez les différents champs et testez la connexion.

https://lutim.cpy.re/o0wI862F

Si c'est ok on va pouvoir créer notre premier graphe de test, encore une fois basé sur le module disk de Collectd.

https://lutim.cpy.re/ZBJhmU9k

Créer nos requêtes

Maintenant il nous reste à grapher nos différentes données. On pourrait penser que le plus dur a été fait, mais je dois avouer que j'ai passé pas mal de temps à trouver les bonnes requêtes selon le type de données.

Group By

Selon l'espace de temps durant lequel vous voudrez visualiser vos données, Grafana le coupera en de petits intervalles afin d'éviter d'avoir trop de points ce qui freezerait l'interface (le JavaScript a ses limites :) ). La fonction d'aggregation MEAN d'InfluxDB nous permet d'avoir la moyenne arithmétique de chacun des ces petits intervalles. Ces différentes moyennes regroupées en points nous permettent d'obtenir nos graphes.

Par contre, si vous voulez visualiser vos données dans un espace de temps relativement petit, Grafana va vouloir le segmenter en des intervalles encore plus petit. Ça peut poser problème si c'est plus petit que la fréquence de Collectd (par défaut à 10 secondes). Pour résoudre ce soucis, il nous faut mettre un GROUP BY >10s si Collectd fait ses requêtes toutes les 10s par exemple.

Vitesse (par seconde)

Nous avons besoin de grapher une vitesse par exemple avec le module network. Collectd ne vous renvoie pas les bytes/sec (ce serait trop facile). Il vous donne simplement la quantité de bytes qui ont transités par vos interfaces (cette dernière augmente donc continuellement). Il faut donc que nous calculions la différences entre la valeur actuelle et la valeur précédente de chaque petit intervalle afin de savoir combien de bytes ont transité par notre interface à ce moment donné.

Pour cela on va utiliser la fonction DERIVATE. En deuxième paramètre, elle accepte l'intervalle de temps à laquelle elle doit calculer la dérivé. Nous voulons des bytes par seconde, donc nous utiliserons 1s pour ce deuxième argument. Le MEAN est nécessaire afin de regrouper les points et d'éviter donc de faire un calcul de dérivé toutes les 10 secondes.

https://lutim.cpy.re/k6GoHE6o

Quantité à un moment donné

Lorsqu'on a la valeur exacte

C'est le cas avec le module qui monitore la RAM. On a une quantité à chaque intervalle. Il suffit donc d'appliquer un MEAN pour récupérer la moyenne pour chacun de ces intervalles :

https://lutim.cpy.re/WoPFvxCx

Lorsque les valeurs ne font qu'augmenter

Pour les mails par exemple, nous avons une quantité de mails envoyés qui ne fait qu'augmenter. On pourrait aussi faire comme pour la vitesse, et afficher le nombre de mails envoyés par secondes mais je préfère savoir combien en ont été envoyés pour un certain intervalle de temps. Pour cela il suffit d'utiliser la fonction DERIVATE sans lui spécifier de deuxième paramètre. Elle calcule alors la dérivé pour chaque intervalle (et donc se calque sur la valeur du GROUP BY).

https://lutim.cpy.re/X1WF8Lpz

Amusez-vous

Les points les plus pénibles sont normalement passés. Il ne reste plus qu'à explorer les différentes options de mises en forme et à créer vos Dashboard permettant de surveiller l'activité de votre serveur adoré ;)

De part l'architecture de Collectd il est tout a fait possible de grapher les données de plusieurs serveurs dans une même base de données InfluxDB (potentiellement clusterisé), puis de créer des Dashboard poussés à l'aide de Grafana.