Überwachung von C++-Anwendungen: Bibliotheken und Tools zur Metrikenerfassung

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: Tools und Bibliotheken zur Metrikenerfassung und Protokollierung



Die Entwicklung mit C++ umfasst oft die Erstellung hochbelasteter Systeme, bei denen Leistung und Stabilität kritisch sind. Ohne eine qualitativ hochwertige Überwachung ist es unmöglich, Engpässe, Speicherlecks oder anomales Verhalten schnell zu erkennen. In diesem Artikel betrachten wir die wichtigsten Bibliotheken und Ansätze zur Organisation der Überwachung von C++-Anwendungen – von der Metrikenerfassung bis zur Integration mit gängigen Observability-Systemen.



Warum ist die Überwachung von C++-Anwendungen notwendig?

Die wichtigsten Aufgaben der Überwachung:

  • Verfolgung der CPU-, Speicher-, Festplatten- und Netzwerkauslastung.
  • Messung der Latenz (Verzögerung) bei der Anfrageverarbeitung.
  • Erfassung der Anzahl von Fehlern und Ausnahmen.
  • Profiling von Hot Paths im Code.
  • Automatische Benachrichtigung bei Erreichen von Schwellenwerten.


Wichtige Bibliotheken für die C++-Überwachung



1. Prometheus-CPP (prometheus-cpp)

Eine der beliebtesten Bibliotheken zum Sammeln und Exportieren von Metriken im Prometheus-Format. Ermöglicht die Erstellung von Zählern (Counter), Histogrammen (Histogram) und Messfühlern (Gauge).

Anwendungsbeispiel:

#include <prometheus/counter.h>#include <prometheus/exposer.h>#include <prometheus/registry.h>

// HTTP-Endpunkt für die Metrikenerfassungprometheus::Exposer exposer{"0.0.0.0:8080"};auto registry = std::make_shared<prometheus::Registry>();

// Zähler erstellenauto& counter_family = prometheus::BuildCounter() .Name("http_requests_total") .Help("Total HTTP requests") .Register(*registry);

auto& http_requests = counter_family.Add({{"method", "GET"}});

// Metriken exponierenexposer.RegisterCollectable(registry);

// Zähler bei jeder Anfrage erhöhenhttp_requests.Increment();


2. OpenTelemetry C++

Ein moderner Standard für die Erfassung von Traces, Metriken und Logs. OpenTelemetry für C++ bietet ein SDK zur Instrumentierung von Code und zum Export von Daten in jedes Backend (Jaeger, Zipkin, Prometheus).

Beispiel für die Einrichtung von Tracing:

#include <opentelemetry/trace/provider.h>#include <opentelemetry/exporters/otlp/otlp_http_exporter.h>#include <opentelemetry/sdk/trace/tracer_provider.h>

// Exporter initialisierenauto exporter = std::unique_ptr<opentelemetry::sdk::trace::SpanExporter>( new opentelemetry::exporter::otlp::OtlpHttpExporter());

auto processor = std::unique_ptr<opentelemetry::sdk::trace::SpanProcessor>( new opentelemetry::sdk::trace::SimpleSpanProcessor(std::move(exporter)));

auto provider = std::shared_ptr<opentelemetry::trace::TracerProvider>( new opentelemetry::sdk::trace::TracerProvider(std::move(processor)));

opentelemetry::trace::Provider::SetTracerProvider(provider);

// Span erstellenauto tracer = provider->GetTracer("my_app");auto span = tracer->StartSpan("process_request");span->SetAttribute("user_id", 12345);span->End();


3. spdlog + Metriken

Obwohl spdlog eine Bibliothek zur Protokollierung ist, wird sie oft mit benutzerdefinierten Metriken kombiniert. Beispielsweise kann man die Ausführungszeit von Funktionen protokollieren und die Logs mit Drittanbieter-Tools (Filebeat + Elasticsearch) parsen.

Beispiel für die Zeitmessung mit spdlog:

#include <spdlog/spdlog.h>#include <chrono>

void process_data() { auto start = std::chrono::high_resolution_clock::now(); // ... Geschäftslogik ... auto end = std::chrono::high_resolution_clock::now(); auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(end - start); spdlog::info("process_data hat {} ms gedauert", duration.count());}


4. Google Performance Tools (gperftools)

Eine Reihe von Tools zum Profiling: CPU-Profiler, Heap-Profiler und Hea

Empfehlungen