Rust中的Prometheus指标:prometheus和metrics库

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Rust中的Prometheus指标:性能与容错监控



在现代Rust后端应用开发中,监控已成为生产基础设施不可或缺的一部分。Prometheus是收集和存储指标的事实标准,它与Rust的集成使您能够跟踪性能、CPU负载、请求数量、错误等。在本文中,我们将介绍两个主要库:prometheus(官方客户端)和metrics + metrics-exporter-prometheus(更抽象的方法)。



为什么在Rust中需要指标?

指标可以:

  • 实时跟踪服务状态
  • 发现瓶颈(延迟、错误)
  • 在Grafana中构建仪表板
  • 配置告警(例如,当QPS下降或错误增加时)


安装和配置prometheus库

在Cargo.toml中添加:

[dependencies]prometheus = { version = "0.13", features = ["process"] }actix-web = "4"  # 用于Web服务器示例tokio = { version = "1", features = ["full"] }


prometheus库提供了三种主要的指标类型:Counter、Gauge、Histogram。



示例:创建和注册指标

use prometheus::{Counter, Gauge, Histogram, HistogramOpts, Opts, Registry};

fn main() { // 创建指标注册表 let registry = Registry::new();

// Counter — 请求计数器 let request_counter = Counter::with_opts( Opts::new("http_requests_total", "Total HTTP requests") .const_label("service", "my_app") ).unwrap(); registry.register(Box::new(request_counter.clone())).unwrap();

// Gauge — 当前活跃连接数 let active_connections = Gauge::with_opts( Opts::new("active_connections", "Number of active connections") ).unwrap(); registry.register(Box::new(active_connections.clone())).unwrap();

// Histogram — 响应时间分布 let request_duration = Histogram::with_opts( HistogramOpts::new("http_request_duration_seconds", "Request duration in seconds") .buckets(vec![0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1.0, 2.5, 5.0, 10.0]) ).unwrap(); registry.register(Box::new(request_duration.clone())).unwrap();

// 模拟使用 request_counter.inc(); active_connections.set(42.0); request_duration.observe(0.123);}


通过HTTP导出指标(actix-web)

为了让Prometheus能够收集指标,需要以/metrics格式提供它们:

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

async fn metrics_handler(registry: web::Data<Arc<Registry>>) -> impl Responder { let encoder = TextEncoder::new(); let mut buffer = Vec::new(); encoder.encode(®istry.gather(), &mut buffer).unwrap(); HttpResponse::Ok() .content_type("text/plain; charset=utf-8") .body(buffer)}

#[actix_web::main]async fn main() -> std::io::Result<()> { let registry = Arc::new(Registry::new()); // ... 像上面一样注册指标 ...

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


metrics库——高级方法

另一种选择是使用metricscrate配合metrics-exporter-prometheus导出器。它提供了用于快速创建指标的宏:

[dependencies]metrics = "0.21"metrics-exporter-prometheus = "0.                    

推荐