InfluxDB (chronograf) et Grafana

 Fonctionnement du stack TICK

Le stack InfluxData T.I.C.K. est composé comme suit :

VersionComponent Role
1.6 Telegraf Collecte les données.
1.5 InfluxDB Stockage des données
1.5 ChronografVisualisation des données
1.5 Kapacitor Création d’alerte

InfluxDB est une base de données orientée séries temporelles Time Series Database (TSDB), adaptées au stockage de métriques (collecte de données “timestamped” comme dans le cas des IoT, etc.). Le stockage interne s’appuie sur la base clé-valeur. Elle est écrite en Go dont les principaux avantages sont les performances, la durée de rétention importante et la scalabilité.

Installation

Voilà les commandes nécessaires :

  1. Mise à jour du système et ajout de paquet nécessaire
 $ aptitude update
 $ aptitude upgrade
 $ aptitude install apt-transport-https 
  1. Ajout du repository InfluxDB:
 $ 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
  1. (Dans le cas de Debian, faire les commandes suivantes:)
 $ curl -sL https://repos.influxdata.com/influxdb.key | sudo apt-key add -
 $ source /etc/os-release
 $ test $VERSION_ID = "7" && echo "deb https://repos.influxdata.com/debian wheezy stable" | sudo tee /etc/apt/sources.list.d/influxdb.list
 $ test $VERSION_ID = "8" && echo "deb https://repos.influxdata.com/debian jessie stable" | sudo tee /etc/apt/sources.list.d/influxdb.list
 $ test $VERSION_ID = "9" && echo "deb https://repos.influxdata.com/debian stretch stable" | sudo tee /etc/apt/sources.list.d/influxdb.list
  1. Mise à jour:
 $ aptitude update
  1. Installation:
 $ aptitude install influxdb telegraf chronograf kapacitor

Test TICK

De manière générale, les services se lancent automatiquement. Dans le cas contraire, faire :

    $ systemctl start influxdb

ou :

    $ service influxdb start 

(Faire de même pour les autres composants)

Configuration de Telegraf

Telegraf est le composant qui permet de collecter des mesures d’un service, à intervalles réguliers, et de l’envoyer vers un autre. Voici une liste de services auxquels Telegraf peut se connecter pour récupérer des données et pour les écrire.

  1. Pour nos tests, nous allons décommenter la section [[inputs.sysstat.options]] de /etc/telegraf/telegraf.conf. Par exemple :
   [inputs.sysstat.options]
     -C = "cpu"
     -B = "paging"
     -b = "io"
     -d = "disk"             # requires DISK activity
     "-n ALL" = "network"
     "-P ALL" = "per_cpu"
     -q = "queue"
     -R = "mem"
     -r = "mem_util"
     -S = "swap_util"
     -u = "cpu_util"
     -v = "inode"
     -W = "swap"
     -w = "task"
  1. Redémarrage de Telegraf

     $ service telegraf restart

    ou

     $ systemctl restart telegraf

Vérification de l’écriture dans la BDD

Par défaut, Telegraf va créer une BDD telegraf contenant plusieurs “tables” (measurements) . Cette BDD sera alimentée par le monitoring choisi (ici, cpu, mem et disk). Pour vérifier cela, il suffit de faire $ influx, puis de faire dans le CLI SHOW DATABASES. Vous devriez obtenir :

  name: databases
  name
  ----
  _internal
  telegraf

Quelques exemples de commande : * USE telegraf → permet d’utiliser la table telegraf * SHOW MEASUREMENTS → montre les différentes “tables” disponibles * SELECT * FROM cpu LIMIT 10 → permet de montrer les 10 dernières valeurs enregistrées dans la “table” cpu. * SHOW TRAG KEYS FROM "swap" → affiche les tags de la “table” swap

La commande suivante select * from swap limit 10 nous donne le résultat :

name: swap
time                free        host          in       out       total       used      used_percent
----                ----        ----          --       ---       -----       ----      ------------
1526041780000000000 36683182080 le2p-influxdb 96071680 919388160 37178306560 495124480 1.3317564080035387
1526041790000000000 36683182080 le2p-influxdb 96071680 919388160 37178306560 495124480 1.3317564080035387
1526041800000000000 36683182080 le2p-influxdb 96071680 919388160 37178306560 495124480 1.3317564080035387
1526041810000000000 36683182080 le2p-influxdb 96071680 919388160 37178306560 495124480 1.3317564080035387
1526041820000000000 36683182080 le2p-influxdb 96071680 919388160 37178306560 495124480 1.3317564080035387
1526041830000000000 36683182080 le2p-influxdb 96071680 919388160 37178306560 495124480 1.3317564080035387
1526041840000000000 36683182080 le2p-influxdb 96071680 919388160 37178306560 495124480 1.3317564080035387
1526041850000000000 36683182080 le2p-influxdb 96071680 919388160 37178306560 495124480 1.3317564080035387
1526041860000000000 36683182080 le2p-influxdb 96071680 919388160 37178306560 495124480 1.3317564080035387
1526041870000000000 36683182080 le2p-influxdb 96071680 919388160 37178306560 495124480 1.3317564080035387

