Добавить в корзинуПозвонить
Найти в Дзене
Один Rust не п...Rust

Мониторинг на Rust

Для реализации полноценного мониторинга необходимо следующее: Сбор числовых данных (CPU, память, запросы и т.д.). Библиотеки: prometheus + prometheus-exporter use prometheus::{IntCounter, Registry};
use prometheus_exporter::PrometheusExporter;
let exporter = PrometheusExporter::new();
let counter = IntCounter::new("requests", "Total requests").unwrap();
let registry = Registry::new();
registry.register(Box::new(counter.clone())).unwrap();
counter.inc(); // Инкремент метрики
Доступ к метрикам: http://localhost:9000/metrics. metrics
Унифицированный API с поддержкой бэкендов (Prometheus, StatsD, etc.). use metrics::counter;
counter!("requests", 1, "route" => "/index");
Библиотеки: tracing + tracing-subscriber
Структурированные логи с контекстом: use tracing::{info, Level};
use tracing_subscriber::FmtSubscriber;
let subscriber = FmtSubscriber::builder().with_max_level(Level::INFO).finish();
tracing::subscriber::set_global_default(subscriber).unwrap();
info!(action = "startup", "Applicati
Оглавление
GitHub - nicktretyakov/monitoring
ML на RUST без заморочек
Один Rust не п...Rust

Для реализации полноценного мониторинга необходимо следующее:

1. Метрики (Metrics)

Сбор числовых данных (CPU, память, запросы и т.д.).

Библиотеки:

prometheus + prometheus-exporter

use prometheus::{IntCounter, Registry};
use prometheus_exporter::PrometheusExporter;
let exporter = PrometheusExporter::new();
let counter = IntCounter::new("requests", "Total requests").unwrap();
let registry = Registry::new();
registry.register(Box::new(counter.clone())).unwrap();
counter.inc(); // Инкремент метрики

Доступ к метрикам: http://localhost:9000/metrics.

metrics
Унифицированный API с поддержкой бэкендов (Prometheus, StatsD, etc.).

use metrics::counter;
counter!("requests", 1, "route" => "/index");

2. Логирование (Logging)

Библиотеки:

tracing + tracing-subscriber
Структурированные логи с контекстом:

use tracing::{info, Level};
use tracing_subscriber::FmtSubscriber;
let subscriber = FmtSubscriber::builder().with_max_level(Level::INFO).finish();
tracing::subscriber::set_global_default(subscriber).unwrap();
info!(action = "startup", "Application started");

log + env_logger
Стандартный подход:

env_logger::init();
log::info!("User logged in: {}", user_id);

3. Трассировка (Tracing / Distributed Tracing)

Инструментирование запросов между сервисами.

Библиотеки:

opentelemetry + tracing-opentelemetry
Интеграция с Jaeger/Zipkin:

use opentelemetry::global;
use tracing_subscriber::prelude::*;
let tracer = opentelemetry_jaeger::new_pipeline()
.with_service_name("my_app")
.install_batch()?;
tracing_subscriber::registry()
.with(tracing_opentelemetry::layer().with_tracer(tracer))
.init();
// Автоматическая передача контекста
tracing::info_span!("request", user_id = 123).in_scope(|| {
// Код обработки
});

4. Интеграция с системами мониторинга

Prometheus/Grafana
Экспорт метрик через /metrics → дашборды в Grafana.

Jaeger
Визуализация трассировок.

Elasticsearch/Loki
Агрегация логов.

5. Health Checks

Простые эндпоинты для проверки состояния:

use actix_web::{get, App, HttpResponse, HttpServer, Responder};
#[get("/health")]
async fn health() -> impl Responder {
HttpResponse::Ok().body("OK")
}

6. Профилирование (Profiling)

pprof-rs
Интеграция с pprof для CPU/memory profiling:

use pprof::protobuf::Message;
let guard = pprof::ProfilerGuard::new(100).unwrap();
let report = guard.report().build().unwrap();
let profile = report.pprof().unwrap();