Rust节点监控库polkadot-node-metrics的使用,Polkadot生态高性能区块链节点指标收集与分析工具
polkadot-node-metrics
Polkadot生态高性能区块链节点指标收集与分析工具
测试
在运行cargo test
之前,需要先构建worker二进制文件:
cargo build --bin polkadot-execute-worker --bin polkadot-prepare-worker
安装
在项目目录中运行以下Cargo命令:
cargo add polkadot-node-metrics
或者在Cargo.toml中添加以下行:
polkadot-node-metrics = "25.0.0"
示例代码
以下是一个使用polkadot-node-metrics库的完整示例:
use polkadot_node_metrics::metrics::{self, Metrics};
fn main() {
// 初始化指标收集器
let metrics = Metrics::new();
// 注册计数器指标
metrics.register_counter(
"polkadot_blocks_processed",
"Number of blocks processed",
);
// 注册直方图指标
metrics.register_histogram(
"polkadot_block_processing_time",
"Time taken to process blocks",
vec![0.1, 0.5, 1.0, 2.5, 5.0, 10.0],
);
// 模拟处理区块
for i in 0..10 {
let start = std::time::Instant::now();
// 模拟区块处理工作
std::thread::sleep(std::time::Duration::from_millis(100 * i));
// 记录区块处理时间
metrics.observe_histogram(
"polkadot_block_processing_time",
start.elapsed().as_secs_f64(),
);
// 增加已处理区块计数器
metrics.inc_counter("polkadot_blocks_processed");
}
// 打印收集的指标
println!("Metrics collected:");
for (name, value) in metrics.gather() {
println!("{}: {}", name, value);
}
}
在这个示例中,我们:
- 初始化了一个Metrics实例
- 注册了两个指标:
- 计数器:记录处理的区块数量
- 直方图:记录区块处理时间分布
- 模拟了区块处理过程
- 在每个区块处理后记录指标值
- 最后打印收集到的所有指标
完整示例demo
以下是基于上述示例的完整demo代码,展示了更多指标类型的使用:
use polkadot_node_metrics::metrics::{self, Metrics};
use std::thread;
use std::time::{Duration, Instant};
fn main() {
// 初始化指标收集器
let metrics = Metrics::new();
// 注册各种类型指标
metrics.register_counter(
"polkadot_blocks_processed",
"Total number of blocks processed",
);
metrics.register_gauge(
"polkadot_memory_usage",
"Current memory usage in MB",
);
metrics.register_histogram(
"polkadot_block_processing_time",
"Time taken to process blocks in seconds",
vec![0.1, 0.5, 1.0, 2.5, 5.0, 10.0],
);
metrics.register_summary(
"polkadot_tx_processing",
"Summary of transaction processing times",
vec![0.5, 0.9, 0.99],
);
// 模拟节点运行
for i in 1..=20 {
let block_start = Instant::now();
// 模拟区块处理
thread::sleep(Duration::from_millis(50 * i));
// 更新内存使用指标(模拟)
metrics.set_gauge("polkadot_memory_usage", (i * 10) as f64);
// 记录区块处理时间
metrics.observe_histogram(
"polkadot_block_processing_time",
block_start.elapsed().as_secs_f64(),
);
// 记录交易处理时间(模拟)
for _ in 0..5 {
let tx_start = Instant::now();
thread::sleep(Duration::from_millis(i * 5));
metrics.observe_summary(
"polkadot_tx_processing",
tx_start.elapsed().as_secs_f64(),
);
}
// 增加已处理区块计数
metrics.inc_counter("polkadot_blocks_processed");
println!("Processed block {}", i);
}
// 打印收集的所有指标
println!("\nFinal Metrics:");
for (name, value) in metrics.gather() {
println!("{}: {}", name, value);
}
}
关键特性
- 高性能指标收集,对节点性能影响最小化
- 支持多种指标类型:计数器、计量器、直方图等
- 与Prometheus监控系统兼容
- 专为Polkadot生态区块链节点设计
许可证
GPL-3.0-only
1 回复
Rust节点监控库polkadot-node-metrics使用指南
简介
polkadot-node-metrics
是一个专为Polkadot生态设计的高性能区块链节点指标收集与分析工具。它提供了轻量级的监控解决方案,帮助开发者跟踪Substrate/Polkadot节点的运行状态和性能指标。
主要特性
- 实时收集节点运行指标
- 支持Prometheus格式导出
- 低性能开销
- 与Substrate/Polkadot节点深度集成
- 提供丰富的预定义指标
安装方法
在Cargo.toml中添加依赖:
[dependencies]
polkadot-node-metrics = { version = "0.1", git = "https://github.com/paritytech/polkadot" }
基本使用方法
1. 初始化指标服务
use polkadot_node_metrics::Metrics;
fn main() {
// 创建指标实例
let metrics = Metrics::new();
// 启动HTTP服务(默认端口9615)
metrics.start_http_server().expect("Failed to start metrics server");
// 你的节点逻辑...
}
2. 记录自定义指标
// 定义自定义指标
lazy_static::lazy_static! {
static ref CUSTOM_BLOCKS_PROCESSED: prometheus::Counter = prometheus::register_counter!(
"polkadot_blocks_processed_total",
"Total number of blocks processed"
).unwrap();
}
// 在代码中使用
fn process_block() {
// 业务逻辑...
CUSTOM_BLOCKS_PROCESSED.inc();
}
3. 使用内置指标
use polkadot_node_metrics::metrics::{self, Metric::*};
// 记录交易处理时间
metrics::record(TransactionProcessed, 150); // 150毫秒
// 记录内存使用量
metrics::record(MemoryUsage, 1024); // 1024MB
常用指标示例
polkadot-node-metrics
提供了多种内置指标:
- CPU使用率:
cpu_usage_percentage
- 内存使用:
memory_usage_bytes
- 网络流量:
network_bytes_total{dir="in|out"}
- 区块处理时间:
block_processing_time_milliseconds
- 交易队列长度:
transaction_queue_length
Prometheus集成
启动服务后,可以通过http://localhost:9615/metrics
获取Prometheus格式的指标数据。
示例Prometheus配置:
scrape_configs:
- job_name: 'polkadot_node'
static_configs:
- targets: ['localhost:9615']
高级配置
use polkadot_node_metrics::{Metrics, MetricsConfig};
let config = MetricsConfig {
endpoint: "0.0.0.0:9999".parse().unwrap(), // 自定义端口
prefix: Some("custom_".to_string()), // 指标前缀
..Default::default()
};
let metrics = Metrics::with_config(config);
metrics.start_http_server().unwrap();
注意事项
- 在生产环境中,建议设置适当的指标采集频率以避免性能影响
- 监控HTTP端点应配置适当的访问控制
- 自定义指标命名应遵循Prometheus命名规范
- 高基数指标(如每个交易ID的指标)应谨慎使用
性能优化技巧
- 对于高频更新的指标,考虑使用
Counter
而不是Gauge
- 批量更新指标以减少锁争用
- 使用
Histogram
类型记录耗时操作时,合理设置buckets
完整示例Demo
use polkadot_node_metrics::{Metrics, metrics::{self, Metric::*}};
use lazy_static::lazy_static;
use std::thread;
use std::time::Duration;
// 自定义指标定义
lazy_static::lazy_static! {
static ref BLOCKS_PROCESSED: prometheus::Counter = prometheus::register_counter!(
"polkadot_blocks_processed_total",
"Total number of blocks processed"
).unwrap();
static ref TRANSACTION_LATENCY: prometheus::Histogram = prometheus::register_histogram!(
"polkadot_transaction_latency_seconds",
"Transaction processing latency in seconds",
vec![0.1, 0.5, 1.0, 2.0, 5.0] // 自定义buckets
).unwrap();
}
fn main() {
// 1. 初始化指标服务
let metrics = Metrics::new();
metrics.start_http_server().expect("Failed to start metrics server");
// 2. 模拟节点处理逻辑
let mut block_number = 0;
loop {
// 3. 模拟区块处理
process_block(block_number);
block_number += 1;
// 4. 使用内置指标记录系统状态
metrics::record(MemoryUsage, 512); // 模拟内存使用512MB
metrics::record(TransactionProcessed, 100); // 模拟交易处理时间100ms
// 5. 使用自定义指标
BLOCKS_PROCESSED.inc();
TRANSACTION_LATENCY.observe(0.3); // 模拟交易延迟0.3秒
thread::sleep(Duration::from_secs(1));
}
}
fn process_block(block_num: u64) {
// 模拟区块处理逻辑
println!("Processing block {}", block_num);
}
这个完整示例展示了如何:
- 初始化指标服务
- 使用内置指标和自定义指标
- 记录不同类型的数据(计数器、直方图)
- 模拟节点运行时的指标收集
要运行这个示例,请确保在Cargo.toml中添加了所有必要的依赖项。