Мониторинг приложений Rust: библиотека `tracing`

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Что такое tracing?

tracing — это мощный фреймворк для структурированного логирования, профилирования и мониторинга приложений на Rust. В отличие от простых логгеров (как log), tracing позволяет создавать иерархические спаны (span) и события (event) с контекстом, что идеально подходит для отслеживания запросов, транзакций и асинхронных операций.

Зачем нужен мониторинг в Rust?

Rust-приложения часто используются в высоконагруженных системах, где критична производительность и стабильность. Без мониторинга вы не сможете:

  • Отследить медленные запросы
  • Найти утечки памяти или панику
  • Понять, почему упал микросервис

tracing решает эту проблему, предоставляя инструменты для сбора метрик, трассировки и логирования в едином API.

Установка

Добавьте в Cargo.toml:

[dependencies]
tracing = "0.1"
tracing-subscriber = "0.3"
tracing-appender = "0.2"

Для продвинутого мониторинга (OpenTelemetry) используйте tracing-opentelemetry.

Основные функции

  • Спаны (spans) — временные интервалы с контекстом (например, обработка HTTP-запроса).
  • События (events) — точки во времени (например, ошибка или предупреждение).
  • Структурированные поля — передача данных в формате key=value.
  • Асинхронная поддержка — корректная работа с tokio/async-std.
  • Экспорт в OpenTelemetry — интеграция с Jaeger, Prometheus, Grafana.

Пример кода на Rust

use tracing::{info, error, span, Level};
use tracing_subscriber;

fn main() {
    // Инициализация логгера
    tracing_subscriber::fmt()
        .with_env_filter("my_app=info")
        .init();

    // Создание спана (например, для HTTP-запроса)
    let root = span!(Level::INFO, "request", method = "GET", path = "/api/users");
    let _guard = root.enter();

    // Логирование с контекстом
    info!(user_id = 42, "Обработка запроса");
    
    // Ошибка с полями
    error!(
        error_code = 500,
        message = "Внутренняя ошибка сервера",
        "Ошибка при получении данных"
    );

    // Автоматический выход из спана при падении _guard
}

Когда использовать?

  • Микросервисы на Rust — трассировка запросов между сервисами.
  • Высоконагруженные API — поиск узких мест.
  • Асинхронные приложения — корректное логирование в tokio.
  • Системы реального времени — мониторинг задержек.

tracing — стандарт де-факто для мониторинга в экосистеме Rust. Он используется в таких проектах, как Tokio, Actix-web и Warp.

Рекомендаций