Fix histogram bucket counts (fixes #1079)

This commit is contained in:
mdecimus
2025-01-11 16:04:02 +01:00
parent 3c2edd2910
commit a175b3b55f

View File

@@ -8,11 +8,11 @@ use std::sync::atomic::{AtomicU64, Ordering};
use crate::MetricType; use crate::MetricType;
use super::array::AtomicU64Array; use super::array::AtomicU32Array;
pub struct AtomicHistogram<const N: usize> { pub struct AtomicHistogram<const N: usize> {
id: MetricType, id: MetricType,
buckets: AtomicU64Array<N>, buckets: AtomicU32Array<N>,
upper_bounds: [u64; N], upper_bounds: [u64; N],
sum: AtomicU64, sum: AtomicU64,
count: AtomicU64, count: AtomicU64,
@@ -23,7 +23,7 @@ pub struct AtomicHistogram<const N: usize> {
impl<const N: usize> AtomicHistogram<N> { impl<const N: usize> AtomicHistogram<N> {
pub const fn new(id: MetricType, upper_bounds: [u64; N]) -> Self { pub const fn new(id: MetricType, upper_bounds: [u64; N]) -> Self {
Self { Self {
buckets: AtomicU64Array::new(), buckets: AtomicU32Array::new(),
upper_bounds, upper_bounds,
sum: AtomicU64::new(0), sum: AtomicU64::new(0),
count: AtomicU64::new(0), count: AtomicU64::new(0),
@@ -41,7 +41,7 @@ impl<const N: usize> AtomicHistogram<N> {
for (idx, upper_bound) in self.upper_bounds.iter().enumerate() { for (idx, upper_bound) in self.upper_bounds.iter().enumerate() {
if value < *upper_bound { if value < *upper_bound {
self.buckets.add(idx, value); self.buckets.add(idx, 1);
return; return;
} }
} }
@@ -93,13 +93,13 @@ impl<const N: usize> AtomicHistogram<N> {
self.buckets self.buckets
.inner() .inner()
.iter() .iter()
.map(|bucket| bucket.load(Ordering::Relaxed)) .map(|bucket| bucket.load(Ordering::Relaxed) as u64)
} }
pub fn buckets_vec(&self) -> Vec<u64> { pub fn buckets_vec(&self) -> Vec<u64> {
let mut vec = Vec::with_capacity(N); let mut vec = Vec::with_capacity(N);
for bucket in self.buckets.inner().iter() { for bucket in self.buckets.inner().iter() {
vec.push(bucket.load(Ordering::Relaxed)); vec.push(bucket.load(Ordering::Relaxed) as u64);
} }
vec vec
} }