Surveillance des applications Rust : Aperçu des outils et bibliothèques clés
Rust est un langage de programmation système de plus en plus utilisé pour créer des services à forte charge et critiques. Cependant, même le code le plus fiable peut rencontrer des problèmes en environnement de production. Une surveillance efficace permet de détecter les problèmes à temps, d'en comprendre la cause et d'assurer le fonctionnement stable de l'application. Dans cet article, nous examinerons les principales bibliothèques et outils pour la surveillance des applications Rust : de la collecte de métriques au traçage distribué.
1. Collecte et exportation de métriques
Les métriques sont des indicateurs numériques de l'état de l'application (nombre de requêtes, temps de réponse, utilisation de la mémoire, etc.). Pour les collecter en Rust, deux bibliothèques principales sont utilisées.
1.1. metrics et metrics-exporter-prometheus
L'écosystème metrics offre un moyen léger et flexible d'enregistrer des métriques. Il prend en charge les compteurs, les histogrammes, les jauges et d'autres types. Pour l'exportation vers Prometheus, la crate metrics-exporter-prometheus est utilisée.
use metrics::{counter, histogram};use metrics_exporter_prometheus::PrometheusBuilder;use std::net::SocketAddr;
#[tokio::main]async fn main() -> Result<(), Box<dyn std::error::Error>> { // Configuration du point de terminaison HTTP pour Prometheus let addr: SocketAddr = "0.0.0.0:9000".parse()?; let builder = PrometheusBuilder::new().with_http_listener(addr); builder.install()?;
// Enregistrement des métriques counter!("http_requests_total", 1); histogram!("request_duration_seconds", 0.045);
// Écriture des métriques en arrière-plan loop { counter!("http_requests_total", 1); histogram!("request_duration_seconds", 0.023); tokio::time::sleep(tokio::time::Duration::from_secs(5)).await; }}Avantages : haute performance, consommation mémoire minimale, prise en charge des exportateurs personnalisés.
1.2. opentelemetry (métriques)
OpenTelemetry est un standard universel pour la collecte de télémétrie. La crate opentelemetry prend en charge les métriques, les traces et les journaux. Pour l'exportation vers Prometheus, opentelemetry-prometheus est utilisé.
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")]);}Avantages : standardisation, possibilité de basculer entre les backends (Prometheus, Datadog, InfluxDB).
2. Traçage distribué
Le traçage aide à suivre le chemin d'une requête à travers plusieurs microservices. Pour Rust, le meilleur choix est tracing.
2.1. Crate tracing et tracing-opentelemetry
La bibliothèque tracing fournit une journalisation structurée et un traçage. Elle s'intègre avec OpenTelemetry via tracing-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("Échec de l'installation du traceur OTLP"); let telemetry = tracing_opentelemetry::layer().with_tracer(tracer); let subscriber = fmt::Subscriber:: Aussi dans la bibliothèque
Swift Package Manager pour Swift : guide complet avec exemples
Travail avec les dates en Rust : aperçu des bibliothèques de temps et de dates
Bibliothèque standard C# (.NET) : aperçu complet
Envoi d'email en JavaScript (Node.js) : Nodemailer, SendGrid, Mailgun