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");
}
主要功能
-
轻量级指标收集:
- 支持计数器(Counter)
- 支持直方图(Histogram)
- 支持标签(label)分类
-
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
生产环境建议
- 添加认证中间件保护/metrics端点
- 为关键业务指标设置告警规则
- 使用Grafana创建仪表板可视化指标
- 考虑添加自定义标签区分不同服务实例
- 定期审查指标确保只收集有价值的指标