Was ist Tracing und warum wird es benötigt?
Tracing ist ein leistungsstarkes Framework zur Instrumentierung und Überwachung von Anwendungen in Rust. Im Gegensatz zu einfachem Logging liefert Tracing strukturierte Daten über die Programmausführung und ermöglicht es, nicht nur Nachrichten, sondern auch Kontext, Spans und Events zu verfolgen. Dies ist besonders nützlich für die Leistungsdiagnose, verteilte Systeme und Microservices.
Hauptfunktionen
- Spans: Verfolgung von Zeitintervallen für die Ausführung von Operationen (z. B. Verarbeitung einer HTTP-Anfrage).
- Events: Punktuelle Logs mit Kontext (Level, Feld, Zeit).
- Strukturierte Daten: Unterstützung von Feldern (Key-Value) für die maschinelle Verarbeitung.
- Asynchronität: Vollständige Kompatibilität mit tokio und async/await.
- Filterung: Dynamische Steuerung der Log-Level (trace, debug, info, warn, error).
Installation
Fügen Sie in Cargo.toml hinzu:
[dependencies]tracing = "0.1"tracing-subscriber = "0.3"Rust-Codebeispiel
use tracing::{info, span, Level};use tracing_subscriber::FmtSubscriber;
fn main() { // Initialisierung des Subscribers (Ausgabe in stdout) let subscriber = FmtSubscriber::builder() .with_max_level(Level::TRACE) .finish(); tracing::subscriber::set_global_default(subscriber) .expect("Fehler beim Setzen des globalen Subscribers");
// Erstellen eines Spans für eine Operation let span = span!(Level::INFO, "main_operation", user_id = 42); let _guard = span.enter();
// Loggen eines Events info!("Start der Anfrageverarbeitung");
// Verschachtelter Span let inner_span = span!(Level::DEBUG, "sub_task", task_id = "calc"); let _inner_guard = inner_span.enter(); tracing::event!(Level::TRACE, "Ausführung der Teilaufgabe"); drop(_inner_guard);
info!("Anfrage abgeschlossen");}Terminalausgabe (mit Zeitstempeln und Kontext):
2025-03-22T10:00:00.123Z INFO main_operation{user_id=42}: Start der Anfrageverarbeitung2025-03-22T10:00:00.124Z TRACE main_operation{user_id=42}:sub_task{task_id="calc"}: Ausführung der Teilaufgabe2025-03-22T10:00:00.125Z INFO main_operation{user_id=42}: Anfrage abgeschlossenWann sollte man Tracing verwenden?
- Microservices: Verfolgung von Anfrageketten durch verteilte Spans (z. B. mit opentelemetry).
- Hochlastsysteme: Ersatz für Standard-Logging zur Reduzierung des Overheads.
- Debugging von asynchronem Code: Spans werden automatisch an tokio-Aufgaben gebunden.
- Monitoring in der Produktion: Integration mit Grafana, Jaeger, Datadog durch Export von Traces.
Die Bibliothek Tracing ist der De-facto-Standard für Monitoring im Rust-Ökosystem. Sie wird in Projekten wie tokio, hyper, actix-web und axum verwendet.
```Auch in der Bibliothek
GraphQL in C++: Die Bibliothek cppgraphqlgen für moderne APIs
Caching in Java: Redis, Caffeine, Ehcache – ein vollständiger Leitfaden
Tonic für Rust: Vollständiges Tutorial mit Beispielen
ORM für Kotlin: Vergleich und Beispiele (Exposed, Ktorm, Hibernate)