Prometheus-Metriken in Rust: Bibliotheken prometheus und metrics

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

Prometheus-Metriken in Rust: Überwachung von Leistung und Ausfallsicherheit

\n\n

In der modernen Entwicklung von Backend-Anwendungen in Rust ist Monitoring zu einem unverzichtbaren Bestandteil der Produktionsinfrastruktur geworden. Prometheus ist der De-facto-Standard für die Erfassung und Speicherung von Metriken, und seine Integration mit Rust ermöglicht die Überwachung von Leistung, CPU-Auslastung, Anzahl der Anfragen, Fehlern und vielem mehr. In diesem Artikel betrachten wir zwei Hauptbibliotheken: prometheus (offizieller Client) und metrics + metrics-exporter-prometheus (ein abstrakterer Ansatz).

\n\n

Warum braucht man Metriken in Rust?

\n

Metriken ermöglichen:

\n
    \n
  • Den Zustand des Dienstes in Echtzeit zu verfolgen
  • \n
  • Engpässe zu erkennen (Latenz, Fehler)
  • \n
  • Dashboards in Grafana zu erstellen
  • \n
  • Alarme einzurichten (z. B. bei Abfall von QPS oder Anstieg von Fehlern)
  • \n
\n\n

Installation und Konfiguration der Bibliothek prometheus

\n

Fügen Sie in Cargo.toml hinzu:

\n
[dependencies]\nprometheus = { version = "0.13", features = ["process"] }\nactix-web = "4"  # für das Beispiel mit dem Webserver\ntokio = { version = "1", features = ["full"] }\n
\n\n

Die Bibliothek prometheus bietet drei Haupttypen von Metriken: Counter, Gauge, Histogram.

\n\n

Beispiel: Erstellen und Registrieren von Metriken

\n
use prometheus::{Counter, Gauge, Histogram, HistogramOpts, Opts, Registry};\n\nfn main() {\n    // Erstellen eines Metrik-Registers\n    let registry = Registry::new();\n\n    // Counter — Zähler für Anfragen\n    let request_counter = Counter::with_opts(\n        Opts::new("http_requests_total", "Total HTTP requests")\n            .const_label("service", "my_app")\n    ).unwrap();\n    registry.register(Box::new(request_counter.clone())).unwrap();\n\n    // Gauge — aktuelle Anzahl aktiver Verbindungen\n    let active_connections = Gauge::with_opts(\n        Opts::new("active_connections", "Number of active connections")\n    ).unwrap();\n    registry.register(Box::new(active_connections.clone())).unwrap();\n\n    // Histogram — Verteilung der Antwortzeiten\n    let request_duration = Histogram::with_opts(\n        HistogramOpts::new("http_request_duration_seconds", "Request duration in seconds")\n            .buckets(vec![0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1.0, 2.5, 5.0, 10.0])\n    ).unwrap();\n    registry.register(Box::new(request_duration.clone())).unwrap();\n\n    // Simulation der Nutzung\n    request_counter.inc();\n    active_connections.set(42.0);\n    request_duration.observe(0.123);\n}\n
\n\n

Export von Metriken über HTTP (actix-web)

\n

Damit Prometheus Metriken sammeln kann, müssen diese im /metrics-Format bereitgestellt werden:

\n
use actix_web::{web, App, HttpServer, HttpResponse, Responder};\nuse prometheus::{Encoder, TextEncoder, Registry};\nuse std::sync::Arc;\n\nasync fn metrics_handler(registry: web::Data<Arc<Registry>>) -> impl Responder {\n    let encoder = TextEncoder::new();\n    let mut buffer = Vec::new();\n    encoder.encode(®istry.gather(), &mut buffer).unwrap();\n    HttpResponse::Ok()\n        .content_type("text/plain; charset=utf-8")\n        .body(buffer)\n}\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n    let registry = Arc::new(Registry::new());\n    // ... Metriken wie oben registrieren ...\n\n    HttpServer::new(move || {\n        App::new()\n            .app_data(web::Data::new(registry.clone()))\n            .route("/metrics", web::get().to(metrics_handler))\n    })\n    .bind("127.0.0.1:9090")?\n    .run()\n    .await\n}\n
\n\n

Bibliothek metrics — Hochrangiger Ansatz

\n

Eine Alternative ist die Crate metrics mit dem Exporter metrics-exporter-prometheus. Sie bietet Makros zur schnellen Erstellung von Metriken:

\n
[dependencies]\nmetrics = "0.21"\nmetrics-exporter-prometheus = "0.                    

Empfehlungen