Rust遥测与监控插件库sc-telemetry的使用,sc-telemetry提供高性能分布式系统监控与日志收集功能
Rust遥测与监控插件库sc-telemetry的使用
sc-telemetry是Substrate客户端的一部分,它允许通过Polkadot遥测等工具收集遥测数据。
功能特点
- 基于Tokio的tracing库实现
- 使用tracing的日志记录功能报告遥测数据
- 通过tracing的Layer获取数据并发送到远程遥测服务器
- 支持同一进程中运行多个Substrate节点
- 使用异步通道与后台任务TelemetryWorker通信
工作原理
- 遥测信息使用tracing的日志记录功能
- tracing Layer检索数据并通过异步通道发送到TelemetryWorker
- TelemetryWorker将信息发送到配置的远程遥测服务器
- 使用tracing::Span来识别不同Substrate节点
- 通过TelemetryHandle进行节点初始化和注册
安装
在Cargo.toml中添加依赖:
sc-telemetry = "30.0.0"
或者运行命令:
cargo add sc-telemetry
完整示例代码
use sc_telemetry::{TelemetryWorker, TelemetryConfig, TelemetryEndpoints, TelemetryHandle};
use tracing_subscriber::Layer;
use std::sync::Arc;
#[tokio::main]
async fn main() {
// 1. 创建遥测配置
let telemetry_config = TelemetryConfig {
endpoints: TelemetryEndpoints::new(vec![
"wss://telemetry.polkadot.io/submit/".into()
]).unwrap(),
wasm_tracing: false,
node_name: "my_node".into(),
node_version: "1.0.0".into(),
};
// 2. 创建TelemetryWorker
let (telemetry_worker, telemetry_handle) = TelemetryWorker::new(telemetry_config)
.await
.unwrap();
// 3. 启动worker
tokio::spawn(telemetry_worker.run());
// 4. 获取tracing Layer
let telemetry_layer = telemetry_handle.telemetry_layer();
// 5. 初始化tracing订阅器
tracing_subscriber::registry()
.with(telemetry_layer)
.init();
// 6. 使用tracing记录日志
tracing::info!("Node starting up");
tracing::debug!("Debug information");
tracing::warn!("Warning message");
// 7. 模拟节点运行
for i in 0..10 {
tracing::info!(block = i, "Processing block");
tokio::time::sleep(std::time::Duration::from_secs(1)).await;
}
// 8. 关闭遥测
telemetry_handle.close().await;
}
代码说明
- 首先创建TelemetryConfig配置遥测端点等信息
- 使用配置创建TelemetryWorker和TelemetryHandle
- 启动worker后台任务
- 获取tracing Layer用于日志记录
- 初始化tracing订阅器
- 使用tracing宏记录不同级别的日志
- 模拟节点运行过程
- 最后关闭遥测连接
许可证
GPL-3.0-or-later WITH Classpath-exception-2.0
1 回复
Rust遥测与监控插件库sc-telemetry使用指南
概述
sc-telemetry是Substrate框架中的一个高性能遥测与监控组件,专门为分布式系统设计,提供强大的监控和日志收集功能。它特别适合区块链节点和其他需要高性能遥测的系统。
主要特性
- 高性能日志收集和处理
- 分布式系统监控支持
- 可扩展的遥测后端
- 与Substrate框架深度集成
- 支持多种监控指标类型
安装方法
在Cargo.toml中添加依赖:
[dependencies]
sc-telemetry = { version = "4.0.0", git = "https://github.com/paritytech/substrate.git", branch = "master" }
完整示例代码
use sc_telemetry::{TelemetryHandle, TelemetryWorker, TelemetryConfig, Metric};
use log::Level;
use tokio;
#[tokio::main]
async fn main() {
// 1. 初始化遥测系统
let telemetry = init_telemetry().await;
// 2. 发送不同类型的日志
log_example(&telemetry);
// 3. 报告各种监控指标
report_metrics(&telemetry);
// 保持程序运行以便观察
tokio::time::sleep(tokio::time::Duration::from_secs(5)).await;
}
async fn init_telemetry() -> TelemetryHandle {
// 配置遥测参数
let config = TelemetryConfig {
endpoint: "wss://telemetry.polkadot.io/submit/".into(),
node_name: "demo_node".into(),
node_version: "1.0.0".into(),
queue_size: 5000,
batch_size: 50,
..Default::default()
};
// 创建遥测工作器和处理句柄
let (worker, handle) = TelemetryWorker::new(config).unwrap();
// 启动遥测工作器
tokio::spawn(worker.run());
handle
}
fn log_example(telemetry: &TelemetryHandle) {
// 发送不同级别的日志
telemetry.log(Level::Info, "Application started");
telemetry.log(Level::Debug, "Initializing components");
// 发送带额外属性的日志
telemetry.log_with_values(
Level::Warn,
"Resource usage alert",
[("cpu", "90%"), ("memory", "85%")]
);
}
fn report_metrics(telemetry: &TelemetryHandle) {
// 报告计数器指标
telemetry.report_metric(Metric::counter("requests_received", 1));
// 报告测量值指标
telemetry.report_metric(Metric::gauge("cpu_usage", 72.5));
// 报告带标签的指标
telemetry.report_metric(
Metric::counter_with_tags("api_calls", 1)
.with_tag("endpoint", "/users")
.with_tag("status", "200")
);
// 报告直方图数据
telemetry.report_metric(
Metric::histogram("request_latency_ms", 150.0)
);
}
最佳实践
- 合理使用日志级别:避免在生产环境使用过多Debug级别日志
- 标签使用:利用标签对指标进行分类,便于后续分析
- 错误处理:处理遥测失败的情况,避免影响主业务流程
- 性能监控:对遥测系统本身进行监控,确保不会成为性能瓶颈
注意事项
- 遥测数据可能包含敏感信息,确保传输加密和访问控制
- 在高负载系统中适当调整队列大小和工作线程数量
- 考虑遥测数据的存储和保留策略
sc-telemetry为Rust分布式系统提供了强大的监控能力,合理使用可以显著提高系统的可观测性和运维效率。