Surveillance des applications Rust avec la bibliothèque tracing

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

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ée

Quand 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.

Recommendations