From 8bad411962dbb234f8a3ce0bc04fe44e58e88f66 Mon Sep 17 00:00:00 2001 From: anatoly yakovenko Date: Tue, 17 Jul 2018 15:26:10 -0700 Subject: [PATCH] env variable for default metrics rate that gets set for counters (#670) * env variable for default metrics rate that gets set for counters * ignore if env rate is set to 0 * use a slow rate by default * fixed test --- src/counter.rs | 66 ++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 56 insertions(+), 10 deletions(-) diff --git a/src/counter.rs b/src/counter.rs index afdac25a3a..7a84e73cdd 100644 --- a/src/counter.rs +++ b/src/counter.rs @@ -1,9 +1,10 @@ use influx_db_client as influxdb; use metrics; +use std::env; use std::sync::atomic::{AtomicUsize, Ordering}; use timing; -const INFLUX_RATE: usize = 100; +const DEFAULT_METRICS_RATE: usize = 100; pub struct Counter { pub name: &'static str, @@ -12,7 +13,7 @@ pub struct Counter { pub times: AtomicUsize, /// last accumulated value logged pub lastlog: AtomicUsize, - pub lograte: usize, + pub lograte: AtomicUsize, } macro_rules! create_counter { @@ -22,7 +23,7 @@ macro_rules! create_counter { counts: AtomicUsize::new(0), times: AtomicUsize::new(0), lastlog: AtomicUsize::new(0), - lograte: $lograte, + lograte: AtomicUsize::new($lograte), } }; } @@ -35,7 +36,7 @@ macro_rules! inc_counter { macro_rules! inc_new_counter { ($name:expr, $count:expr) => {{ - static mut INC_NEW_COUNTER: Counter = create_counter!($name, 10); + static mut INC_NEW_COUNTER: Counter = create_counter!($name, 0); inc_counter!(INC_NEW_COUNTER, $count); }}; ($name:expr, $count:expr, $lograte:expr) => {{ @@ -45,11 +46,26 @@ macro_rules! inc_new_counter { } impl Counter { + fn default_log_rate() -> usize { + let v = env::var("SOLANA_DEFAULT_METRICS_RATE") + .map(|x| x.parse().unwrap_or(DEFAULT_METRICS_RATE)) + .unwrap_or(DEFAULT_METRICS_RATE); + if v == 0 { + DEFAULT_METRICS_RATE + } else { + v + } + } pub fn inc(&mut self, events: usize) { let counts = self.counts.fetch_add(events, 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 { + let mut lograte = self.lograte.load(Ordering::Relaxed); + if lograte == 0 { + lograte = Counter::default_log_rate(); + self.lograte.store(lograte, Ordering::Relaxed); + } + if times % lograte == 0 && times > 0 { + let lastlog = self.lastlog.load(Ordering::Relaxed); info!( "COUNTER:{{\"name\": \"{}\", \"counts\": {}, \"samples\": {}, \"now\": {}}}", self.name, @@ -57,8 +73,6 @@ impl Counter { times, timing::timestamp(), ); - } - if times % INFLUX_RATE == 0 && times > 0 { metrics::submit( influxdb::Point::new(&format!("counter-{}", self.name)) .add_field( @@ -74,7 +88,8 @@ impl Counter { } #[cfg(test)] mod tests { - use counter::Counter; + use counter::{Counter, DEFAULT_METRICS_RATE}; + use std::env; use std::sync::atomic::{AtomicUsize, Ordering}; #[test] fn test_counter() { @@ -84,7 +99,7 @@ mod tests { unsafe { assert_eq!(COUNTER.counts.load(Ordering::Relaxed), 1); assert_eq!(COUNTER.times.load(Ordering::Relaxed), 1); - assert_eq!(COUNTER.lograte, 100); + assert_eq!(COUNTER.lograte.load(Ordering::Relaxed), 100); assert_eq!(COUNTER.lastlog.load(Ordering::Relaxed), 0); assert_eq!(COUNTER.name, "test"); } @@ -106,4 +121,35 @@ mod tests { inc_new_counter!("counter-1", 1); inc_new_counter!("counter-2", 1, 2); } + #[test] + fn test_lograte() { + static mut COUNTER: Counter = create_counter!("test_lograte", 0); + inc_counter!(COUNTER, 2); + unsafe { + assert_eq!( + COUNTER.lograte.load(Ordering::Relaxed), + DEFAULT_METRICS_RATE + ); + } + } + #[test] + fn test_lograte_env() { + assert_ne!(DEFAULT_METRICS_RATE, 0); + static mut COUNTER: Counter = create_counter!("test_lograte_env", 0); + env::set_var("SOLANA_DEFAULT_METRICS_RATE", "50"); + inc_counter!(COUNTER, 2); + unsafe { + assert_eq!(COUNTER.lograte.load(Ordering::Relaxed), 50); + } + + static mut COUNTER2: Counter = create_counter!("test_lograte_env", 0); + env::set_var("SOLANA_DEFAULT_METRICS_RATE", "0"); + inc_counter!(COUNTER2, 2); + unsafe { + assert_eq!( + COUNTER2.lograte.load(Ordering::Relaxed), + DEFAULT_METRICS_RATE + ); + } + } }