Bibliothèque prometheus-cpp : Collecte de métriques Prometheus dans les applications C++
\n\nDans le développement logiciel moderne, la surveillance de l'état des applications joue un rôle crucial. Prometheus est un système de surveillance et d'alerte open source qui collecte des métriques depuis des cibles via des points de terminaison HTTP. Pour intégrer Prometheus dans des projets C++, il existe une bibliothèque puissante et flexible appelée prometheus-cpp. Elle permet aux développeurs d'ajouter facilement la collecte de métriques (compteurs, jauges, histogrammes) dans leur code et de les exporter dans un format compréhensible par le serveur Prometheus.
Qu'est-ce que prometheus-cpp ?
\n\nprometheus-cpp est une bibliothèque cliente pour Prometheus, écrite en C++17. Elle fournit tous les outils nécessaires pour créer, mettre à jour et exporter des métriques. La bibliothèque prend en charge les trois principaux types de métriques définis dans le modèle de données Prometheus :
- \n
- Counter (compteur) — une valeur qui augmente de manière monotone (par exemple, le nombre de requêtes, d'erreurs, de tâches effectuées). \n
- Gauge (jauge) — une valeur qui peut augmenter et diminuer arbitrairement (par exemple, la température actuelle, le nombre de connexions actives). \n
- Histogram (histogramme) — la distribution des valeurs selon des intervalles prédéfinis (par exemple, le temps d'exécution d'une requête). \n
De plus, les Summary (quantiles) et Family (groupes de métriques du même type avec des étiquettes différentes) sont également pris en charge.
\n\nInstallation et configuration
\n\nLa bibliothèque est distribuée via des gestionnaires de paquets (vcpkg, Conan) ou peut être compilée à partir des sources. Exemple d'installation via vcpkg :
\n\nvcpkg install prometheus-cpp\n\nAprès l'installation, dans le fichier CMakeLists.txt, il faut inclure la bibliothèque :
\n\nfind_package(prometheus-cpp CONFIG REQUIRED)\ntarget_link_libraries(your_target PRIVATE prometheus-cpp::push prometheus-cpp::pull prometheus-cpp::core)\n\nIci, push est utilisé pour envoyer des métriques vers Pushgateway, pull pour créer un serveur HTTP à partir duquel Prometheus récupérera les métriques, et core contient les classes principales (Registry, Counter, Gauge, Histogram).
Exemple d'utilisation : Serveur HTTP pour la collecte de métriques
\n\nConsidérons un exemple simple qui crée un serveur HTTP sur le port 8080, fournissant des métriques au format Prometheus. Pour la gestion HTTP, le mécanisme intégré à la bibliothèque basé sur simple-web-server ou libmicrohttpd est utilisé.
#include <prometheus/exposer.h>\n#include <prometheus/registry.h>\n#include <prometheus/counter.h>\n#include <prometheus/gauge.h>\n#include <prometheus/histogram.h>\n#include <thread>\n#include <chrono>\n\nint main() {\n // Création d'un serveur HTTP sur le port 8080\n prometheus::Exposer exposer{"0.0.0.0:8080"};\n\n // Création d'un registre de métriques\n auto registry = std::make_shared<prometheus::Registry>();\n\n // 1. Counter (compteur)\n auto& counter_family = prometheus::BuildCounter()\n .Name("http_requests_total")\n .Help("Total number of HTTP requests")\n .Register(*registry);\n\n auto& counter = counter_family.Add({{"method", "GET"}, {"endpoint", "/api"}});\n\n // 2. Gauge (jauge)\n auto& gauge_family = prometheus::BuildGauge()\n .Name("memory_usage_bytes")\n .Help("Current memory usage in bytes")\n .Register(*registry);\n\n auto& gauge = gauge_family.Add({});\n\n // 3. Histogram (histogramme)\n auto& histogram_family = prometheus::BuildHistogram()\n .Name("request_duration_seconds")\n .Help("Request duration in seconds")\n .Buckets({0.1, 0.5, 1.0, 2.5, 5.0})\n .Register(*registry);\n\n auto& histogram = histogram_family.Add({{"handler", "p