Grafana Stack đ 2. Collecte des mĂ©triques avec OpenTelemetry
Dans lâarticle prĂ©cĂ©dent , nous avons activĂ© lâobservabilitĂ© de Spring Boot 3 et vu comment ajouter des mĂ©triques personnalisĂ©es Ă une application.
Maintenant, il est nécessaire de collecter ces métriques et de les stocker avant de pouvoir les afficher dans Grafana.
Les autres articles de la série :
- Observabilité avec Spring Boot 3
- Collecte des métriques avec OpenTelemetry
- Collecte des logs avec OpenTelemetry
- DĂ©ploiement dâun Grafana
OpenTelemetry
OpenTelemetry est un collecteur de … tĂ©lĂ©mĂ©trie. Cela inclut les mĂ©triques, les logs et les traces. Mais OpenTelemetry, câest aussi une communautĂ© qui essaye de dĂ©crire une spĂ©cification pour dĂ©finir la mĂ©trologie. Par exemple, la spĂ©cification propose des conventions pour les noms de mĂ©triques.
Prérequis au déploiement
Docker Compose
Lâapplication que lâon a prise comme exemple dans lâarticle prĂ©cĂ©dent
est déployée via docker-compose
. Un script Ansible automatise le déploiement de la configuration du service sur le serveur et il suffit de faire un dc up -d
pour dĂ©marrer lâapplication et tous les services dĂ©pendants en production.
On va rester sur la mĂȘme techno pour dĂ©ployer la collecte des tĂ©lĂ©mĂ©tries.
Service prometheus
Comme expliquĂ© dans lâarticle prĂ©cĂ©dent, les mĂ©triques seront stockĂ©es par un serveur Prometheus . Il faut donc commencer par en dĂ©ployer un. Rien de compliquĂ© pour ce composant, voilĂ la dĂ©claration du service dans le compose.
services:
prometheus:
image: prom/prometheus:v2.44.0
restart: unless-stopped
command:
- --config.file=/etc/prometheus/prometheus.yml
- --storage.tsdb.path=/prometheus
# - --storage.tsdb.retention.time=90d
- --web.console.libraries=/usr/share/prometheus/console_libraries
- --web.console.templates=/usr/share/prometheus/consoles
volumes:
- /opt/bw/prometheus/:/etc/prometheus/
- prometheus_data:/prometheus
networks:
metrics: {}
volumes:
prometheus_data: {}
networks:
metrics: {}
Par dĂ©faut Prometheus garde les donnĂ©es pendant 15 jours. Il peut ĂȘtre intĂ©ressant dâĂ©tendre la durĂ©e de rĂ©tention Ă 90 jours ou plus. Pour cela ajouter lâoptions storage.tsdb.retention.time=
Ă la ligne de commande.
Prometheus se configure au travers dâun unique fichier prometheus.yml
passé en paramÚtre de la ligne de commande dans le dockerfile ci-dessus. Les paramÚtres de configuration sont détaillés dans la documentation
, voilà le fichier utilisé pour notre application.
---
global:
scrape_interval: 15s # By default, scrape targets every 15 seconds.
evaluation_interval: 15s # By default, scrape targets every 15 seconds.
# 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:
# Le job pour se collecter lui mĂȘme (optionel)
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
# Le job de collecte OpenTelemetry
- job_name: 'otel-exporter'
scrape_interval: 15s
file_sd_configs:
- files:
- 'targets/otel_targets.yml'
enfin, targets/otel_targets.yml
.
---
- targets:
- 'opentelemetry:9091'
LâintĂ©rĂȘt de passer par file_sd_configs
est que Prometheus va pouvoir faire du hot reload quand le fichier de cibles sera mis à jour. Il ne sera pas nécessaire de redémarrer le serveur pour ajouter une cible.
DĂ©tail important, le service prometheus
est placé dans un réseau metrics
, ce qui lâisolera du rĂ©seau sur lequel lâapplication est placĂ©e. Câest le service opentelemetry
qui fera le lien entre les deux sous-réseaux de docker.
Service OpenTelemetry
Il Ă©tait possible et sĂ»rement plus simple de configurer le prometheus pour aller scraper directement lâapplication. Mais câest aussi beaucoup moins Ă©volutif. En effet, dans le cas dâinfrastructure rĂ©seau plus complexe, un collecteur OpenTelemetry peu servir de collecteur intermĂ©diaire. De plus OTEL vient avec toute une panoplie de fonctionnalitĂ© pour la collecte et le traitement des mĂ©triques qui vont grandement simplifier certaines Ă©tapes lorsque lâon ajoutera les logs et les traces.
La version “standard” dâOpenTelemetry ne contient que les fonctionnalitĂ©s de base. Pour mettre en place toute une stack de mĂ©trologie, il sera plus intĂ©ressant dâutiliser la distribution contrib
qui vient avec un ensemble de plugins permettant de sâinterfacer avec Ă peu prĂšs tout.
https://github.com/open-telemetry/opentelemetry-collector-contrib
Configuration OpenTelemetry
OTEL se configure en 4 Ă©tapes :
- Les receveurs, qui récupÚrent la métrologie
- Les processeurs, qui traitent et transforment les événements
- Les exporteurs, qui renvoient les événements vers leurs points de stockage
- Le service, qui relie et ordonne les précédentes configurations
receivers:
prometheus/myapp:
config:
scrape_configs:
- job_name: 'otel-collector'
scrape_interval: 15s
metrics_path: '/actuator/prometheus'
# Si vous avez sĂ©curisĂ© la route comme prĂ©cognisĂ© dans lâarticle prĂ©cĂ©dent
# basic_auth:
# username: "otel_collector"
# password: "otel_password"
static_configs:
- targets: [myappservice:8081]
labels:
platform: 'prod'
On utilise le Prometheus Receiver qui va scraper la route de mĂ©trique de notre application au format prometheus. La configuration se fait exactement de la mĂȘme façon que pour un scraper prometheus normal.
Ă noter que Spring possĂšde un exporteur vers OTEL et serait donc capable dâenvoyer directement la tĂ©lĂ©mĂ©trie vers ce dernier. Jâaime moins cette approche, car elle rend lâapplication consciente de lâexistence du collecteur. Changer de collecteur demanderait de changer la configuration de lâapplication et crĂ©e une sorte de dĂ©pendance.
processors:
batch:
send_batch_size: 10000
send_batch_max_size: 11000
timeout: 10s
Parmi les bonnes pratiques OTEL, il est conseillé de toujours utiliser le Batch Processor , il va permettre de batcher les envoies de métriques et autres pour ne pas multiplier le nombre de connexions au serveur de destination.
exporters:
prometheus:
endpoint: '0.0.0.0:9091'
send_timestamps: true
enable_open_metrics: true
Le Prometheus Exporter va mettre Ă disposition dâun scraper les mĂ©triques rĂ©cupĂ©rĂ©es au format prometheus.
Le endpoint permet de dĂ©terminer lâinterface rĂ©seau utilisĂ© pour dĂ©ployer la route de collecte et le port. 0.0.0.0
déploie la route de collecte sur toutes les interfaces réseaux.
service:
pipelines:
metrics:
receivers: [prometheus/myapp]
processors: [batch]
exporters: [prometheus]
On dĂ©clare le pipeline pour les mĂ©triques en assemblant toutes les configurations que lâon vient de faire.
Service compose
services:
opentelemetry:
image: otel/opentelemetry-collector-contrib:0.77.0
user: 0:0
command:
- --config=/etc/otel/receivers.yaml
- --config=/etc/otel/processors.yaml
- --config=/etc/otel/exporters.yaml
- --config=/etc/otel/service.yaml
logging:
driver: local
options:
max-size: 10m
volumes:
- /opt/opentelemetry:/etc/otel:ro
networks:
myappnet: {}
metrics: {}
networks:
metrics: {}
myappnet: {}
On utilise lâimage opentelemetry-collector-contrib
qui contient tous les plugins supplémentaires dont on a besoin.
Dans la command
on inclut les fichiers de configuration que lâon vient de crĂ©er.
On place le service dans le réseau metrics
pour que le service prometheus
le voit et dans le réseau myappnet
pour quâil puisse se connecter Ă myappservice:8081
que lâon a dĂ©clarĂ© dans le scraper.
On monte un volume en lecture seule pour accéder aux fichiers de configurations.
Lâensemble des fichiers de configuration est disponible sur github .
Une fois la configuration en place, un dc up -d
devrait démarrer tous les services et commencer la collecte des métriques.
VĂ©rifications et debugging
Ă ce stade, Ă©tant donnĂ© quâil nây a pas encore dâinterface pour visualiser les mĂ©triques, il nâest pas facile de voir ce quâil se passe sous le capot et de comprendre ce quâil se passe quand un problĂšme survient.
Interface Prometheus
Prometheus possÚde une interface capable de visualiser certains éléments comme les valeurs des métriques recueilli ou la liste des cibles de scraping.
Open Telemetry en verbose
Autre astuce qui peut servir, mettre OpenTelemetry en verbose. Cela se fait grĂące au Logging Exporter .
exporters:
logging:
verbosity: detailed
En lâajoutant au pipeline, Open Telemetry va cracher beaucoup de logs, vraiment beaucoup. Chaque mĂ©trique y sera dĂ©taillĂ©e. Câest trĂšs pratique mais, on se noie rapidement dans la masse de logs qui sortent.
Conclusion
Nous avons mis en place un collecteur et de quoi stocker les métriques de notre application. Grùce à Open Telemetry les métriques de notre application sont bien au chaud dans Prometheus.
Dans lâarticle suivant, nous ferons la mĂȘme chose avec les logs de lâapplication.