Monitoramento de aplicações Rust com a biblioteca tracing

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

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ída

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

Recommendations