Dashboard Grafana dockerizé

A l’instar de SLF4J pour les logs, Micrometer est la façade d’export de métriques utilisée par Spring Boot et ses Actuators. Micrometer supporte une douzaine de systèmes de monitoring : Datalog, Netflix Atlas, New Relic, JMX, CloudWatch, InfluxDB ou bien encore Prometheus.

Récemment, j’ai poursuivi le travail initié par Kevin Crawley pour intégrer Prometheus et Grafana dans la version microservices de Spring Petclinic. Proposée par Maciej Szarliński, l’idée consistait à remplacer les compteurs Micrometer de typeregistry.counter(« create.visit »).increment() par l’annotation @Timed.

J’ai profité de ce changement pour améliorer le packaging Docker de Grafana et en simplifier l’accès. Pour accéder au dashboard personnalisé exposant l’évolution du nombre d’animaux et de propriétaires, un docker-compose up suivi d’un clic sur l’URL du dashboard sont désormais suffisant.
Ce billet présente les configurations Docker et Grafana mises en oeuvre.

Dashboard Grafana Spring Petclinic Metrics

Docker compose

Le docker-compose.yml de Spring Petclinic Microservices est relativement simple : il pointe sur 2 Dockerfile Grafana et Promotheus personnalisés.

L’usage de volume Docker n’est pas nécessaire.
A noter que le port 9090 de Prometheus est mappé sur le port 9091 car le port 9090 était déjà occupé par Spring Boot Admin.

grafana-server:
  build: ./docker/grafana
  container_name: grafana-server
  mem_limit: 256M
  ports:
  - 3000:3000

prometheus-server:
  build: ./docker/prometheus
  container_name: prometheus-server
  mem_limit: 256M
  ports:
  - 9091:9090

Dockerfile Prometheus

Prometheus est un outil de supervision chargé de collecter et de stocker les métriques collectées (dans notre étude de cas depuis des actuators Spring Boot). Les métriques sont stockées dans une base de données de type Time Series. Prometheus propose bien évidemment une API HTTP pour consulter ces métriques et créer de jolis tableaux de bord dans des outils comme Grafana ou WaveFront.

Mise en place par Kevin Crawley, l’image Docker de Prometheus docker/prometheus/Dockerfile personnalise l’image officielle de Prometheus 2.4.2 en ajoutant le fichier prometheus.yml dans le répertoire de configuration /etc/prometheus :

FROM prom/prometheus:v2.4.2
ADD prometheus.yml /etc/prometheus/

Le fichier de configuration prometheus.yml précise quels sont les actuators Spring Boot que Prometheus doit interroger périodiquement pour récupérer et historiser les métriques. Chose amusante : Prometheus se monitore lui-même.

# my global config
global:
  scrape_interval:     15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
- job_name: prometheus
  static_configs:
  - targets: ['localhost:9090']

- job_name: api-gateway
  metrics_path: /actuator/prometheus
  static_configs:
  - targets: ['api-gateway:8080']

- job_name: customers-service
  metrics_path: /actuator/prometheus
  static_configs:
  - targets: ['customers-service:8081']

- job_name: visits-service
  metrics_path: /actuator/prometheus
  static_configs:
  - targets: ['visits-service:8082']

- job_name: vets-service
  metrics_path: /actuator/prometheus
  static_configs:
  - targets: ['vets-service:8083']

Les métriques préfixées par petclinic_ sont accessibles depuis l’interface web de Prometheus http://localhost:9091/ :

Prometheus UI

Dans l’exemple ci-dessus, la métrique petclinic_pet_seconds_count comptabilise le nombre d’appels différents au contrôleur REST PetResource :

  • Le GET sur /petTypes pour lister les types d’animaux
  • Le POST sur /owners/{ownerId}/pets pour ajouter un animal à un propriétaire

Dockerfile Grafana

Pratique, l’IHM de consultation des métriques proposée par Prometheus ne permet pas de construire de jolis tableaux de bord. C’est pourquoi les auteurs de Prometheus préconisent l’utilisation de Grafana.

