Prometheus-Metriken in Rust: Überwachung von Leistung und Ausfallsicherheit
\n\nIn 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).
Warum braucht man Metriken in Rust?
\nMetriken 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
Installation und Konfiguration der Bibliothek prometheus
\nFügen Sie in Cargo.toml hinzu:
[dependencies]\nprometheus = { version = "0.13", features = ["process"] }\nactix-web = "4" # für das Beispiel mit dem Webserver\ntokio = { version = "1", features = ["full"] }\n\n\nDie Bibliothek prometheus bietet drei Haupttypen von Metriken: Counter, Gauge, Histogram.
Beispiel: Erstellen und Registrieren von Metriken
\nuse 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\nExport von Metriken über HTTP (actix-web)
\nDamit Prometheus Metriken sammeln kann, müssen diese im /metrics-Format bereitgestellt werden:
\nuse 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\nBibliothek metrics — Hochrangiger Ansatz
\nEine Alternative ist die Crate metrics mit dem Exporter metrics-exporter-prometheus. Sie bietet Makros zur schnellen Erstellung von Metriken:
[dependencies]\nmetrics = "0.21"\nmetrics-exporter-prometheus = "0. Auch in der Bibliothek
GraphQL in C++: Die Bibliothek cppgraphqlgen für moderne APIs
ImageSharp für C# (.NET): Komplettguide mit Beispielen
Konfiguration von Rust-Anwendungen: Bibliotheken config und dotenv
Event Bus und das Observer-Pattern in Java: Implementierung einer lose gekoppelten Architektur