· 4 min read

Superviser ses conteneurs Docker avec Prometheus/Grafana et "stressons" la solution avec une API Symfony et Postman

Aujourd'hui nous allons nous intéresser à la mise en place d'une solution de supervision pour nos conteneurs Docker avec Prometheus et Grafana. L'idée c'est de disposer d'un tableau de bord simple mais efficace pour pouvoir suivre les "metrics" de nos conteneurs et de s'assurer de la bonne santé de l'hôte.

Aujourd'hui nous allons nous intéresser à la mise en place d'une solution de supervision pour nos conteneurs Docker avec Prometheus et Grafana. L'idée c'est de disposer d'un tableau de bord simple mais efficace pour pouvoir suivre les "metrics" de nos conteneurs et de s'assurer de la bonne santé de l'hôte.

Introduction

Aujourd’hui nous allons nous intéresser à la mise en place d’une solution de supervision pour nos conteneurs Docker avec Prometheus et Grafana. L’idée c’est de disposer d’un tableau de bord simple mais efficace pour pouvoir suivre les “metrics” de nos conteneurs et de s’assurer de la bonne santé de l’hôte.

C’est typiquement le genre d’outil qui peut vous être d’une grande aide lors de la mise en production de conteneurs Docker, afin de suivre et d’assurer le bon fonctionnement de votre infrastructure.

Pour nous simplifier la vie, nous allons utiliser une solution déjà packagée pour nous dans un docker-compose : la solution Dockprom !

Mise en place de Dockprom

La mise en place de Dockprom est vraiment très simple. On commence par récupérer le projet.

git clone https://github.com/stefanprodan/dockprom.git
cd dockprom

Et sans attendre, on lance le docker-compose.

docker-compose up -d

On peut vérifier que dockprom à bien démarré ses conteneurs avec la commande suivante.

docker-compose ps
    Name                  Command                  State                                                   Ports                                             
-------------------------------------------------------------------------------------------------------------------------------------------------------------
alertmanager   /bin/alertmanager --config ...   Up             9093/tcp                                                                                      
caddy          /sbin/tini -- caddy -agree ...   Up             0.0.0.0:3000->3000/tcp, 0.0.0.0:9090->9090/tcp, 0.0.0.0:9091->9091/tcp, 0.0.0.0:9093->9093/tcp
cadvisor       /usr/bin/cadvisor -logtostderr   Up (healthy)   8080/tcp                                                                                      
grafana        /run.sh                          Up             3000/tcp                                                                                      
nodeexporter   /bin/node_exporter --path. ...   Up             9100/tcp                                                                                      
prometheus     /bin/prometheus --config.f ...   Up             9090/tcp                                                                                      
pushgateway    /bin/pushgateway                 Up             9091/tcp  

Découverte de Grafana

Une fois que dockprom à bien démarré l’ensemble de ses conteneurs, il est possible d’ouvrir une session sur Grafana, à l’adresse http://127.0.0.1:3000/.

Par défaut, les identifiants sont “admin/admin” (la doc vous précise comment modifier cela). Une fois connecté, dockprom vous propose directement deux tableaux de bord :

  • Docker Containers : Tableau de bord pour monitorer vos conteneurs Docker
  • Docker Host: Tableau de bord de l’hôte de vos conteneurs Docker

Générons de l’activité avec une API Symfony et Postman

Histoire d’avoir un peu d’activité à observer, je vous propose de mettre en place une petite API que nous allons “stresser” avec Postman. Créons donc un projet Symfony qui nous ferons fonctionner dans un conteneur Docker.

Récupérons un environnement de Dev Docker pour Symfony, renommons le répertoire et lançons le docker-compose.

git clone  https://gitlab.com/yoandev.co/environnement-de-developpement-symfony-5-avec-docker-et-docker-compose.git
mv environnement-de-developpement-symfony-5-avec-docker-et-docker-compose/ apidockprom
cd apidockprom
docker-compose up -d

Créons un nouveau projet Symfony (Pour aller plus vite, nous prendrons le website-skeleton).

docker exec www_docker_symfony composer create-project symfony/website-skeleton project
sudo chown -R $USER ./

Modifions-le .env pour pouvoir utiliser la base de données.

DATABASE_URL=mysql://root:@db:3306/db_name?serverVersion=5.7

Entrons dans le conteneur Apache, pour la suite des manipulations.

docker exec -it www_docker_symfony bash
cd project

Créons la base de données.

php bin/console doctrine:database:create

Installons ApiPlatform.

composer require api

Et vérifions dans un navigateur que tout est ok à l’adresse http://127.0.0.1:8741/api.

Créons une entité de démo.

php bin/console make:entity
Class name: Demo
Mark this class as an API Platform resource : yes
New property name: demo
String / 255 / Nullable: no

Et mettons à jour la base de données via les migrations.

php bin/console make:migration
php bin/console doctrine:migrations:migrate

Et vérifions que notre API est à jour à l’adresse http://127.0.0.1:8741/api

Lançons l’application Postman et créons une collection “dockprom”.

Ajoutons-y une requête de type POST.

Et une requête de type GET.

Et lançons 10 000 fois les requêtes POST et GET via le Runner de Postman ;-)

En nous reconnectant à Grafana, nous devrions être en mesure de constatée cette activité.

Mettons en place une Alerte

L’un des objectifs de l’utilisation d’un outil comme dockprom c’est de nous aider dans la supervision de notre infrastructure, profitons de cette activité sur notre API pour explorer la mise en place d’une alerte !

Nous allons mettre en place une alerte sur l’utilisation du CPU par nos conteneurs. Le moyen le plus simple c’est d’éditer le graphique CPU du tableau de bord “Docker Containers”.

Ouvrons l’onglet Alert et ajoutons une alerte.

Et déclenchons une alerte dès que le CPU dépasse 3% d’utilisation pendant 10 secondes (à ne pas faire en conditions réelles !).

Dans la section “Alerting”, nous retrouvons l’alerte que nous venons de mettre en place.

Et si nous patientons quelques secondes, l’alerte va changer de statut (puisque nous stressons notre API en parallèle).

Coupons notre “stress test” dans Postman, et constatons que quelques secondes plus tard l’alerte change à nouveau de statut.

Nous pourrions aller plus loin, et voir comment déclencher l’envoie d’une notification, mais je vous laisse explorer la documentation ;-)

Conclusions

Nous venons de voir à qu’elle point la solution Dockprom peut nous permettre de mettre en place simplement et rapidement un outil complet et performant de supervision d’une infrastructure Docker. Évidemment, impossible d’aborder dans le détail toutes les possibilités offertes, mais considérez cet article comme une introduction, voir une invitation à approfondir le sujet.

Back to Blog