Monitoramento de aplicações Rust: Visão geral de ferramentas e bibliotecas

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

Monitoramento de aplicações Rust: Visão geral das principais ferramentas e bibliotecas



Rust é uma linguagem de programação de sistemas que está sendo cada vez mais usada para criar serviços de alta carga e criticamente importantes. No entanto, mesmo o código mais confiável pode falhar em ambiente de produção. O monitoramento eficaz permite detectar problemas a tempo, entender sua causa e garantir a operação estável da aplicação. Neste artigo, veremos as principais bibliotecas e ferramentas para monitoramento de aplicações em Rust: desde a coleta de métricas até o tracing distribuído.



1. Coleta e exportação de métricas



Métricas são indicadores numéricos do estado da aplicação (número de requisições, tempo de resposta, uso de memória, etc.). Para coletá-las em Rust, são usadas duas bibliotecas principais.



1.1. metrics e metrics-exporter-prometheus



O ecossistema metrics fornece uma maneira leve e flexível de registrar métricas. Ele suporta contadores, histogramas, medidores e outros tipos. Para exportação para o Prometheus, é usado o crate metrics-exporter-prometheus.



use metrics::{counter, histogram};use metrics_exporter_prometheus::PrometheusBuilder;use std::net::SocketAddr;

#[tokio::main]async fn main() -> Result<(), Box<dyn std::error::Error>> { // Configuração do endpoint HTTP para o Prometheus let addr: SocketAddr = "0.0.0.0:9000".parse()?; let builder = PrometheusBuilder::new().with_http_listener(addr); builder.install()?;

// Registro de métricas counter!("http_requests_total", 1); histogram!("request_duration_seconds", 0.045);

// Gravação de métricas em segundo plano loop { counter!("http_requests_total", 1); histogram!("request_duration_seconds", 0.023); tokio::time::sleep(tokio::time::Duration::from_secs(5)).await; }}


Vantagens: alta performance, consumo mínimo de memória, suporte a exportadores personalizados.



1.2. opentelemetry (métricas)



OpenTelemetry é um padrão universal para coleta de telemetria. O crate opentelemetry suporta métricas, traces e logs. Para exportação para o Prometheus, é usado opentelemetry-prometheus.



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")]);}


Vantagens: padronização, possibilidade de alternar entre backends (Prometheus, Datadog, InfluxDB).



2. Tracing distribuído



Tracing ajuda a rastrear o caminho de uma requisição através de vários microsserviços. Para Rust, a melhor escolha é tracing.



2.1. Crate tracing e tracing-opentelemetry



A biblioteca tracing fornece logging e tracing estruturados. Ela se integra com OpenTelemetry através de 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("Falha ao instalar o tracer OTLP"); let telemetry = tracing_opentelemetry::layer().with_tracer(tracer); let subscriber = fmt::Subscriber::

Recommendations