Bibliothek prometheus-cpp: Sammeln von Prometheus-Metriken in C++-Anwendungen
\n\nIn der modernen Softwareentwicklung spielt die Überwachung des Anwendungszustands eine entscheidende Rolle. Prometheus ist ein Open-Source-System für Monitoring und Alarmierung, das Metriken von Zielobjekten über HTTP-Endpunkte sammelt. Für die Integration von Prometheus in C++-Projekte gibt es die leistungsstarke und flexible Bibliothek prometheus-cpp. Sie ermöglicht Entwicklern, das Sammeln von Metriken (Zähler, Messgeräte, Histogramme) einfach in ihren Code einzufügen und diese in einem für den Prometheus-Server verständlichen Format zu exportieren.
Was ist prometheus-cpp?
\n\nprometheus-cpp ist eine Client-Bibliothek für Prometheus, geschrieben in C++17. Sie bietet alle notwendigen Werkzeuge zum Erstellen, Aktualisieren und Exportieren von Metriken. Die Bibliothek unterstützt die drei wichtigsten Metriktypen, die im Prometheus-Datenmodell definiert sind:
- \n
- Counter (Zähler) — ein monoton steigender Wert (z. B. Anzahl der Anfragen, Fehler, ausgeführten Aufgaben). \n
- Gauge (Messgerät) — ein Wert, der beliebig steigen und fallen kann (z. B. aktuelle Temperatur, Anzahl aktiver Verbindungen). \n
- Histogram (Histogramm) — Verteilung von Werten über vordefinierte Intervalle (z. B. Ausführungszeit einer Anfrage). \n
Darüber hinaus werden Summary (Quantile) und Family (Gruppen von Metriken desselben Typs mit unterschiedlichen Labels) unterstützt.
\n\nInstallation und Einbindung
\n\nDie Bibliothek wird über Paketmanager (vcpkg, Conan) verbreitet oder aus dem Quellcode erstellt. Beispiel für die Installation über vcpkg:
\n\nvcpkg install prometheus-cpp\n\nNach der Installation muss die Bibliothek in der Datei CMakeLists.txt eingebunden werden:
\n\nfind_package(prometheus-cpp CONFIG REQUIRED)\ntarget_link_libraries(your_target PRIVATE prometheus-cpp::push prometheus-cpp::pull prometheus-cpp::core)\n\nHier wird push zum Senden von Metriken an den Pushgateway verwendet, pull zum Erstellen eines HTTP-Servers, von dem Prometheus die Metriken abholt, und core enthält die grundlegenden Klassen (Registry, Counter, Gauge, Histogram).
Anwendungsbeispiel: HTTP-Server zum Sammeln von Metriken
\n\nBetrachten wir ein einfaches Beispiel, das einen HTTP-Server auf Port 8080 erstellt, der Metriken im Prometheus-Format ausliefert. Für die HTTP-Verarbeitung wird der in der Bibliothek integrierte Mechanismus basierend auf simple-web-server oder libmicrohttpd verwendet.
#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 // Erstellen eines HTTP-Servers auf Port 8080\n prometheus::Exposer exposer{"0.0.0.0:8080"};\n\n // Erstellen eines Metrik-Registers\n auto registry = std::make_shared<prometheus::Registry>();\n\n // 1. Counter (Zähler)\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 (Messgerät)\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 (Histogramm)\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 Auch in der Bibliothek
Event Bus und das Observer-Pattern in Go (Golang): pub/sub-Implementierung
Konfiguration von Swift-Apps: Die Bibliothek SwiftyConfiguration
Logging für JavaScript (Node.js): Die besten Lösungen und Bibliotheken
Verwendung von GraphQL in Swift: Die Bibliotheken Apollo und Relay für iOS/macOS