Мониторинг 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 для Rustmetrics— фреймворк для сбора метрик с поддержкой различных экспортеров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