Мониторинг Rust приложений: метрики и алерты для продакшна

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

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

Начать курс

Мониторинг Rust приложений: метрики и алерты

Rust — это язык системного программирования, который обеспечивает высокую производительность и безопасность памяти. Однако даже самое надежное приложение требует постоянного наблюдения в продакшне. Мониторинг позволяет вовремя обнаружить утечки памяти, рост задержек, падение производительности или нештатные ситуации. В этой статье мы разберем, как организовать полноценный мониторинг Rust-приложений с помощью метрик и алертов.

Зачем нужен мониторинг Rust-приложений?

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

  • Пропустить момент, когда приложение начинает потреблять слишком много памяти
  • Не заметить рост времени ответа (latency)
  • Потерять данные из-за незапланированных перезапусков
  • Не узнать о падении производительности до жалоб пользователей

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

Основные метрики для Rust-приложений

Для эффективного мониторинга нужно собирать несколько типов метрик. Рассмотрим ключевые категории.

Системные метрики

Эти метрики показывают, как приложение использует ресурсы сервера:

  • CPU usage — загрузка процессора
  • Memory usage — объем используемой памяти (RSS, heap)
  • File descriptors — количество открытых файловых дескрипторов
  • Thread count — количество активных потоков

Бизнес-метрики

Они отражают работу приложения с точки зрения пользователя:

  • Request rate — количество запросов в секунду
  • Latency — время обработки запроса (p50, p95, p99)
  • Error rate — процент ошибок (4xx, 5xx)
  • Active connections — количество активных соединений

Метрики Rust-specific

Для Rust-приложений полезно отслеживать:

  • Panics — количество паник в приложении
  • Garbage collection — в Rust нет GC, но можно отслеживать аллокации
  • Task pool size — размер пула асинхронных задач (Tokio)

Инструменты для мониторинга Rust

Самый популярный стек для мониторинга Rust-приложений — это Prometheus (сбор метрик) + Grafana (визуализация) + Alertmanager (алерты). Рассмотрим интеграцию на примере.

Библиотеки для Rust

  • prometheus — официальный клиент Prometheus для Rust
  • metrics — фреймворк для сбора метрик с поддержкой различных экспортеров
  • opentelemetry — OpenTelemetry для Rust (поддерживает метрики, трейсинг, логи)
  • actix-web-prom — интеграция Prometheus с Actix-web

Пример: сбор метрик с помощью Prometheus и Actix-web

Рассмотрим простой пример веб-сервера на Actix-web, который собирает метрики и отдает их в формате Prometheus.

use actix_web::{web, App, HttpServer, HttpResponse, middleware};
use prometheus::{Encoder, TextEncoder, Counter, Registry, opts};
use std::sync::Arc;

pub struct Metrics {
    pub registry: Registry,
    pub request_counter: Counter,
}

impl Metrics {
    pub fn new() -> Self {
        let registry = Registry::new();
        let counter_opts = opts!("http_requests_total", "Total number of HTTP requests");
        let request_counter = Counter::with_opts(counter_opts).unwrap();
        registry.register(Box::new(request_counter.clone())).unwrap();
        Metrics { registry, request_counter }
    }
}

async fn metrics_handler(data: web::Data<Arc<Metrics>>) -> HttpResponse {
    let encoder = TextEncoder::new();
    let metric_families = data.registry.gather();
    let mut buffer = vec![];
    encoder.encode(&metric_families, &mut buffer).unwrap();
    HttpResponse::Ok()
        .content_type("text/plain; charset=utf-8")
        .body(buffer)
}

async fn index(data: web::Data<Arc<Metrics>>) -> HttpResponse {
    data.request_counter.inc();
    HttpResponse::Ok().body("Hello, monitoring!")
}

#[actix_web::main]
async fn main() -> std::io::Result<()> {
    let metrics = Arc::new(Metrics::new());

    HttpServer::new(move || {
        App::new()
            .app_data(web::Data::new(metrics.clone()))
            .route("/metrics", web::get().to(metrics_handler))
            .route("/", web::get().to(index))
    })
    .bind("127.0.0.1:8080")?
    .run()
    .await
}

Этот код создает HTTP-сервер, который:

  • Считает количество запросов к корневому пути
  • Отдает метрики по адресу /metrics в формате Prometheus
  • Использует кастомный реестр метрик

После запуска вы можете проверить метрики:

curl http://localhost:8080/metrics
# HELP http_requests_total Total number of HTTP requests
# TYPE http_requests_total counter
http_requests_total 5

Настройка алертов

Сбор метрик — это только половина дела. Второй важный компонент — алерты. Они уведомляют вас, когда метрики выходят за допустимые границы.

Пример правил Alertmanager

Создайте файл alerts.yml:

groups:
  - name: rust_app_alerts
    rules:
      - alert: HighErrorRate
        expr: rate(http_requests_total{status=~"5.."}[5m]) / rate(http_requests_total[5m]) > 0.05
        for: 2m
        labels:
          severity: critical
        annotations:
          summary: "High error rate in Rust app"
          description: "Error rate is {{ $value | humanizePercentage }} for the last 5 minutes"

      - alert: HighMemoryUsage
        expr: process_resident                

Блоги

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