Le Dockerfile de Grafana repose sur l’image officielle 5.2.4 de Grafana, y ajoute 2 répertoires /provisioning et /dashboard et le fichier de configuration grafana.ini :

FROM grafana/grafana:5.2.4
ADD ./provisioning /etc/grafana/provisioning
ADD ./grafana.ini /etc/grafana/grafana.ini
ADD ./dashboards /var/lib/grafana/dashboards

L’image Grafana est livrée avec un fichier grafana.ini dont toutes les options sont commentées avec les valeurs par défaut. Pour le personnaliser, je me suis référé à la documentation :

  1. Spécifier le répertoire contenant les fichiers permettant de pré-configurer Grafana avec la source de données Prometheus et le dashboard pour Petclinic
  2. Désactiver l’authentification et permettre ainsi à un utilisateur non authentifié de consulter le dashboard Spring Petclinic Metrics

Au final, voici à quoi ressemble le fichier de configuration grafana.ini :

##################### Spring Petclinic Microservices Grafana Configuration #####################

#################################### Paths ####################################
[paths]
# folder that contains provisioning config files that grafana will apply on startup and while running.
provisioning = /etc/grafana/provisioning


#################################### Anonymous Auth ##########################
# Anonymous authentication has been enabled in the Petclinic sample with Admin role
# Do not do that in Production environment
[auth.anonymous]
# enable anonymous access
enabled = true

# specify organization name that should be used for unauthenticated users
org_name = Main Org.

# specify role for unauthenticated users
org_role = Admin

Le fichier de pré-configuration de la source de données Prometheus provisionning/datasources/all.yml référence l’URL de Prometheus avec son port interne à Docker :

apiVersion: 1

datasources:
- name: Prometheus
  type: prometheus
  access: proxy
  org_id: 1
  url: http://prometheus-server:9090
  is_default: true
  version: 1
  editable: true

Le fichier de pré-configuration des dashboards provisioning/dashboards/all.yml référence le répertoire /var/lib/grafana/dashboards dans lequel a été copié le fichier de configuration du dashboard Spring Petclinic Metrics grafana-petclinic-dashboard.json (cf. Dockerfile) :

apiVersion: 1

providers:
- name: 'default'
  orgId: 1
  folder: ''
  type: file
  disableDeletion: false
  updateIntervalSeconds: 10 
  options:
    path: /var/lib/grafana/dashboards

Le fichier de configuration du dashboard Spring Petclinic Metrics grafana-petclinic-dashboard.json s’appuie à la fois sur les métriques personnalisées préfixées par petclinic_ et sur les métriques générées nativement par Spring Boot.

Extrait d’utilisation de la métrique http_server_requests_seconds_sum :

"expr": "sum(rate(http_server_requests_seconds_sum{status!~\"5..\"}[1m]))/sum(rate(http_server_requests_seconds_count{ status!~\"5..\"}[1m]))",
"format": "time_series",
"intervalFactor": 1,
"legendFormat": "HTTP - AVG",
"refId": "A"

Extrait d’utilisation de la métrique petclinic_owner_seconds_count :

"expr": "sum(petclinic_owner_seconds_count{method=\"POST\", status=\"201\"})",
"format": "time_series",
"instant": false,
"intervalFactor": 1,
"legendFormat": "owner create",
"refId": "A"

Conclusion

Cet article aura montré comment construire une image docker de Grafana pour vos démos.

Au démarrage de Grafana, la source de données vers Prometheus est pré-configurée. Le tableau de bord Spring Petclinic Metrics utilise cette source de données pour récupérer les métriques Spring Boot et Petclinic historisées par Prometheus.
L’accès au tableau de bord est public. L’URL est connue : http://localhost:3000/d/69JXeR0iw/spring-petclinic-metrics

Les instructions de démarrage des images Docker peuvent être retrouvées dans le README.md du repo GitHub spring-petclinic/spring-petclinic-microservices.

Ressources :

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.