From 0d4e4b18c2c4913129e930190a3f015bdb761144 Mon Sep 17 00:00:00 2001 From: anatoly yakovenko Date: Tue, 10 Jul 2018 15:14:59 -0700 Subject: [PATCH] Quiet counter (#574) * only submit to influx when we log * test accumulated value logging --- src/counter.rs | 39 ++++++++++++++++++++++++++++++--------- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/src/counter.rs b/src/counter.rs index 0ca08db24..b3ed19545 100644 --- a/src/counter.rs +++ b/src/counter.rs @@ -6,9 +6,12 @@ use timing; pub struct Counter { pub name: &'static str, + /// total accumulated value pub counts: AtomicUsize, pub nanos: AtomicUsize, pub times: AtomicUsize, + /// last accumulated value logged + pub lastlog: AtomicUsize, pub lograte: usize, } @@ -19,6 +22,7 @@ macro_rules! create_counter { counts: AtomicUsize::new(0), nanos: AtomicUsize::new(0), times: AtomicUsize::new(0), + lastlog: AtomicUsize::new(0), lograte: $lograte, } }; @@ -36,6 +40,7 @@ impl Counter { let counts = self.counts.fetch_add(events, Ordering::Relaxed); let nanos = self.nanos.fetch_add(total as usize, Ordering::Relaxed); let times = self.times.fetch_add(1, Ordering::Relaxed); + let lastlog = self.lastlog.load(Ordering::Relaxed); if times % self.lograte == 0 && times > 0 { info!( "COUNTER:{{\"name\": \"{}\", \"counts\": {}, \"nanos\": {}, \"samples\": {}, \"rate\": {}, \"now\": {}}}", @@ -46,16 +51,21 @@ impl Counter { counts as f64 * 1e9 / nanos as f64, timing::timestamp(), ); + metrics::submit( + influxdb::Point::new(&format!("counter_{}", self.name)) + .add_field( + "count", + influxdb::Value::Integer(counts as i64 - lastlog as i64), + ) + .add_field( + "duration_ms", + influxdb::Value::Integer(timing::duration_as_ms(&dur) as i64), + ) + .to_owned(), + ); + self.lastlog + .compare_and_swap(lastlog, counts, Ordering::Relaxed); } - metrics::submit( - influxdb::Point::new(&format!("counter_{}", self.name)) - .add_field("count", influxdb::Value::Integer(events as i64)) - .add_field( - "duration_ms", - influxdb::Value::Integer(timing::duration_as_ms(&dur) as i64), - ) - .to_owned(), - ); } } #[cfg(test)] @@ -74,7 +84,18 @@ mod tests { assert_ne!(COUNTER.nanos.load(Ordering::Relaxed), 0); assert_eq!(COUNTER.times.load(Ordering::Relaxed), 1); assert_eq!(COUNTER.lograte, 100); + assert_eq!(COUNTER.lastlog.load(Ordering::Relaxed), 0); assert_eq!(COUNTER.name, "test"); } + for _ in 0..199 { + inc_counter!(COUNTER, 2, start); + } + unsafe { + assert_eq!(COUNTER.lastlog.load(Ordering::Relaxed), 199); + } + inc_counter!(COUNTER, 2, start); + unsafe { + assert_eq!(COUNTER.lastlog.load(Ordering::Relaxed), 399); + } } }