Surveillance des applications Rust : aperçu complet des bibliothèques et outils
Rust est un langage de programmation système de plus en plus utilisé pour créer des services web à forte charge, des démons réseau et des composants d'infrastructure. Cependant, même le code le plus rapide nécessite une observation. Dans cet article, nous allons passer en revue les bibliothèques clés pour la surveillance des applications Rust : tracing, metrics et l'intégration avec OpenTelemetry. Vous apprendrez à collecter des logs, des métriques et des traces pour garder votre application sous contrôle.
1. Pourquoi la surveillance est-elle nécessaire en Rust ?
Sans surveillance, vous ne connaîtrez les problèmes que lorsque les utilisateurs commenceront à se plaindre. Les applications Rust fonctionnent généralement en production 24h/24 et 7j/7, il est donc important de suivre :
- la consommation de mémoire et de CPU ;
- le temps de réponse aux requêtes ;
- le nombre d'erreurs et de paniques ;
- l'état des connexions aux bases de données et aux API externes.
Bonne nouvelle : l'écosystème Rust propose des solutions matures pour l'observabilité.
2. Bibliothèque tracing — journalisation structurée et traçage
tracing est un framework pour instrumenter les programmes en Rust. Il permet de créer des spans (span) — des unités de travail qui peuvent être imbriquées les unes dans les autres, et des événements (event) — des points d'information.
Installation
[dependencies]tracing = "0.1"tracing-subscriber = "0.3"Exemple : traçage de base d'une requête HTTP
use tracing::{info, span, Level};use tracing_subscriber;
fn handle_request(user_id: u64) { let span = span!(Level::INFO, "handle_request", user_id); let _guard = span.enter(); info!("Traitement de la requête commencé"); // ... logique de traitement ... info!("Requête terminée");}
fn main() { tracing_subscriber::fmt::init(); handle_request(42);}La sortie console contiendra des champs structurés, faciles à analyser avec grep ou à envoyer vers Jaeger.
3. Bibliothèque metrics — collecte de métriques numériques
metrics est une bibliothèque légère pour collecter des compteurs, des histogrammes et des jauges (gauges). Elle est idéale pour la surveillance en temps réel.
Installation
[dependencies]metrics = "0.22"metrics-exporter-prometheus = "0.14"Exemple : compteur de requêtes et histogramme de temps
use metrics::{counter, histogram};use std::time::Instant;
fn process_request() { let start = Instant::now(); counter!("requests_total", 1); // ... émulation de travail ... std::thread::sleep(std::time::Duration::from_millis(50)); let duration = start.elapsed().as_secs_f64(); histogram!("request_duration_seconds", duration);}Pour rendre les métriques accessibles via HTTP (pour Prometheus), ajoutez un exportateur :
use metrics_exporter_prometheus::PrometheusBuilder;
fn setup_metrics() { let builder = PrometheusBuilder::new(); builder.install().expect("Échec de l'installation de l'exportateur"); // Les métriques seront disponibles sur http://localhost:9000/metrics}4. OpenTelemetry — standard universel d'observabilité
OpenTelemetry (OTel) est un framework neutre vis-à-vis des fournisseurs pour collecter des traces, des métriques et des logs. Pour Rust, il existe la crate opentelemetry avec le support d'OTLP (OpenTelemetry Protocol).
Installation
[dependencies]opentelemetry = { version = "0.22", features = ["rt-tokio"] }opentelemetry-otlp = "0.15"tracing-opentelemetry = "0.23"Exemple : intégration de tracing avec OpenTelemetry
use opentelemetry::global;use tracing_subscriber::layer::SubscriberExt;use tracing_subscriber::Registry;
fn init_otel() { let tracer = opentelemetry_otlp::new_pipeline() .install_simple()