1 个不稳定版本
0.1.0 | 2024年6月27日 |
---|
#452 在 并发
35KB
553 行
statman
statman:原子统计的全局管理器
统计管理器
单个统计信息由一个 Stats
实例管理。大多数用例将通过调用 Stats::global
来使用全局实例,但也可以使用 [Stats::new()
] 实例化多个 Stats
管理器。
单个统计信息按名称管理。同名和同类型的统计信息将更新相同的底层值。
统计实现
所有统计信息都使用 [Arc
] 产生,因此可以由多个线程写入。
Counter
:由std::sync::atomic::AtomicU64
支持的计数器GaugeF64
:由atomic_float::AtomicF64
支持的度量GaugeI64
:由std::sync::atomic::AtomicI64
支持的度量Histogram
:使用hdrhistogram
封装的带有spin
锁的直方图。Set
:由scc::HashSet
支持的字符串集。
调度器
Stats
是一个命名统计的管理器,默认不进行任何调度。用户可以选择调度自己的调用 Stats::flush
或使用 scheduler
模块。
重置 Stats
默认情况下,在调用 flush 之间统计信息不会重置。可以使用 set_reset_on_flush
覆盖单个统计信息的此行为。可以通过 Stats
的 set_default_reset_on_flush_for_*
函数全局覆盖。
示例
use std::{
sync::{
atomic::{AtomicBool, Ordering},
Arc,
},
thread,
time::{Duration, SystemTime},
};
use chrono::{DateTime, Utc};
use statman::{scheduler::FlushScheduler, snapshot::StatsSnapshot, Stats};
// signal handling for a graceful exit
let runflag = Arc::new(AtomicBool::new(true));
{
let runflag = Arc::clone(&runflag);
ctrlc::set_handler(move || {
runflag.store(false, Ordering::Relaxed);
})
.expect("Error setting Ctrl-C handler");
}
// create and spawn a scheduler that will print stats every 10 minutes
FlushScheduler::new(Stats::global())
.with_register_callback(|snapshot: &StatsSnapshot| {
println!(
"{} - {:?}",
DateTime::<Utc>::from(SystemTime::now()).format("%T"),
snapshot
)
})
.with_runflag(Arc::clone(&runflag))
.spawn(Duration::from_secs(10))
.unwrap();
// create a histogram stat that resets on every call to flush
let hist = Stats::global().histogram("myhist");
hist.set_reset_on_flush(true);
// record an ever increasing value to the histogram
let mut next_record = 0;
while runflag.load(Ordering::Relaxed) {
hist.record(next_record);
next_record += 1;
thread::sleep(Duration::from_millis(10));
}
输出
22:11:00 - StatsSnapshot { counters: {}, gauges_f64: {}, gauges_i64: {}, histograms: {"myhist": HistogramSnapshot { count: 597, percentiles: [(50.0, 298), (90.0, 537), (99.9, 596), (99.99, 596), (100.0, 596)] }}, sets: {} }
22:11:10 - StatsSnapshot { counters: {}, gauges_f64: {}, gauges_i64: {}, histograms: {"myhist": HistogramSnapshot { count: 994, percentiles: [(50.0, 1093), (90.0, 1491), (99.9, 1590), (99.99, 1590), (100.0, 1590)] }}, sets: {} }
22:11:20 - StatsSnapshot { counters: {}, gauges_f64: {}, gauges_i64: {}, histograms: {"myhist": HistogramSnapshot { count: 994, percentiles: [(50.0, 2087), (90.0, 2485), (99.9, 2585), (99.99, 2585), (100.0, 2585)] }}, sets: {} }
许可证:MIT OR Apache-2.0
依赖关系
~3MB
~47K SLoC