prometheus et grafana

temps de lecture ~11 min
  1. 1. Environnement
  2. 2. Principes de fonctionnement
  3. 3. Mise en place
    1. 3.1. Web service python
    2. 3.2. prometheus
    3. 3.3. grafana
  4. 4. Requêtes dans prometheus
  5. 5. Mise en place de la dataviz
  6. 6. Et voilà, en vidéo
  7. 7. Conclusion
  8. 8. à voir aussi

Nous avons vu dans nos articles précédents les principes de fonctionnement de prometheus et comment instrumenter notre code python de façon à collecter des valeurs métiers ainsi que des métriques techniques. L’objet de cet article est de mettre en place l’ensemble de l’écosystème autour de prometheus pour la collecte et le stockage des informations time-series, grafana pour la dataviz tout en conservant notre petit exemple en python.

Nous verrons plus tard comment utiliser consul pour disposer d’un système automatique de découverte de nos applications et l’instrumentation pour java.

Si vous n’avez pas vu toute la série d’article sur le sujet, voici la table des sujets abordés dans les différents articles :

  1. prometheus : concepts de base : introduction à prometheus, principes de fonctionnement, usages
  2. prometheus : bien démarrer en python : comment instrumenter son code python afin de fournir les services de métrologie pour prometheus
  3. prometheus et grafana : intégration de prometheus avec l’outil de dataviz grafana
  4. prometheus avec consul : intégration avec consul pour la découverte automatique des services à intégrer dans prometheus
  5. prometheus : bien démarrer en java : comment instrumenter du code java spring afin de remonter les métriques dans prometheus

Vous trouverez en fin d’article un accès à la vidéo de démonstration du résultat.

Environnement

Vous trouverez les fichiers relatifs à ce labo sur git, la préparation est similaire à ce que nous avons déjà fait :

1
2
3
4
5
git clone https://github.com/achauvinhameau/lab-prometheus.git
cd lab-prometheus/02-python-prometheus
virtualenv lab02
source lab02/bin/activate
pip install -r requirements.txt

Aucune modification au code python srv6.py, il a juste été renommé.

Nous allons utiliser docker afin de simplifier la mise en place et surtout ne pas avoir à installer de logiciels sur notre poste, vous pourrez bien sûr le faire avec les commandes en direct, aucune contrainte, nous restons sur des basiques.

Principes de fonctionnement

Les 3 composants que nous allons mettre en place sont :

  1. notre web service en python qui répond sur /metrics avec des données à consommer par prometheus et toujours sur /now pour nous donner l’heure
  2. prometheus qui va récupérer à intervalle régulier les données et pouvoir répondre à des sollicitations de recherche
  3. grafana qui va permettre de faire une interface sur la base des résultats collectés par prometheus

Pour le dire autrement, la cinématique est :

  • grafana interroge prometheus pour récupérer des métriques à afficher
  • prometheus interroge le endpoint /metrics de notre cible (ici le web service) et maintien les données dans une base de données temporelle
  • le web service répond aux sollicitations métier sur le endpoint /now

Mise en place

Web service python

Dans votre environnement virtuel (lab02), démarrez le web service et vérifiez son bon fonctionnement avec un client (ie postman) sur le endpoint /metrics ; vous devez récupérer les métriques de base, si vous appelez également le endpoint /now, vous aurez alors les métriques d’usage de ce web service :

http://192.168.16.205:5000/metrics
1
2
3
4
5
6
7
# HELP ws_srv_is_now_even count even now aligned on second
# TYPE ws_srv_is_now_even counter
ws_srv_is_now_even{even="yes"} 4.0
ws_srv_is_now_even{even="no"} 3.0
# HELP ws_srv_endpoint_call Number of calls to this url
# TYPE ws_srv_endpoint_call counter
ws_srv_endpoint_call{endpoint="/now",method="GET"} 7.0

Le web service sur le endpoint /now a été appelé 7 fois et a retourné 3 fois une heure avec un nombre de seconde impaire, 4 fois paire.

prometheus

Afin de prometheus sache qu’il doir interroger notre web service pour récupérer les métriques, nous allons lui indiquer dans un fichier de configuration (prometheus.yml), il vous faudra bien entendu l’adapter à votre environnement (adressage IP) :

prometheus.yml
1
2
3
4
scrape_configs:
- job_name: pyTest
static_configs:
- targets: ['192.168.16.205:5000']

Nous créons ici une cible (target) nommée pyTest avec une configuration statique, c’est bien là que notre web service sera interrogé. La target est donc à adapter à votre environnement.

Nous lançons le conteneur avec prometheus via la commande suivante :

shell
1
2
3
4
docker run -d --name "lab02-prometheus" \
--rm -p 9090:9090 \
-v `pwd`/prometheus.yml:/etc/prometheus/prometheus.yml \
prom/prometheus
  • -d : execution en mode daemon
  • –name : histoire de le retrouver dans tous nos conteneurs
  • –rm : on supprime l’image à la sortie
  • -p : on expose le port 9090 à l’extérieur du conteneur
  • -v : on monte un volume contenant le fichier de configuration de notre prometheus
  • prom/prometheus : le nom de l’image qui sera téléchargée à la première execution

Une fois démarré, votre container est visible dans la liste :

shell
1
2
3
$ docker ps
CONTAINER ID IMAGE COMMAND [...]
edd914f868aa prom/prometheus "/bin/prometheus -..."

