Surveillance des applications C++ avec la bibliothèque metrics
Lors du développement de systèmes à forte charge et critiques en C++, il est impossible de se passer d'une surveillance de qualité. Le suivi des performances, la détection des goulots d'étranglement et la réaction rapide aux pannes sont des tâches clés pour les DevOps et les développeurs. La bibliothèque metrics (également connue sous le nom de cppmetrics) offre un moyen léger et efficace de collecter, d'agréger et d'exporter des métriques directement depuis le code C++.
Dans cet article, nous analyserons les principales fonctionnalités de la bibliothèque, son architecture, montrerons des exemples d'utilisation et expliquerons comment l'intégrer avec des systèmes de collecte de données tels que Prometheus.
Qu'est-ce que la bibliothèque metrics ?
metrics est une bibliothèque header-only pour C++ (C++11 et supérieur) qui implémente les types de métriques populaires de Dropwizard Metrics (Java). Elle comprend :
- Compteurs (Counters) — pour compter les événements (par exemple, le nombre de requêtes).
- Jauges (Gauges) — pour les valeurs instantanées (charge CPU actuelle, taille de la file d'attente).
- Histogrammes (Histograms) — pour analyser la distribution des valeurs (temps de réponse, taille des paquets).
- Minuteurs (Timers) — une combinaison de compteur et d'histogramme pour mesurer la durée des opérations.
- Mètres (Meters) — mesurent le taux d'événements (requêtes par seconde).
La bibliothèque prend en charge la sécurité des threads, des réservoirs d'échantillonnage configurables (par exemple, à décroissance exponentielle) et l'exportation des métriques aux formats JSON, Prometheus, Graphite.
Installation et configuration
Comme la bibliothèque est header-only, l'installation se résume à copier les fichiers d'en-tête dans votre projet. Vous pouvez utiliser CMake FetchContent ou simplement copier le dossier metrics dans include :
#include <metrics/metrics.hpp>Pour fonctionner avec Prometheus, vous devrez également installer prometheus-cpp (optionnel).
Exemple d'utilisation : métriques de base
Considérons un simple serveur HTTP qui compte le nombre de requêtes et mesure leur temps de traitement.
#include <metrics/metrics.hpp>#include <iostream>#include <thread>#include <chrono>
using namespace metrics;
// Création d'un registre de métriquesMetricsRegistry registry("my_app");
// Définition d'un compteur et d'un minuteurCounter& request_counter = registry.counter("http.requests.total");Timer& request_timer = registry.timer("http.requests.duration");
void handle_request() { auto context = request_timer.create_context(); // démarrage du minuteur request_counter.increment(); // incrémentation du compteur
// Simulation du traitement std::this_thread::sleep_for(std::chrono::milliseconds(rand() % 100));
// Le temps est automatiquement enregistré lors de la destruction du context}
int main() { for (int i = 0; i < 100; ++i) { handle_request(); }
// Affichage des métriques dans la console (JSON) std::cout << registry.report_json() << std::endl; return 0;}En résultat, vous obtiendrez un JSON avec le compteur, les 50e, 75e, 95e et 99e percentiles du temps de traitement.
Exportation des métriques vers Prometheus
Pour l'intégration avec Prometheus, la bibliothèque fournit un module séparé metrics_prometheus. Exemple de configuration d'un endpoint :
#include <metrics/metrics.hpp>#include <metrics/prometheus/prometheus_collector.hpp>#include <metrics/prometheus/prometheus_server.hpp>
using namespace metrics;
int main() { MetricsRegistry registry("my_service"); // ... enregistrement des métriques ...
// Création d'un serveur HTTP sur le port 8080 PrometheusServer server(registry, 8080); server.start();
std::cout << "Prometheus metrics available a Aussi dans la bibliothèque
Event Bus et le pattern Observer en Rust : implémentation d'une architecture événementielle
Validator Go : guide complet avec exemples
Mise en cache en C++ : Redis, couche de données et autres outils
Travailler avec Kafka en Kotlin : bibliothèques et exemples
Awilix pour TypeScript : guide complet avec exemples