Nous allons voir aujourd’hui comment monitorer une infrastructure classique avec Telegraf pour la collecte de métriques, InfluxDB pour le stockage et Grafana pour l’affichage et l’alerting. Nous nommerons cette solution TIG, dans la suite de cet article. Nous avons choisi ces outils, mais ils peuvent être remplacés par d’autres.

En effet, au lieu d'avoir un logiciel qui fait tout aujourd'hui, nous aimons séparer les rôles de cette façon:  

  • Le collecteur que vous installerez sur les machines que vous souhaitez surveiller
  • La base de données qui stockera toutes les mesures
  • Le système de visualisation, par exemple un dashboard Web

Les 3 stacks les plus populaires semblent, pour moi, être:  

  • Logstash - Elasticsearch - Kibana
  • Prometheus - Node Exporter - Grafana
  • Telegraf - InfluxDB - Grafana

Voici le schéma de l'infrastructure que nous allons utiliser :

Telegraf

Telegraf est un agent de récupération de métriques, 1 seul agent est nécessaire par VM. Cet agent sait récupérer des métriques exposées au format Prometheus et propose 2 modes de récupération des métriques, via :

push : la métrique est poussée dans Telegraf par le composant qui l’expose pull : Telegraf récupère la métrique en interrogeant le composant qui l’expose (le mode le plus utilisé)

Les métriques sont insérées au fil de l’eau dans InfluxDB.

InfluxDB

InfluxDB est une Time Series Database (TSDB) écrite en Go dont les principaux avantages sont les performances, la durée de rétention importante et la scalabilité (nous verrons plus loin sous quelles conditions).

Grafana

Grafana est un outil supervision simple et élégant, permettant de s’intégrer à une TSDB, ici InfluxDB. Grafana expose dans des dashboards les métriques brutes ou agrégées provenant d’InfluxDB et permet de définir de manière honteusement simple des seuils d’alertes et les actions associées.

Cas d’utilisation

Dans cet article, nous allons monitorer une architecture simple :

une application web exposée derrière un Nginx, une base de donnée Mysql

Telegraf permet de récupérer par le biais de plugins les métriques des composants, ainsi que les métriques systèmes. Dans le cas nominal, Telegraf récupère ses métriques en mode pull.

Pour cet article, l’installation se fera sous Ubuntu 16.04 LTS.

curl -sL https://repos.influxdata.com/influxdb.key | sudo apt-key add - 

source /etc/lsb-release 

echo "deb https://repos.influxdata.com/${DISTRIB_ID,,} ${DISTRIB_CODENAME} stable" | sudo tee /etc/apt/sources.list.d/influxdb.list

sudo apt-get update

Maintenant attaquons le dur avec l'installation d'InfluxDB.

sudo apt-get install influxdb

Une fois l'installation terminée, démarrez le service InfluxDB:

sudo systemctl start influxdb 

Ensuite, assurez-vous que le service fonctionne correctement:  

statut systemctl influxdb 

Vous verrez l'état indiquant que le service est en cours d'exécution:

InfluxDB est en cours d'exécution, mais vous souhaiterez activer l'authentification de l'utilisateur pour limiter l'accès à la base de données. Celle-ci permet de créer au moins un utilisateur administrateur.  Démarrez la console InfluxDB:

influx

Exécutez la commande suivante pour créer un nouvel utilisateur admin. Nous allons créer un utilisateur admin avec le mot de passe adminpassword, mais vous pouvez utiliser ce que vous voulez.

> CREATE USER "admin" WITH PASSWORD 'adminpassword' WITH ALL PRIVILEGES

Vérifiez que l'utilisateur est créé:

> show users

Vous verrez le résultat suivant, vérifiant que votre utilisateur a été créé:

Output    user  admin
    ----  -----
    admin true

Il est également possible de créer une police de rétention :

> CREATE RETENTION POLICY thirty_days ON telegraf DURATION 30d REPLICATION 1 DEFAULT
> SHOW RETENTION POLICIES ON telegraf
name		duration	replicaN	DEFAULT
DEFAULT		0		1		FALSE
thirty_days	720h0m0s	1		TRUE

