diff --git a/Cargo.lock b/Cargo.lock index 1fbb7b6a..2db67712 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -165,17 +165,6 @@ dependencies = [ "cc", ] -[[package]] -name = "average" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75aacce61912644dbb732271789748142bc4bf7ce6382d67bb26850516b7a391" -dependencies = [ - "easy-cast", - "float-ord", - "num-traits", -] - [[package]] name = "backtrace" version = "0.3.76" diff --git a/lightway-server/Cargo.toml b/lightway-server/Cargo.toml index ffc8c9e7..b8168986 100644 --- a/lightway-server/Cargo.toml +++ b/lightway-server/Cargo.toml @@ -19,7 +19,6 @@ workspace = true [dependencies] anyhow.workspace = true async-trait.workspace = true -average = "0.16.0" bytes.workspace = true bytesize.workspace = true clap.workspace = true diff --git a/lightway-server/src/ip_manager/ip_pool.rs b/lightway-server/src/ip_manager/ip_pool.rs index 902022e9..84c8850b 100644 --- a/lightway-server/src/ip_manager/ip_pool.rs +++ b/lightway-server/src/ip_manager/ip_pool.rs @@ -365,8 +365,6 @@ mod tests { #[test] fn test_shuffle() { - use average::Mean; - let mut pool = get_ip_pool(); pool.shuffle_ips(); @@ -383,15 +381,19 @@ mod tests { // chances of this coming out as less than 512 in practice are // miniscule. let mut previous = pool.allocate_ip().unwrap().to_bits(); - let m: Mean = std::iter::from_fn(|| { + let (count, total_differences) = std::iter::from_fn(|| { let ip = pool.allocate_ip()?.to_bits(); let delta = ip.abs_diff(previous); previous = ip; Some(delta as f64) }) - .collect(); - assert_gt!(m.mean(), 512.0); + .fold((0, 0.0f64), |(mut count, mut total_differences), v| { + count += 1; + total_differences += v; + (count, total_differences) + }); + assert_gt!(total_differences / count as f64, 512.0); } } diff --git a/lightway-server/src/main.rs b/lightway-server/src/main.rs index b3b86cb9..e8df624c 100644 --- a/lightway-server/src/main.rs +++ b/lightway-server/src/main.rs @@ -51,24 +51,25 @@ async fn metrics_debug() { metrics_util::debugging::DebugValue::Gauge(value) => { trace!("metric: {} {labels:?} = Guage({value:?})", name.as_str()) } - metrics_util::debugging::DebugValue::Histogram(values) => { - // TODO: https://docs.rs/average/latest/average/macro.concatenate.html for min/max and avg? - - use average::{Estimate, Max, Mean, Min, concatenate}; - - concatenate!(Stats, [Min, min], [Mean, mean], [Max, max]); - let len = values.len(); - let s: Stats = values.into_iter().map(|f| f.into_inner()).collect(); - + metrics_util::debugging::DebugValue::Histogram(values) if !values.is_empty() => { + let (sum, maximum, minimum) = values.iter().fold( + (0.0f64, f64::NEG_INFINITY, f64::INFINITY), + |(mut sum, maximum, minimum), v| { + let v = v.into_inner(); + sum += v; + (sum, maximum.max(v), minimum.min(v)) + }, + ); trace!( "metric: {} {labels:?} = Histogram({} samples min/avg/max {:.2}/{:.2}/{:.2})", name.as_str(), - len, - s.min(), - s.mean(), - s.max(), + values.len(), + minimum, + sum / values.len() as f64, + maximum, ) } + _ => (), }; } }