O que é tracing e para que serve?
tracing é um poderoso framework para instrumentação e monitoramento de aplicações em Rust. Diferente da simples criação de logs, o tracing fornece dados estruturados sobre a execução do programa, permitindo rastrear não apenas mensagens, mas também contexto, spans e eventos. Isso é especialmente útil para diagnóstico de desempenho, sistemas distribuídos e microsserviços.
Principais funcionalidades
- Spans: rastreamento de intervalos de tempo de execução de operações (por exemplo, processamento de uma requisição HTTP).
- Eventos: logs pontuais com contexto (nível, campo, tempo).
- Dados estruturados: suporte a campos (chave-valor) para processamento por máquina.
- Assincronicidade: compatibilidade total com tokio e async/await.
- Filtragem: gerenciamento dinâmico de níveis de log (trace, debug, info, warn, error).
Instalação
Adicione ao Cargo.toml:
[dependencies]tracing = "0.1"tracing-subscriber = "0.3"Exemplo de código em Rust
use tracing::{info, span, Level};use tracing_subscriber::FmtSubscriber;
fn main() { // Inicialização do subscriber (saída para stdout) let subscriber = FmtSubscriber::builder() .with_max_level(Level::TRACE) .finish(); tracing::subscriber::set_global_default(subscriber) .expect("Não foi possível definir o subscriber global");
// Criação de um span para a operação let span = span!(Level::INFO, "main_operation", user_id = 42); let _guard = span.enter();
// Log de um evento info!("Início do processamento da requisição");
// Span aninhado let inner_span = span!(Level::DEBUG, "sub_task", task_id = "calc"); let _inner_guard = inner_span.enter(); tracing::event!(Level::TRACE, "Execução da subtarefa"); drop(_inner_guard);
info!("Requisição concluída");}Saída no terminal (com carimbos de data/hora e contexto):
2025-03-22T10:00:00.123Z INFO main_operation{user_id=42}: Início do processamento da requisição2025-03-22T10:00:00.124Z TRACE main_operation{user_id=42}:sub_task{task_id="calc"}: Execução da subtarefa2025-03-22T10:00:00.125Z INFO main_operation{user_id=42}: Requisição concluídaQuando usar tracing?
- Microsserviços: rastreamento de cadeias de requisições através de spans distribuídos (por exemplo, com opentelemetry).
- Sistemas de alta carga: substituição do log padrão para reduzir a sobrecarga.
- Depuração de código assíncrono: spans são automaticamente vinculados às tarefas do tokio.
- Monitoramento em produção: integração com Grafana, Jaeger, Datadog através da exportação de traces.
A biblioteca tracing é o padrão de facto para monitoramento no ecossistema Rust. Ela é usada em projetos como tokio, hyper, actix-web e axum.