InfluxDB étant maintenant configuré, installons Telegraf, un agent de collecte de métriques.

Installer Telegraf

Comme je l'ai déjà dit, Telegraf et InfluxDB sont édités par la même société, ils utilisent donc le même repository APT.

#curl -sL https://repos.influxdata.com/influxdb.key | sudo apt-key add -
#echo "deb https://repos.influxdata.com/debian stretch stable" > /etc/apt/sources.list.d/influxdata.list
#apt-get update
apt install telegraf
systemctl start telegraf

Configurer Telegraf

Sauvegardons le fichier de configuration:

mv /etc/telegraf/telegraf.conf /etc/telegraf/telegraf.conf.orig

Je vous suggère de le lire, mais voici un bref aperçu de ce que vous pouvez ajouter dans /etc/telegraf/telegraf.conf.  

Configuration de l'agent:

[agent]
  hostname = "myserver"
  flush_interval = "15s"
  interval = "15s"

Par défaut, le nom d'hôte sera le nom d'hôte du serveur (logique) et les métriques seront collectées toutes les 10 secondes.  Configuration des entrées de base, par exemple sondes:

[[inputs.cpu]]

[[inputs.mem]]

[[inputs.system]]

[[inputs.disk]]
  mount_points = ["/"]

[[inputs.processes]]

[[inputs.net]]
  fieldpass = [ "bytes_*" ]

Pour voir toutes les entrées disponibles, vous pouvez taper:

grep inputs. /etc/telegraf/telegraf.conf.orig 

Je regarde habituellement le dossier des entrées dans le dépôt github car chaque entrée a un fichier README qui aide à le configurer.  Ensuite, les sorties, qui sont notre base de données InfluxDB.

sudo nano /etc/telegraf/telegraf.d/outputs.conf
[[outputs.influxdb]]
  database = "telegraf"
  urls = [ "http://127.0.0.1:8086" ]
  username = "telegraf"
  password = "pa$$word"

Ensuite, nous pouvons redémarrer telegraf et les mesures commenceront à être collectées et envoyées à InfluxDB.

service telegraf restart

Vous pouvez voir ce que Telegraf collecte avec cette commande:

sudo telegraf -test -config /etc/telegraf/telegraf.conf -config-directory /etc/telegraf/telegraf.d
> cpu,cpu=cpu-total,host=vps560749 usage_guest=0,usage_guest_nice=0,usage_idle=100,usage_iowait=0,usage_irq=0,usage_nice=0,usage_softirq=0,usage_steal=0,usage_system=0,usage_user=0 1539981958000000000
> disk,device=sda1,fstype=ext4,host=vps560749,mode=rw,path=/ free=19317006336i,total=20749852672i,used=1416069120i,used_percent=6.830000320045137 1539981958000000000
> mem,host=vps560749 active=526770176i,available=1725919232i,available_percent=84.318594766795,buffered=31985664i,cached=781279232i,commit_limit=1023451136i,committed_as=626089984i,dirty=73728i,free=1031180288i,high_free=0i,high_total=0i,huge_page_size=2097152i,huge_pages_free=0i,huge_pages_total=0i,inactive=404803584i,low_free=0i,low_total=0i,mapped=105136128i,page_tables=3432448i,shared=5742592i,slab=61796352i,swap_cached=0i,swap_free=0i,swap_total=0i,total=2046902272i,used=202457088i,used_percent=9.890901523216444,vmalloc_chunk=0i,vmalloc_total=35184372087808i,vmalloc_used=0i,wired=0i,write_back=0i,write_back_tmp=0i 1539981958000000000
> swap,host=vps560749 free=0i,total=0i,used=0i,used_percent=0 1539981958000000000
> swap,host=vps560749 in=0i,out=0i 1539981958000000000
> system,host=vps560749 load1=0.06,load15=0.02,load5=0.06,n_cpus=1i,n_users=1i 1539981958000000000
> system,host=vps560749 uptime=2778i 1539981958000000000
> system,host=vps560749 uptime_format=" 0:46" 1539981958000000000

