Überwachung von Rust-Anwendungen: Überblick über wichtige Tools und Bibliotheken
Rust ist eine Systemprogrammiersprache, die zunehmend für die Erstellung hochlastiger und kritischer Dienste verwendet wird. Selbst der zuverlässigste Code kann jedoch in der Produktionsumgebung ausfallen. Eine effektive Überwachung ermöglicht es, Probleme rechtzeitig zu erkennen, ihre Ursache zu verstehen und einen stabilen Betrieb der Anwendung zu gewährleisten. In diesem Artikel betrachten wir die wichtigsten Bibliotheken und Tools zur Überwachung von Rust-Anwendungen: von der Metrikenerfassung bis zum verteilten Tracing.
1. Erfassung und Export von Metriken
Metriken sind numerische Indikatoren für den Zustand einer Anwendung (Anzahl der Anfragen, Antwortzeit, Speichernutzung usw.). Für ihre Erfassung in Rust werden zwei Hauptbibliotheken verwendet.
1.1. metrics und metrics-exporter-prometheus
Das metrics-Ökosystem bietet eine einfache und flexible Möglichkeit zur Registrierung von Metriken. Es unterstützt Zähler, Histogramme, Messfühler und andere Typen. Für den Export nach Prometheus wird die Crate metrics-exporter-prometheus verwendet.
use metrics::{counter, histogram};use metrics_exporter_prometheus::PrometheusBuilder;use std::net::SocketAddr;
#[tokio::main]async fn main() -> Result<(), Box<dyn std::error::Error>> { // Einrichtung des HTTP-Endpunkts für Prometheus let addr: SocketAddr = "0.0.0.0:9000".parse()?; let builder = PrometheusBuilder::new().with_http_listener(addr); builder.install()?;
// Registrierung von Metriken counter!("http_requests_total", 1); histogram!("request_duration_seconds", 0.045);
// Metriken im Hintergrund aufzeichnen loop { counter!("http_requests_total", 1); histogram!("request_duration_seconds", 0.023); tokio::time::sleep(tokio::time::Duration::from_secs(5)).await; }}Vorteile: hohe Leistung, minimaler Speicherverbrauch, Unterstützung für benutzerdefinierte Exporteure.
1.2. opentelemetry (Metriken)
OpenTelemetry ist ein universeller Standard für die Erfassung von Telemetriedaten. Die Crate opentelemetry unterstützt Metriken, Traces und Logs. Für den Export nach Prometheus wird opentelemetry-prometheus verwendet.
use opentelemetry::{global, KeyValue};use opentelemetry::metrics::MeterProvider;use opentelemetry_prometheus::PrometheusExporter;
fn init_meter() { let exporter = PrometheusExporter::default(); let provider = opentelemetry::sdk::metrics::MeterProvider::builder() .with_reader(exporter) .build(); global::set_meter_provider(provider);}
fn main() { init_meter(); let meter = global::meter("my_app"); let counter = meter.u64_counter("requests").init();
counter.add(1, &[KeyValue::new("method", "GET")]);}Vorteile: Standardisierung, Möglichkeit zum Wechsel zwischen Backends (Prometheus, Datadog, InfluxDB).
2. Verteiltes Tracing
Tracing hilft, den Weg einer Anfrage durch mehrere Microservices zu verfolgen. Für Rust ist tracing die beste Wahl.
2.1. Die Crate tracing und tracing-opentelemetry
Die Bibliothek tracing bietet strukturiertes Logging und Tracing. Sie integriert sich über tracing-opentelemetry in OpenTelemetry.
use tracing::{info, span, Level};use tracing_subscriber::fmt;use opentelemetry::global;use opentelemetry_otlp::WithExportConfig;
fn init_tracer() { let tracer = opentelemetry_otlp::new_pipeline() .tracing() .with_exporter(opentelemetry_otlp::new_exporter().tonic().with_endpoint("http://localhost:4317")) .install_simple() .expect("Fehler beim Installieren des OTLP-Tracers"); let telemetry = tracing_opentelemetry::layer().with_tracer(tracer); let subscriber = fmt::Subscriber::