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
This commit is contained in:
anatoly yakovenko
2018-07-17 15:26:10 -07:00
committed by GitHub
parent 5b0418793e
commit 8bad411962

View File

@ -1,9 +1,10 @@
use influx_db_client as influxdb; use influx_db_client as influxdb;
use metrics; use metrics;
use std::env;
use std::sync::atomic::{AtomicUsize, Ordering}; use std::sync::atomic::{AtomicUsize, Ordering};
use timing; use timing;
const INFLUX_RATE: usize = 100; const DEFAULT_METRICS_RATE: usize = 100;
pub struct Counter { pub struct Counter {
pub name: &'static str, pub name: &'static str,
@ -12,7 +13,7 @@ pub struct Counter {
pub times: AtomicUsize, pub times: AtomicUsize,
/// last accumulated value logged /// last accumulated value logged
pub lastlog: AtomicUsize, pub lastlog: AtomicUsize,
pub lograte: usize, pub lograte: AtomicUsize,
} }
macro_rules! create_counter { macro_rules! create_counter {
@ -22,7 +23,7 @@ macro_rules! create_counter {
counts: AtomicUsize::new(0), counts: AtomicUsize::new(0),
times: AtomicUsize::new(0), times: AtomicUsize::new(0),
lastlog: 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 { macro_rules! inc_new_counter {
($name:expr, $count:expr) => {{ ($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); inc_counter!(INC_NEW_COUNTER, $count);
}}; }};
($name:expr, $count:expr, $lograte:expr) => {{ ($name:expr, $count:expr, $lograte:expr) => {{
@ -45,11 +46,26 @@ macro_rules! inc_new_counter {
} }
impl 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) { pub fn inc(&mut self, events: usize) {
let counts = self.counts.fetch_add(events, Ordering::Relaxed); let counts = self.counts.fetch_add(events, Ordering::Relaxed);
let times = self.times.fetch_add(1, Ordering::Relaxed); let times = self.times.fetch_add(1, Ordering::Relaxed);
let lastlog = self.lastlog.load(Ordering::Relaxed); let mut lograte = self.lograte.load(Ordering::Relaxed);
if times % self.lograte == 0 && times > 0 { 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!( info!(
"COUNTER:{{\"name\": \"{}\", \"counts\": {}, \"samples\": {}, \"now\": {}}}", "COUNTER:{{\"name\": \"{}\", \"counts\": {}, \"samples\": {}, \"now\": {}}}",
self.name, self.name,
@ -57,8 +73,6 @@ impl Counter {
times, times,
timing::timestamp(), timing::timestamp(),
); );
}
if times % INFLUX_RATE == 0 && times > 0 {
metrics::submit( metrics::submit(
influxdb::Point::new(&format!("counter-{}", self.name)) influxdb::Point::new(&format!("counter-{}", self.name))
.add_field( .add_field(
@ -74,7 +88,8 @@ impl Counter {
} }
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use counter::Counter; use counter::{Counter, DEFAULT_METRICS_RATE};
use std::env;
use std::sync::atomic::{AtomicUsize, Ordering}; use std::sync::atomic::{AtomicUsize, Ordering};
#[test] #[test]
fn test_counter() { fn test_counter() {
@ -84,7 +99,7 @@ mod tests {
unsafe { unsafe {
assert_eq!(COUNTER.counts.load(Ordering::Relaxed), 1); assert_eq!(COUNTER.counts.load(Ordering::Relaxed), 1);
assert_eq!(COUNTER.times.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.lastlog.load(Ordering::Relaxed), 0);
assert_eq!(COUNTER.name, "test"); assert_eq!(COUNTER.name, "test");
} }
@ -106,4 +121,35 @@ mod tests {
inc_new_counter!("counter-1", 1); inc_new_counter!("counter-1", 1);
inc_new_counter!("counter-2", 1, 2); 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
);
}
}
} }