Puis on redémarre les services histoire d'être sûr :

sudo systemctl restart influxdb
sudo service telegraf restart

Désormais les données descendent, sont collectées ce qui revient à dire que tout fonctionne. Matérialisons maintenant cela avec une belle page web de monitoring.

Installation de Grafana

Grafana est l'application Web que nous allons connecter à InfluxDB pour visualiser les données.  Nous installerons Grafana à l'aide de son référentiel APT, comme décrit dans http://docs.grafana.org/installation/debian/.

echo "deb https://packagecloud.io/grafana/stable/debian/ stretch main" > /etc/apt/sources.list.d/grafana.list
curl https://packagecloud.io/gpg.key | sudo apt-key add -
apt install apt-transport-https
apt update
apt install grafana

Ensuite, nous redémarrons Grafana et l’activons au démarrage:

service grafana-server restart
systemctl enable grafana-server

Vous pouvez maintenant vous connecter en utilisant les informations d'identification admin/admin par défaut à l'adresse IP de votre serveur :3000

Une fois que vous y êtes, créez un nouvel utilisateur et supprimez-le immédiatement.  Ajoutez votre base de données InfluxDB en tant que source:

Tableau de bord Grafana

Vous pouvez maintenant ajouter un tableau de bord et commencer à configurer les panneaux.  Voici un exemple de requêtes du panneau CPU:

Jouez avec les mesures et les graphiques et vous commencerez à comprendre comment cela fonctionne.  Voici à quoi ressemble l'un de mes dashboards:

Voici un exemple de monitoring pour Nginx.

root@vps560749:~# wget http://localhost/status
--2018-10-19 23:19:02--  http://localhost/status
Resolving localhost (localhost)... 127.0.0.1
Connecting to localhost (localhost)|127.0.0.1|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 97 [text/plain]
Saving to: 'status'

status                        100%[=================================================>]      97  --.-KB/s    in 0s

2018-10-19 23:19:02 (9.62 MB/s) - 'status' saved [97/97]

Pour l'obtenir :

server {
    listen 80;
    server_name localhost;

    location /status {
        stub_status on;
        access_log off;
        allow 127.0.0.1;
        deny all;
    }
}
root@vps560749:~# sudo telegraf -test -config /etc/telegraf/telegraf.conf -config-directory /etc/telegraf/telegraf.d --input-filter nginx
> nginx,host=vps560749,port=80,server=localhost accepts=24i,active=2i,handled=24i,reading=0i,requests=981i,waiting=1i,writing=1i 1540730214000000000

Pour aller plus loin avec Grafana, voici un dashboard supplémentaire :

Ci-dessus on retrouve les données du systèmes, c'est à dire du serveur.

Et ici deux graphiques concernant Nginx, parmi la trentaine de dashboards disponibles (Docker, MySQL, Varnish, Redis, Apache etc...)

InfluxDB sur HTTPS

Nous souhaitons maintenant surveiller d'autres serveurs et envoyer les données à InfluxDB. Pour le faire en toute sécurité, nous utiliserons le protocole HTTPS, InfluxDB communiquant via HTTP.  Pour votre information, n'utilisez pas Nginx pour utiliser HTTPS pour InfluxDB. Cela va gâcher vos données et votre base de données. Vous devez utiliser l'implémentation HTTPS d'InfluxDB.  

Nous voulons d'abord avoir des certificats. Vous pouvez les obtenir de la même manière que pour Grafana, avec acme.sh.  N'oubliez pas de donner à InfluxDB les droits sur les lire:  

chown influxdb /path/to/cert_and_key

Puis activez HTTPS dans /etc/influxdb/influxdb.conf:

https-enabled = true 
https-certificate = "/path/to/domain.tld.fullchain.pem"
https-private-key = "/path/to/domain.tld.key.pem"
service influxdb restart

Et voilà reste plus qu'à s'amuser avec tout ces outils.

Bibliographie :