Et son interface d’administration est disponible dans votre navigateur préféré sur l’url http://@ip:9090/targets (à adapter). Ici on retrouve la liste des cibles configurées, vous devez voir à minima celle ajoutée dans le fichier de configuration et en toute rigueur le statut remonté est UP, sinon attendez quelques secondes.

Par ailleurs vous devez voir les appels à votre web service python dans le log sous la forme :

log web service python
1
2
3
172.17.0.2 - - [30/May/2018 17:53:17] "GET /metrics HTTP/1.1" 200 -
172.17.0.2 - - [30/May/2018 17:53:22] "GET /metrics HTTP/1.1" 200 -
172.17.0.2 - - [30/May/2018 17:53:27] "GET /metrics HTTP/1.1" 200 -

Ici, on constate un appel toutes les 5 secondes, j’ai adapté le délai de scrapping à cette valeur dans le fichier prometheus.yml, à adapter à votre usage bien entendu, pour le lab c’est pratique.

grafana

Pour grafana, pas de configuration spécifique, nous la réaliserons directement dans l’interface. Il suffit donc de le démarrer dans son conteneur :

shell
1
docker run --rm -d --name "lab02-grafana" -p 3000:3000 grafana/grafana

Même principe que pour prometheus, le port 3000 sera utilisé pour l’exposition de l’interface de dataviz.

En faisant pointer votre navigateur sur ce port, vous aurez accès à l’interface après une authentification avec les user et mot de passe : admin et admin.

Requêtes dans prometheus

La configuration de grafana nécessite de comprendre les principes d’interrogation des données collectées par prometheus, la syntaxe est rigoureusement la même.

Dans prometheus on peut utiliser le moteur d’interrogation en mode console ou graphe, la zone d’expression permet de saisir les requêtes.

Dans notre cas, on peut simplement regarder les valeurs remontées par notre web service, par exemple sur les variables :

  • ws_srv_is_now_even
  • ws_srv_endpoint_call

En interrogeant la première on récupére les données suivantes :

1
2
ws_srv_is_now_even{even="no",instance="192.168.16.205:5000",job="pyTest"} : 3
ws_srv_is_now_even{even="yes",instance="192.168.16.205:5000",job="pyTest"} : 4

On y retrouve le paramètre que nous avons positionné dans notre web service python avec la notion de label, mais 2 autres ont été ajoutés : instance et job, ils sont directement liés avec notre définition de la cible.
Les labels peuvent être spécifiés dans la requête en reprenant le format présenté dans les résultats, par exemple : ws_srv_is_now_even{even=“no”}

Regardons la métrique d’utilisation du CPU de notre web service, elle a l’avantage de progresser au fil du temps car notre processus est constamment interrogé par prometheus : process_cpu_seconds_total. Même principe, vous retrouverez les 2 labels instance et job positionnés pour filtrage si besoin.
Un des intérêts de prometheus est qu’il conserve les données dans le temps, on peut donc procéder à des calculs, vous trouverez la liste complète dans le documentation. Un opérateur intéressant sur une valeur de type counter est l’increment, on lui spécifie l’intervalle de temps sur lequel travailler. Je vous donne également les valeurs sur mon labo pour information :

1
2
3
increase(process_cpu_seconds_total[5m]) : 2.30
increase(process_cpu_seconds_total[2m]) : 0.88
increase(process_cpu_seconds_total[1m]) : 0.45

Il va nous être possible ainsi d’observer les niveaux d’incément sur des moyennes mobiles.

Regardez aussi les fonctions :

  • delta() : différence entre les valeurs extrèmes de la série
  • deriv() : regression linéaire (à appliquer à des gauges)
  • rate() : taux par seconde (à appliquer sur des compteurs)
  • changes() : nombre de fois qu’un indicateur a changé sur la période

Mise en place de la dataviz

Notre grafana tout vierge nécessite d’être configuré, en commençant par lui ajouter une source, ici notre prometheus. Dans add source, ajoutez votre prometheus en spécifiant un nom, l’url de base en le typant (fin de la liste).

Ensuite, dans les dashboard vous pourrez ajouter des panels et les configurer en utilisant la source, par exemple on peut mettre en place un panel de type graphe :

  1. on lance l’éditeur sur le panel crée dans le menu accessible par le titre (ou en utilisant le raccourci ‘e’ avec la souris sur le titre
  2. selectionner la data source
  3. ajouter une variable, par exemple increase(process_cpu_seconds_total{job=“pyTest”}[1m]), le graphe doit se mettre à jour
  4. positionner un label dans legend format
  5. dans l’onglet General, mettre un titre plus parlant
  6. dans l’onglet Axes, passer les ordonnées sur une unité de type time/second
  7. dans l’onglet Display, vous pouvez supprimer le remplissage et mettre une épaisseur sur la ligne
  8. fermer l’éditeur avec la croix à droite, le panel se retaille, vous pouvez le positionner sur votre tableau de bord

Et voilà, en vidéo

Je vous ai même fait une petite vidéo de 6 minutes sur tout cela, histoire de voir rapidement, sans poser les mains sur le clavier ce que cela peut donner.

Conclusion

Voila une façon assez simple de représenter des métriques dans une dataviz et surtout de le partager avec son métier sans effort important dans un back-office et des développements spécifiques.

A vous de jouer maintenant.

Photo Austin Neill

Alexandre Chauvin Hameau

2018-05-30T17:02:21