Überwachung von C++-Anwendungen: Bibliothek metrics zur Erfassung von Metriken

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Überwachung von C++-Anwendungen mit der Bibliothek metrics



Bei der Entwicklung hochlastiger und kritischer Systeme in C++ kommt man ohne eine qualitativ hochwertige Überwachung nicht aus. Die Leistungsverfolgung, das Erkennen von Engpässen und das schnelle Reagieren auf Ausfälle sind zentrale Aufgaben von DevOps und Entwicklern. Die Bibliothek metrics (auch bekannt als cppmetrics) bietet eine leichte und effiziente Möglichkeit, Metriken direkt aus dem C++-Code zu erfassen, zu aggregieren und zu exportieren.



In diesem Artikel werden wir die wichtigsten Funktionen der Bibliothek, ihre Architektur, Anwendungsbeispiele und die Integration mit Datenerfassungssystemen wie Prometheus behandeln.



Was ist die Bibliothek metrics?



metrics ist eine Header-Only-Bibliothek für C++ (C++11 und höher), die die gängigen Metriktypen aus Dropwizard Metrics (Java) implementiert. Sie umfasst:



  • Zähler (Counters) — zum Zählen von Ereignissen (z. B. Anzahl der Anfragen).
  • Messfühler (Gauges) — für Momentanwerte (aktuelle CPU-Auslastung, Warteschlangengröße).
  • Histogramme (Histograms) — zur Analyse der Werteverteilung (Antwortzeit, Paketgröße).
  • Timer (Timers) — eine Kombination aus Zähler und Histogramm zur Messung der Operationsdauer.
  • Meter (Meters) — messen die Rate von Ereignissen (Anfragen pro Sekunde).


Die Bibliothek unterstützt Thread-Sicherheit, konfigurierbare Reservoirs für das Sampling (z. B. exponentiell abklingend) und den Export von Metriken in den Formaten JSON, Prometheus, Graphite.



Installation und Einbindung



Da die Bibliothek Header-Only ist, beschränkt sich die Installation auf das Kopieren der Header-Dateien in Ihr Projekt. Sie können CMake FetchContent verwenden oder einfach den Ordner metrics in Ihr include-Verzeichnis kopieren:



#include <metrics/metrics.hpp>


Für die Arbeit mit Prometheus muss zusätzlich prometheus-cpp installiert werden (optional).



Anwendungsbeispiel: Basis-Metriken



Betrachten wir einen einfachen HTTP-Server, der die Anzahl der Anfragen zählt und deren Bearbeitungszeit misst.



#include <metrics/metrics.hpp>#include <iostream>#include <thread>#include <chrono>

using namespace metrics;

// Erstellen einer Metrik-RegistryMetricsRegistry registry("my_app");

// Definieren eines Zählers und eines TimersCounter& request_counter = registry.counter("http.requests.total");Timer& request_timer = registry.timer("http.requests.duration");

void handle_request() { auto context = request_timer.create_context(); // Timer starten request_counter.increment(); // Zähler erhöhen

// Bearbeitung simulieren std::this_thread::sleep_for(std::chrono::milliseconds(rand() % 100));

// Zeit wird beim Zerstören des context automatisch erfasst}

int main() { for (int i = 0; i < 100; ++i) { handle_request(); }

// Metriken auf der Konsole ausgeben (JSON) std::cout << registry.report_json() << std::endl; return 0;}


Als Ergebnis erhalten Sie ein JSON mit dem Zähler und den 50., 75., 95. und 99. Perzentilen der Bearbeitungszeit.



Export von Metriken nach Prometheus



Für die Integration mit Prometheus bietet die Bibliothek ein separates Modul metrics_prometheus. Beispiel für die Konfiguration eines Endpunkts:



#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"); // ... Metriken registrieren ...

// Erstellen eines HTTP-Servers auf Port 8080 PrometheusServer server(registry, 8080); server.start();

std::cout << "Prometheus metrics available a

Empfehlungen