Qu'est-ce que tracing et pourquoi en a-t-on besoin ?
tracing est un framework puissant pour l'instrumentation et la surveillance d'applications en Rust. Contrairement à la journalisation simple, tracing fournit des données structurées sur l'exécution du programme, permettant de suivre non seulement les messages, mais aussi le contexte, les spans et les événements. C'est particulièrement utile pour le diagnostic des performances, les systèmes distribués et les microservices.
Fonctionnalités principales
- Spans : suivi des intervalles de temps d'exécution des opérations (par exemple, le traitement d'une requête HTTP).
- Événements (events) : logs ponctuels avec contexte (niveau, champ, temps).
- Données structurées : prise en charge des champs (key-value) pour le traitement machine.
- Asynchronisme : compatibilité totale avec tokio et async/await.
- Filtrage : gestion dynamique des niveaux de journalisation (trace, debug, info, warn, error).
Installation
Ajoutez dans Cargo.toml :
[dependencies]tracing = "0.1"tracing-subscriber = "0.3"Exemple de code en Rust
use tracing::{info, span, Level};use tracing_subscriber::FmtSubscriber;
fn main() { // Initialisation du subscriber (sortie vers stdout) let subscriber = FmtSubscriber::builder() .with_max_level(Level::TRACE) .finish(); tracing::subscriber::set_global_default(subscriber) .expect("Impossible de définir le subscriber global");
// Création d'un span pour l'opération let span = span!(Level::INFO, "main_operation", user_id = 42); let _guard = span.enter();
// Journalisation d'un événement info!("Début du traitement de la requête");
// Span imbriqué let inner_span = span!(Level::DEBUG, "sub_task", task_id = "calc"); let _inner_guard = inner_span.enter(); tracing::event!(Level::TRACE, "Exécution de la sous-tâche"); drop(_inner_guard);
info!("Requête terminée");}Sortie dans le terminal (avec horodatages et contexte) :
2025-03-22T10:00:00.123Z INFO main_operation{user_id=42}: Début du traitement de la requête2025-03-22T10:00:00.124Z TRACE main_operation{user_id=42}:sub_task{task_id="calc"}: Exécution de la sous-tâche2025-03-22T10:00:00.125Z INFO main_operation{user_id=42}: Requête terminéeQuand utiliser tracing ?
- Microservices : suivi des chaînes de requêtes via des spans distribués (par exemple, avec opentelemetry).
- Systèmes à forte charge : remplacement de la journalisation standard pour réduire les frais généraux.
- Débogage de code asynchrone : les spans sont automatiquement liés aux tâches tokio.
- Surveillance en production : intégration avec Grafana, Jaeger, Datadog via l'export de traces.
La bibliothèque tracing est le standard de facto pour la surveillance dans l'écosystème Rust. Elle est utilisée dans des projets tels que tokio, hyper, actix-web et axum.
Aussi dans la bibliothèque
Parsing HTML en Swift (iOS/macOS) : bibliothèques SwiftSoup et Fuzi
Génération de rapports PDF en PHP : aperçu des bibliothèques et exemples de code
GraphQL en Swift : Guide complet de la bibliothèque Apollo iOS
vcpkg C++ : guide complet avec exemples concrets
Configuration des applications Kotlin : bibliothèques et approches