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:
committed by
GitHub
parent
5b0418793e
commit
8bad411962
@ -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 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);
|
let lastlog = self.lastlog.load(Ordering::Relaxed);
|
||||||
if times % self.lograte == 0 && times > 0 {
|
|
||||||
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
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user