Волга
Главная
API Docs
GitHub
  • English
  • Русский
Главная
API Docs
GitHub
  • English
  • Русский
  • Главная
  • Основы

    • Быстрый старт
    • Параметры маршрута
    • Параметры запроса
    • Группировка маршрутов
    • Заголовки (Headers)
  • Форматы данных

    • Работа с JSON
    • Работа с Form Data
    • Работа с файлами
    • Server-Sent Events (SSE)
  • Протоколы

    • HTTP/1 and HTTP/2
    • HTTPS
    • WebSockets & WebTransport
  • Продвинутые сценарии

    • Пользовательские Middleware
    • Сжатие ответов
    • Распаковка запросов
    • Центральный обработчик ошибок
    • Внедрение Зависимостей
    • Логгирование и Трассировка
    • Статические файлы
    • CORS (Cross-Origin Resource Sharing)
    • Cookies
    • Отмена запросов
    • Пользовательская обработка методов HEAD, OPTIONS и TRACE

Логгирование и Трассировка

Функции трассировки и логгирования в Волге основаны на фреймворке tracing и поддерживают его для сбора структурированной диагностической информации на основе событий из коробки. В дополнение к этому, вы можете настроить включение span/request/correction id в заголовки ответов, чтобы улучшить метрику observability вашего приложения.

Если вы не используете набор функций full, убедитесь, что вы включили функцию tracing в Cargo.toml, кроме того, вам необходимо установить библиотеки tracing и tracing-subscriber:

[dependencies]
volga = { version = "0.4.9", features = ["tracing"] }
tracing = "0.1"
tracing-subscriber = "0.3"

Базовая конфигурация

use volga::{App, tracing::TracingConfig};
use tracing::trace;
use tracing_subscriber::prelude::*;

#[tokio::main]
async fn main() -> std::io::Result<()> {
    // Настраиваем вывод логов в stdout
    tracing_subscriber::registry()
        .with(tracing_subscriber::fmt::layer())
        .init();
    
    let mut app = App::new();

    app.map_get("/tracing", || async {
        trace!("handling the request!");
        "Done!"
    });

    app.run().await
}

Приведенный выше код подразумевает базовую конфигурацию трассировки с выводом на stdout. После запуска этого кода в терминале вы должны увидеть следующее:

2025-01-23T13:09:30.616257Z  INFO volga::app: listening on: http://127.0.0.1:7878

Затем, если вы несколько раз вызовете конечную точку GET http://127.0.0.1:7878/tracing, и потом выключите сервер, вы должны увидеть в своем терминале что-то вроде этого:

2025-01-23T13:09:30.616257Z  INFO volga::app: listening on: http://127.0.0.1:7878
2025-01-23T13:09:37.633319Z TRACE request: tracing: handling the request!
2025-01-23T13:09:38.405932Z TRACE request: tracing: handling the request!
2025-01-23T13:09:39.084540Z TRACE request: tracing: handling the request!
2025-01-23T13:09:49.117861Z TRACE volga::app: shutdown signal received, not accepting new requests
2025-01-23T13:09:49.119618Z  INFO volga::app: shutting down the server...

Подключение трассировочного middleware

Однако в приведенном выше примере, если вы проверите заголовки ответа, вы не найдете ничего, связанного со span id. Чтобы исправить это, вы можете использовать метод use_tracing(), который включает middleware, добавляющее этот заголовок.

use volga::{App, tracing::TracingConfig};
use tracing::trace;
use tracing_subscriber::prelude::*;

#[tokio::main]
async fn main() -> std::io::Result<()> {v
    // Настраиваем вывод логов в stdout
    tracing_subscriber::registry()
        .with(tracing_subscriber::fmt::layer())
        .init();

    // Настраиваем параметры трассировки
    let tracing = TracingConfig::new()
        .with_header();
    
    let mut app = App::new()
        .set_tracing(tracing);

    // Подключаем трассировочное middleware
    app.use_tracing();

    app.map_get("/tracing", || async {
        trace!("handling the request!");
        "Done!"
    });

    app.run().await
}

По умолчанию middleware добавляет заголовок HTTP-ответа request-id, но если вы хотите использовать свой собственный заголовок, вы можете настроить его с помощью метода with_header_name() для TracingConfig:

let tracing = TracingConfig::new()
    .with_header()
    .with_header_name("x-correlation-id");

Затем, вы можете протестировать данный код, при помощи curl:

> curl -v --location "http://127.0.0.1:7878/tracing"
*   Trying 127.0.0.1:7878...
* Connected to 127.0.0.1 (127.0.0.1) port 7878
> GET /tracing HTTP/1.1
> Host: 127.0.0.1:7878
> User-Agent: curl/8.9.1
> Accept: */*
>
* Request completely sent off
< HTTP/1.1 200 OK
< server: Volga
< content-type: text/plain
< x-correlation-id: 2252074691592193
< content-length: 5
< date: Fri, 10 Jan 2025 14:14:37 GMT
<
Done!

Полный пример можно найти здесь

Last Updated:
Prev
Внедрение Зависимостей
Next
Статические файлы