Nous avons ici (pour reprendre le vocabulaire de InfluxDB) : * Measurement : la “table” nommée “swap” * Timestamp : la colonne “time”, donne en nanosecondes le temps de capture des valeurs. On pourrait appeler cela l’index primaire dans le cas d’un BDD SQL. * Tags : la colonne “host”, qui permet de qualifier la/les valeurs (il peut y avoir plusieurs tags, chacun étant indexé pour la recherche) * Fields : toutes les autres colonnes, qui contiennent les valeurs.

Quelques exemples de commande plus complexe: * select * from swap where host='le2p-influxdb' and time > now() - 1m → montre les valeurs de la “table” swap depuis la dernière minute. * select * from swap where host='le2p-influxdb' and time >= '2018-05-29T0:00:00Z' → montre les valeurs de la “table” swap depuis le moment mentionné. * select mean(usage_user) from cpu where host='le2p-influxdb' and time > now() - 1d group by time(1h) → donne la moyenne par heure de l’utilisation du cpu de session user depuis ce matin, groupé par heure.

Plus d’informations sur le site officiel.

Les requêtes peuvent aussi se faire par curl :

    $ curl -G 'http://10.82.64.147:8086/query?pretty=true&db=telegraf' --data-urlencode 'q=SELECT * FROM "swap" WHERE time > now() - 1m'

Configuration de Chronograf

Chronograf est un système de visualisation de données. Il va venir se connecter à notre base de données InfluxDB. Il remplace dorénavant l’API web de InfluxDB et permet donc d’administrer ce dernier. Il permet aussi la création de graphiques et la création de dashboards, mais Grafana semble plus mature à ce jour. Par défaut, Chronograf s’exécute sur le port 8888.

On obtient ce premier écran de configuration :

 influx connection

On peut ensuite : * Host List: Voir un dashboard autogénéré * Data Explorer: Permet d’explorer les données de manière interactive (et notamment de tester les requêtes) * Dashboards : Permet de créer des dashboards personnalisés/ * Alerting : Permet de créer des alertes automatiques (par log, smtp, tcp, exec, telegram, slack, etc.) après avoir configuré Kapacitor… * Configuration : Configuration de la BDD (et notamment de Kapacitor)

Configuration de Kapacitor

Kapacitor est le composant qui permet de gérer des alertes basées sur le résultat d’une requête. Il suffit de passer par le menu précédent pour la configuration.

kapacitor connection01 kapacitor connection02

Grafana

Grafana est un tableau de bord compatible avec de nombreuses BDD (Graphite, InfluxDB, OpenTSDB, etc.). Il est adapté pour visualiser des mesures en provenance de capteurs ou d’objets connectés. Il est développé en Go et Javascript.

Installation de Grafana

Pour des raisons diverses, nous avons installé Grafana. Cela peut se faire par les commandes suivantes:

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

La configuration se fait aisément :

 grafana

Pour tester très rapidement, on peut importer un dashboard en cliquant sur Home puis Import dashboard. Nous avons utilisé l’ID 928 (qui correspond à ce dashboard).

Test des graphiques (Chronograf & Grafana)

Pour tester la visualisation en temps “presque” réel (5s de décalage), nous avons installé le package stress et utilisé la commande suivante:

    $ stress -v -t 20s -m 100 -c 4
    

Chronograf

 stress chronograf

Grafana

 stress grafana

Bonus : Redirection des ports vers des sub…

Pour des raisons de sécurité (drastique), il n’est pas possible d’accéder à tous les ports sans faire une demande à la DSI. Nous avons donc installé un proxy pour faciliter l’accès aux services:

Installation et configuration de apache

    $ aptitude install apache2
    $ a2enmod proxy proxy_http
    $ nano /etc/apache2/sites-available/000-default.conf

La configuration est la suivante :

<VirtualHost *:80>
 
  ProxyPreserveHost On
  ProxyRequests Off
 
  <Location /grafana>
    ProxyPass http://localhost:3000
    ProxyPassReverse http://localhost:3000/grafana
  </Location>
 
  <Location /chronograf>
    ProxyPass http://localhost:8888
    ProxyPassReverse http://localhost:8888/chronograf
  </Location>
 
  <Location /influxdb>
    ProxyPass http://localhost:8086
    ProxyPassReverse http://localhost:8086
  </Location>
</VirtualHost>

Configuration de Grafana

    $ nano /etc/grafana/grafana.ini 

Les lignes à décommenter et à configurer sont les suivantes :

# The public facing domain name used to access grafana from a browser
domain = 10.82.64.147
 
# The full public facing url you use in browser, used for redirects and emails
# If you use reverse proxy and sub path specify full url (with sub path)
root_url = http://10.82.64.147/grafana/

Configuration de Chronograf

    $ nano /etc/default/chronograf 

La configuration est la suivante :

BASE_PATH=/chronograf
PUBLIC_URL="https://10.82.64.147/chronograf"

Redémarrage des services

    $ service grafana-server restart
    $ service chronograf restart
    $ service apache2 restart