¿Qué es tracing y para qué sirve?
tracing es un potente framework para instrumentar y monitorear aplicaciones en Rust. A diferencia del registro simple, tracing proporciona datos estructurados sobre la ejecución del programa, permitiendo rastrear no solo mensajes, sino también contexto, spans y eventos. Esto es especialmente útil para el diagnóstico de rendimiento, sistemas distribuidos y microservicios.
Características principales
- Spans: seguimiento de intervalos de tiempo de ejecución de operaciones (por ejemplo, procesamiento de una solicitud HTTP).
- Eventos: registros puntuales con contexto (nivel, campo, tiempo).
- Datos estructurados: soporte para campos (clave-valor) para procesamiento automatizado.
- Asincronía: compatibilidad total con tokio y async/await.
- Filtrado: gestión dinámica de niveles de registro (trace, debug, info, warn, error).
Instalación
Agregue a Cargo.toml:
[dependencies]tracing = "0.1"tracing-subscriber = "0.3"Ejemplo de código en Rust
use tracing::{info, span, Level};use tracing_subscriber::FmtSubscriber;
fn main() { // Inicialización del suscriptor (salida a stdout) let subscriber = FmtSubscriber::builder() .with_max_level(Level::TRACE) .finish(); tracing::subscriber::set_global_default(subscriber) .expect("No se pudo establecer el suscriptor global");
// Creación de un span para la operación let span = span!(Level::INFO, "main_operation", user_id = 42); let _guard = span.enter();
// Registro de un evento info!("Inicio del procesamiento de la solicitud");
// Span anidado let inner_span = span!(Level::DEBUG, "sub_task", task_id = "calc"); let _inner_guard = inner_span.enter(); tracing::event!(Level::TRACE, "Ejecución de subtarea"); drop(_inner_guard);
info!("Solicitud completada");}Salida en terminal (con marcas de tiempo y contexto):
2025-03-22T10:00:00.123Z INFO main_operation{user_id=42}: Inicio del procesamiento de la solicitud2025-03-22T10:00:00.124Z TRACE main_operation{user_id=42}:sub_task{task_id="calc"}: Ejecución de subtarea2025-03-22T10:00:00.125Z INFO main_operation{user_id=42}: Solicitud completada¿Cuándo usar tracing?
- Microservicios: seguimiento de cadenas de solicitudes a través de spans distribuidos (por ejemplo, con opentelemetry).
- Sistemas de alta carga: reemplazo del registro estándar para reducir la sobrecarga.
- Depuración de código asíncrono: los spans se vinculan automáticamente a las tareas de tokio.
- Monitoreo en producción: integración con Grafana, Jaeger, Datadog mediante exportación de trazas.
La librería tracing es el estándar de facto para monitoreo en el ecosistema de Rust. Se utiliza en proyectos como tokio, hyper, actix-web y axum.
También en la biblioteca
Migraciones de bases de datos en TypeScript: guía completa de herramientas y enfoques
Migraciones de bases de datos en Node.js: Sequelize, Knex y TypeORM
Procesamiento de Markdown en C# (.NET): bibliotecas y herramientas