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);
    }
}

在这个示例中,我们:

  1. 初始化了一个Metrics实例
  2. 注册了两个指标:
    • 计数器:记录处理的区块数量
    • 直方图:记录区块处理时间分布
  3. 模拟了区块处理过程
  4. 在每个区块处理后记录指标值
  5. 最后打印收集到的所有指标

完整示例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();

注意事项

  1. 在生产环境中,建议设置适当的指标采集频率以避免性能影响
  2. 监控HTTP端点应配置适当的访问控制
  3. 自定义指标命名应遵循Prometheus命名规范
  4. 高基数指标(如每个交易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);
}

这个完整示例展示了如何:

  1. 初始化指标服务
  2. 使用内置指标和自定义指标
  3. 记录不同类型的数据(计数器、直方图)
  4. 模拟节点运行时的指标收集

要运行这个示例,请确保在Cargo.toml中添加了所有必要的依赖项。

回到顶部