Introduction
Aujourd’hui, dans un univers d’applications distribuées, déployées dans le cloud, basées sur une architecture microservices, les enjeux du monitoring ont évolué au-delà de la traditionnelle réaction aux incidents de production. Une solution moderne d'observabilité, doit permettre :
- de réagir au plus vite lors de la survenue de problèmes
- de suivre la performance de l’application
- de détecter les vulnérabilités en caractérisant les changements de comportement de l’application
- d’aider à identifier des attaques de sécurité
- d’aider à optimiser les coûts de fonctionnement cloud
Dans le premier article de cette série, nous allons montrer comment monitorer une application Spring Boot avec la stack de monitoring Prometheus / Grafana.
Dans les articles suivants, nous présenterons des solutions pour créer et exporter des métriques liées aux exceptions survenues dans une API REST et dans un Batch Spring Boot.
La stack de monitoring choisie
Dans le contexte du DevOps, les outils de supervision traditionnels de type Nagios et Centreon, dotés d'interfaces d'un autre âge, montrent vite leurs limites.
Apparue au début des années 2010, une nouvelle génération de solutions, issues de l'open source, répond au défi du DevOps. Elles permettent de remonter tout type de métriques en provenance des applications, y compris des indicateurs métier (suivi de commande, prix moyen d'un panier d'achat, pourcentage de parcours client réussis...).
Au sein de cette nouvelle catégorie de solutions, la plus connue s’appelle Prometheus. Créée par SoundCloud pour ses besoins de monitoring internes, elle s'articule autour d'une base de données taillée pour gérer les informations chronologiques (ou time series), qui va collecter et stocker des métriques.
A la différence de Nagios dont les sondes envoient des données au serveur de supervision en mode push, c'est le serveur Prometheus qui requêtera un endpoint spécifique des composants à surveiller, en mode pull. Pour assurer cette collecte à intervalles réguliers, Prometheus intègre son propre langage de requêtage : PromQL.
Autres points forts :
- son architecture modulaire :
- Le Node Exporter est un module dont le rôle est d’exporter les métriques de la machine hôte (qu’elle soit physique ou virtuelle)
- L’AlertManager est un module dédié à la gestion des alertes utilisateurs
- La Push Gateway est un module permettant à des batchs ou des jobs éphémères d’exposer leurs métriques sur un endpoint persistant.
- CAdvisor est un module développé par Google permettant d’exporter les métriques se rapportant aux conteneurs
- Un mécanisme de découverte des services (SD - Service Discovery) proposant nativement beaucoup de providers (fichier statique, Docker, Azure, AWS, GCE, DigitalOcean, …) et extensible.
- Son intégration native (via des endpoints dédiés) à des solutions open source comme le serveur web Nginx, la base de données PostgreSQL ou encore Kubernetes pour l'orchestration de conteneurs en mode clusterisé.
Prometheus est devenu un incontournable grâce à son format d'exposition des métriques OpenMetrics. Prometheus est intimement lié à Grafana qui est son pendant naturel pour la visualisation des données. Parlant également le PromQL, cet outil de restitution va récupérer les métriques pour construire des tableaux de bord graphiques sur une période donnée.
Grafana peut aussi dialoguer avec de multiples sources de données, comme InfluxDB ou des services de monitoring propriétaires de cloud providers.
Bien documenté, Grafana permet la création de tableaux de bord adaptés à tous les besoins. Il existe sur le site de Grafana un espace dédié, où la communauté d'utilisateurs propose des tableaux de bord prêts à l'emploi.
Docker
Pour simplifier l’installation des divers composants de notre stack de monitoring, nous allons utiliser les images Docker des différents composants et l’outil Docker-Compose pour lancer les conteneurs.
Docker-Compose est un outil permettant de définir et d'exécuter des applications Docker multi-conteneurs. Avec Compose, vous utilisez un fichier YAML pour configurer les services de votre application. Ensuite, avec une seule commande, vous créez et démarrez tous les services à partir de votre configuration.
Il est donc nécessaire de disposer de Docker sur la machine de test.
Par défaut, docker crée un réseau nommé bridge, avec le subnet 172.17.0.0/16. Les différents conteneurs qui utilisent ce réseau seront donc accessibles sur l’adresse 172.17.0.1 sur le port externe défini pour le conteneur. Pour vérifier les informations de réseau docker, vous pouvez afficher la liste des réseaux en lançant la commande suivante docker network ls, puis pour vérifier l’adresse de la gateway du réseau bridge, lancer la commande : docker network inspect bridge
Spring Boot Actuator
Spring Boot Actuator ajoute des fonctionnalités supplémentaires de monitoring à vos applications. Ces fonctionnalités sont disponibles via des endpoints HTTP ou avec JMX.
Pour activer Spring Boot Actuator dans votre application, il suffit d’ajouter le starter correspondant aux dépendances dans le pom.xml de l’application :
Il faut aussi activer l’exposition des endpoints http dans votre fichier application.yml, en ajoutant la configuration suivante (Attention à respecter l’indentation):
Le endpoint de l’Actuator Spring Boot devient alors accessible sur l’url suivante : http://localhost:8080/actuator Le résultat donne la liste de tous les endpoints de l’Actuator :
On peut obtenir la liste des métriques créées par défaut. Ces métriques permettent de suivre le fonctionnement technique (mémoire utilisée, cpu utilisée, pool de connections, ...) de l’application : http://localhost:8080/actuator/metrics On obtient la liste suivante :
Ainsi, simplement avec un peu de configuration, on peut exposer un ensemble de métriques permettant de monitorer notre application Spring Boot.
Prometheus
Pour rendre notre application Spring Boot compatible avec Prometheus, il suffit d’ajouter la dépendance suivante dans notre pom.xml:
Un nouvel endpoint expose maintenant, les métriques de l’application au format OpenMetrics compatible avec Prometheus : http://localhost:8080/actuator/prometheus On obtient le résultat suivant (le résultat suivant est tronqué pour des raisons de taille):
Comme expliqué précédemment, pour installer Prometheus, nous allons utiliser l’image Docker officielle et docker-compose :
Dans le fichier de configuration de Prometheus (prometheus.yml) il faut indiquer sur quel endpoint lire les métriques de l’application Spring Boot :
Avec Docker, le lancement de Prometheus se fait avec la commande suivante : docker-compose up -d Prometheus est maintenant accessible via l’URL : http://172.17.0.1:9090/
Pour vérifier que tout cela fonctionne, nous pouvons nous assurer que Prometheus arrive à lire les métriques de notre application : http://172.17.0.1:9090/targets
Si les targets ne sont pas toutes “UP”, patientez un instant et rafraîchissez la page. Notre instance de Prometheus est maintenant à même de collecter des métriques sur notre application, nous allons voir comment les afficher dans des dashboard avec Grafana.
Grafana
Pour installer Grafana, nous allons utiliser l’image Docker officielle et modifier notre fichier docker-compose.yml comme suit :
Le fichier de configuration des variables d’environnement pour Grafana se présent comme suit :
Il faut aussi configurer une datasource Prometheus pour Grafana. Dans le sous répertoire datasources du répertoire de provisionning de Grafana (ici /var/docker/infra/grafana/provisioning/datasources) ajouter un fichier datasource.yml :
Après ces paramétrages il convient de redémarrer vos conteneurs : docker-compose down && docker-compose up -d Grafana est alors disponible sur http://172.17.0.1:3000/
Comme expliqué précédemment, Grafana est un outil permettant de créer des tableaux de bord graphiques afin de visualiser les métriques exposées par l’application de manière plus compréhensible.
Nous allons installer un dashboard. Nous avons choisi celui nommé Spring Boot Statistics, mais il en existe beaucoup d’autres et vous pouvez même en créer un à votre convenance. http://172.17.0.1:3000/dashboards
Cliquer sur le bouton Import, puis saisir l’ID du dashboard à importer (ici 6756)
Cliquer sur Load et choisir la datasource Prometheus :
Cliquer sur Import. Après quelques secondes le dashboard s’affiche :
Voilà, c’est fini, votre solution est utilisable désormais.
Conclusion
Nous venons de montrer, que pour mettre en place une solution de monitoring d’une application Spring Boot, le triptyque Actuator, Prometheus, Grafana est une solution élégante.
Pour monitorer une application Spring boot, il est aussi possible de s’appuyer sur le couple Actuator/Spring Boot Admin. Cette solution reste cependant limitée au monitoring des seules applications Spring Boot, et ne permet ni de monitorer l’infrastructure (machine hôte, conteneurs, proxy web, base de données, …), ni les applications non écrites avec Java/Spring Boot.
L’intérêt de la solution Prometheus/Grafana, présentée ici, est qu’elle permet de monitorer l’ensemble de votre infrastructure et de vos applications. De nombreux outils intègrent nativement des endpoints OpenMetrics, et il existe aussi de nombreux Exporters Prometheus. Il existe aussi des librairies comparables à Spring Boot Actuator pour d’autres langages tels que Node.Js ou Go. Leurs listes sont disponibles sur le site Prometheus (se reporter aux références).
En outre, grâce à l’utilisation de Docker, nous avons vu qu’elle reste simple à mettre en œuvre, tout en permettant de monitorer l'ensemble du système (grâce aux modules tels que le NodeExporter, ou cAdvisor).
Nous avons également vu comment utiliser les métriques techniques pour monitorer une application Spring Boot. Dans les articles suivants, nous présenterons des solutions pour créer et exporter des métriques liées aux exceptions survenues dans une API REST et dans un Batch Spring Boot.
Références
Spring Boot Actuator :
Spring Boot Admin :
- A Guide to Spring Boot Admin | Baeldung
- Spring Boot Admin Reference Guide (codecentric.github.io)
- Spring Boot Admin Tutorial | Vojtech Ruzicka's Programming Blog
Docker
- Empowering App Development for Developers | Docker
- Docker Desktop for Mac and Windows | Docker
- Docker Documentation | Docker Documentation
- Get Docker | Docker Documentation
- Overview of Docker Compose | Docker Documentation
- Reference documentation | Docker Documentation
Prometheus
- Prometheus - Monitoring system & time series database
- Configuration | Prometheus
- Monitoring Linux host metrics with the Node Exporter | Prometheus
- Monitoring Docker container metrics using cAdvisor | Prometheus