Rust性能监控插件fuel-core-metrics的使用:轻量级指标收集与Prometheus集成方案

Rust性能监控插件fuel-core-metrics的使用:轻量级指标收集与Prometheus集成方案

fuel-core-metrics是一个轻量级的Rust性能监控插件,主要用于收集指标数据并与Prometheus集成。

安装

可以通过以下Cargo命令安装:

fuel-core-metrics = "0.46.0"

或运行:

cargo add fuel-core-metrics

完整示例代码

以下是一个完整的示例demo,展示如何使用fuel-core-metrics进行指标收集和Prometheus集成:

use fuel_core_metrics::{
    counter::Counter,
    histogram::Histogram,
    metrics::Metrics,
    prometheus::Prometheus,
};

fn main() {
    // 初始化指标收集器
    let metrics = Metrics::default();
    
    // 创建一个计数器
    let request_counter = metrics.counter(
        "http_requests_total",
        "Total number of HTTP requests",
        &["method", "status"],
    );
    
    // 创建一个直方图
    let response_time = metrics.histogram(
        "http_response_time_seconds",
        "Response time in seconds",
        vec![0.01, 0.05, 0.1, 0.5, 1.0, 5.0],
    );
    
    // 模拟一些请求
    for _ in 0..100 {
        // 记录请求计数
        request_counter.inc(&["GET", "200"]);
        
        // 记录响应时间
        let duration = rand::random::<f64>() * 2.0;
        response_time.observe(duration);
    }
    
    // 设置Prometheus exporter
    let prometheus = Prometheus::new(metrics);
    
    // 启动Prometheus metrics服务器
    prometheus.start("127.0.0.1:8080").unwrap();
    
    println!("Metrics server running at http://127.0.0.1:8080/metrics");
}

主要功能

  1. 轻量级指标收集

    • 支持计数器(Counter)
    • 支持直方图(Histogram)
    • 支持标签(label)分类
  2. Prometheus集成

    • 内置Prometheus exporter
    • 提供/metrics端点
    • 标准Prometheus格式输出

这个示例展示了如何创建计数器来跟踪HTTP请求数量,以及直方图来记录响应时间分布,最后通过Prometheus exporter暴露这些指标。

注意事项

  • 该crate遵循BUSL-1.1许可证
  • 最新版本为0.46.0
  • 由FuelLabs团队维护

1 回复

Rust性能监控插件fuel-core-metrics完整示例

完整示例代码

以下是基于fuel-core-metrics构建的完整示例,展示如何在实际项目中使用该库进行性能监控:

Cargo.toml

[package]
name = "metrics-demo"
version = "0.1.0"
edition = "2021"

[dependencies]
fuel-core-metrics = "0.1"
tokio = { version = "1.0", features = ["full"] }

src/metrics.rs

use fuel_core_metrics::{metric_group, counter, gauge, histogram};

// 定义API相关指标组
metric_group!(
    ApiMetrics,
    requests: counter("Total number of API requests received"),
    success_responses: counter("Number of successful API responses (2xx)"),
    error_responses: counter("Number of error API responses (4xx/5xx)"),
    response_time: histogram("API response time in seconds")
);

// 定义数据库相关指标组  
metric_group!(
    DbMetrics,
    queries: counter("Total number of database queries executed"),
    query_time: histogram("Database query execution time in seconds"),
    connections: gauge("Current number of active database connections")
);

// 初始化所有指标
pub fn init_metrics() {
    // 这里可以添加自定义的初始化逻辑
    println!("Metrics initialized");
}

// 获取API指标实例
pub fn api_metrics() -> ApiMetrics {
    ApiMetrics::new()
}

// 获取数据库指标实例
pub fn db_metrics() -> DbMetrics {
    DbMetrics::new()
}

src/main.rs

use fuel_core_metrics::Metrics;
use std::time::Instant;
use tokio::time::{sleep, Duration};
use crate::metrics::{init_metrics, api_metrics, db_metrics};

// 模拟API请求处理
async fn handle_api_request() {
    let start = Instant::now();
    let api = api_metrics();
    
    // 记录请求计数
    api.requests.inc();
    
    // 模拟业务处理
    sleep(Duration::from_millis(50)).await;
    
    // 随机决定请求成功或失败
    let is_success = rand::random::<bool>();
    if is_success {
        api.success_responses.inc();
    } else {
        api.error_responses.inc();
    }
    
    // 记录响应时间
    api.response_time.observe(start.elapsed().as_secs_f64());
}

// 模拟数据库查询
async fn execute_db_query() {
    let start = Instant::now();
    let db = db_metrics();
    
    // 记录查询计数
    db.queries.inc();
    
    // 更新连接数
    db.connections.set(rand::random::<u64>() % 10 + 1);
    
    // 模拟查询执行
    sleep(Duration::from_millis(20)).await;
    
    // 记录查询时间
    db.query_time.observe(start.elapsed().as_secs_f64());
}

#[tokio::main]
async fn main() {
    // 初始化指标收集器,监听8080端口
    let _metrics = Metrics::new("0.0.0.0:8080");
    
    // 初始化应用指标
    init_metrics();
    
    println!("Server started, metrics available at http://localhost:8080/metrics");
    
    // 模拟应用运行
    loop {
        // 处理API请求
        tokio::spawn(handle_api_request());
        
        // 执行数据库查询
        tokio::spawn(execute_db_query());
        
        sleep(Duration::from_secs(1)).await;
    }
}

项目结构

metrics-demo/
├── Cargo.toml
└── src/
    ├── main.rs
    └── metrics.rs

指标端点示例输出

启动应用后,访问 http://localhost:8080/metrics 将看到类似以下输出:

# HELP api_requests Total number of API requests received
# TYPE api_requests counter
api_requests 42

# HELP api_success_responses Number of successful API responses (2xx)
# TYPE api_success_responses counter
api_success_responses 38

# HELP api_error_responses Number of error API responses (4xx/5xx)
# TYPE api_error_responses counter
api_error_responses 4

# HELP api_response_time API response time in seconds
# TYPE api_response_time histogram
api_response_time_bucket{le="0.005"} 5
api_response_time_bucket{le="0.01"} 12
api_response_time_bucket{le="0.025"} 25
api_response_time_bucket{le="0.05"} 38
api_response_time_bucket{le="0.1"} 42
api_response_time_bucket{le="+Inf"} 42
api_response_time_sum 1.87654321
api_response_time_count 42

# HELP db_queries Total number of database queries executed
# TYPE db_queries counter
db_queries 35

# HELP db_query_time Database query execution time in seconds
# TYPE db_query_time histogram
db_query_time_bucket{le="0.005"} 8
db_query_time_bucket{le="0.01"} 18
db_query_time_bucket{le="0.025"} 30
db_query_time_bucket{le="0.05"} 35
db_query_time_bucket{le="+Inf"} 35
db_query_time_sum 0.7654321
db_query_time_count 35

# HELP db_connections Current number of active database connections
# TYPE db_connections gauge
db_connections 4

生产环境建议

  1. 添加认证中间件保护/metrics端点
  2. 为关键业务指标设置告警规则
  3. 使用Grafana创建仪表板可视化指标
  4. 考虑添加自定义标签区分不同服务实例
  5. 定期审查指标确保只收集有价值的指标
回到顶部