Decouple log and metrics rate (#1839)
Use separate env for log and metrics rate. Set default log level to WARN if unset.
This commit is contained in:
		@@ -37,7 +37,6 @@ snap)
 | 
				
			|||||||
local|tar)
 | 
					local|tar)
 | 
				
			||||||
  PATH="$HOME"/.cargo/bin:"$PATH"
 | 
					  PATH="$HOME"/.cargo/bin:"$PATH"
 | 
				
			||||||
  export USE_INSTALL=1
 | 
					  export USE_INSTALL=1
 | 
				
			||||||
  export SOLANA_DEFAULT_METRICS_RATE=1
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  ./fetch-perf-libs.sh
 | 
					  ./fetch-perf-libs.sh
 | 
				
			||||||
  # shellcheck source=/dev/null
 | 
					  # shellcheck source=/dev/null
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,6 +9,7 @@ publicNetwork="$3"
 | 
				
			|||||||
entrypointIp="$4"
 | 
					entrypointIp="$4"
 | 
				
			||||||
numNodes="$5"
 | 
					numNodes="$5"
 | 
				
			||||||
RUST_LOG="$6"
 | 
					RUST_LOG="$6"
 | 
				
			||||||
 | 
					export RUST_LOG=${RUST_LOG:-solana=warn} # if RUST_LOG is unset, default to warn
 | 
				
			||||||
 | 
					
 | 
				
			||||||
missing() {
 | 
					missing() {
 | 
				
			||||||
  echo "Error: $1 not specified"
 | 
					  echo "Error: $1 not specified"
 | 
				
			||||||
@@ -46,7 +47,6 @@ snap)
 | 
				
			|||||||
  # shellcheck disable=SC2089
 | 
					  # shellcheck disable=SC2089
 | 
				
			||||||
  commonNodeConfig="\
 | 
					  commonNodeConfig="\
 | 
				
			||||||
    leader-ip=\"$entrypointIp\" \
 | 
					    leader-ip=\"$entrypointIp\" \
 | 
				
			||||||
    default-metrics-rate=1 \
 | 
					 | 
				
			||||||
    metrics-config=\"$SOLANA_METRICS_CONFIG\" \
 | 
					    metrics-config=\"$SOLANA_METRICS_CONFIG\" \
 | 
				
			||||||
    rust-log=\"$RUST_LOG\" \
 | 
					    rust-log=\"$RUST_LOG\" \
 | 
				
			||||||
    setup-args=\"$setupArgs\" \
 | 
					    setup-args=\"$setupArgs\" \
 | 
				
			||||||
@@ -87,7 +87,6 @@ local|tar)
 | 
				
			|||||||
  PATH="$HOME"/.cargo/bin:"$PATH"
 | 
					  PATH="$HOME"/.cargo/bin:"$PATH"
 | 
				
			||||||
  export USE_INSTALL=1
 | 
					  export USE_INSTALL=1
 | 
				
			||||||
  export RUST_LOG
 | 
					  export RUST_LOG
 | 
				
			||||||
  export SOLANA_DEFAULT_METRICS_RATE=1
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  ./fetch-perf-libs.sh
 | 
					  ./fetch-perf-libs.sh
 | 
				
			||||||
  # shellcheck source=/dev/null
 | 
					  # shellcheck source=/dev/null
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,11 +9,9 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
if [[ -d $SNAP ]]; then # Running inside a Linux Snap?
 | 
					if [[ -d $SNAP ]]; then # Running inside a Linux Snap?
 | 
				
			||||||
  RUST_LOG="$(snapctl get rust-log)"
 | 
					  RUST_LOG="$(snapctl get rust-log)"
 | 
				
			||||||
  SOLANA_DEFAULT_METRICS_RATE="$(snapctl get default-metrics-rate)"
 | 
					 | 
				
			||||||
  SOLANA_METRICS_CONFIG="$(snapctl get metrics-config)"
 | 
					  SOLANA_METRICS_CONFIG="$(snapctl get metrics-config)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  export RUST_LOG
 | 
					  export RUST_LOG
 | 
				
			||||||
  export SOLANA_DEFAULT_METRICS_RATE
 | 
					 | 
				
			||||||
  export SOLANA_METRICS_CONFIG
 | 
					  export SOLANA_METRICS_CONFIG
 | 
				
			||||||
fi
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,7 +4,7 @@ use std::env;
 | 
				
			|||||||
use std::sync::atomic::{AtomicUsize, Ordering};
 | 
					use std::sync::atomic::{AtomicUsize, Ordering};
 | 
				
			||||||
use timing;
 | 
					use timing;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const DEFAULT_METRICS_RATE: usize = 100;
 | 
					const DEFAULT_LOG_RATE: usize = 1000;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pub struct Counter {
 | 
					pub struct Counter {
 | 
				
			||||||
    pub name: &'static str,
 | 
					    pub name: &'static str,
 | 
				
			||||||
@@ -52,11 +52,11 @@ macro_rules! inc_new_counter {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
impl Counter {
 | 
					impl Counter {
 | 
				
			||||||
    fn default_log_rate() -> usize {
 | 
					    fn default_log_rate() -> usize {
 | 
				
			||||||
        let v = env::var("SOLANA_DEFAULT_METRICS_RATE")
 | 
					        let v = env::var("SOLANA_DEFAULT_LOG_RATE")
 | 
				
			||||||
            .map(|x| x.parse().unwrap_or(DEFAULT_METRICS_RATE))
 | 
					            .map(|x| x.parse().unwrap_or(DEFAULT_LOG_RATE))
 | 
				
			||||||
            .unwrap_or(DEFAULT_METRICS_RATE);
 | 
					            .unwrap_or(DEFAULT_LOG_RATE);
 | 
				
			||||||
        if v == 0 {
 | 
					        if v == 0 {
 | 
				
			||||||
            DEFAULT_METRICS_RATE
 | 
					            DEFAULT_LOG_RATE
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            v
 | 
					            v
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -69,37 +69,34 @@ impl Counter {
 | 
				
			|||||||
            lograte = Counter::default_log_rate();
 | 
					            lograte = Counter::default_log_rate();
 | 
				
			||||||
            self.lograte.store(lograte, Ordering::Relaxed);
 | 
					            self.lograte.store(lograte, Ordering::Relaxed);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if times % lograte == 0 && times > 0 {
 | 
					        if times % lograte == 0 && times > 0 && log_enabled!(level) {
 | 
				
			||||||
            if log_enabled!(level) {
 | 
					            info!(
 | 
				
			||||||
                info!(
 | 
					                "COUNTER:{{\"name\": \"{}\", \"counts\": {}, \"samples\": {},  \"now\": {}, \"events\": {}}}",
 | 
				
			||||||
                    "COUNTER:{{\"name\": \"{}\", \"counts\": {}, \"samples\": {},  \"now\": {}, \"events\": {}}}",
 | 
					                self.name,
 | 
				
			||||||
                    self.name,
 | 
					                counts + events,
 | 
				
			||||||
                    counts + events,
 | 
					                times,
 | 
				
			||||||
                    times,
 | 
					                timing::timestamp(),
 | 
				
			||||||
                    timing::timestamp(),
 | 
					                events,
 | 
				
			||||||
                    events,
 | 
					            );
 | 
				
			||||||
                );
 | 
					        }
 | 
				
			||||||
            }
 | 
					        let lastlog = self.lastlog.load(Ordering::Relaxed);
 | 
				
			||||||
 | 
					        let prev = self
 | 
				
			||||||
            let lastlog = self.lastlog.load(Ordering::Relaxed);
 | 
					            .lastlog
 | 
				
			||||||
            let prev = self
 | 
					            .compare_and_swap(lastlog, counts, Ordering::Relaxed);
 | 
				
			||||||
                .lastlog
 | 
					        if prev == lastlog {
 | 
				
			||||||
                .compare_and_swap(lastlog, counts, Ordering::Relaxed);
 | 
					            metrics::submit(
 | 
				
			||||||
            if prev == lastlog {
 | 
					                influxdb::Point::new(&format!("counter-{}", self.name))
 | 
				
			||||||
                metrics::submit(
 | 
					                    .add_field(
 | 
				
			||||||
                    influxdb::Point::new(&format!("counter-{}", self.name))
 | 
					                        "count",
 | 
				
			||||||
                        .add_field(
 | 
					                        influxdb::Value::Integer(counts as i64 - lastlog as i64),
 | 
				
			||||||
                            "count",
 | 
					                    ).to_owned(),
 | 
				
			||||||
                            influxdb::Value::Integer(counts as i64 - lastlog as i64),
 | 
					            );
 | 
				
			||||||
                        ).to_owned(),
 | 
					 | 
				
			||||||
                );
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#[cfg(test)]
 | 
					#[cfg(test)]
 | 
				
			||||||
mod tests {
 | 
					mod tests {
 | 
				
			||||||
    use counter::{Counter, DEFAULT_METRICS_RATE};
 | 
					    use counter::{Counter, DEFAULT_LOG_RATE};
 | 
				
			||||||
    use log::Level;
 | 
					    use log::Level;
 | 
				
			||||||
    use std::env;
 | 
					    use std::env;
 | 
				
			||||||
    use std::sync::atomic::{AtomicUsize, Ordering};
 | 
					    use std::sync::atomic::{AtomicUsize, Ordering};
 | 
				
			||||||
@@ -120,13 +117,13 @@ mod tests {
 | 
				
			|||||||
    #[test]
 | 
					    #[test]
 | 
				
			||||||
    fn test_counter() {
 | 
					    fn test_counter() {
 | 
				
			||||||
        let _readlock = get_env_lock().read();
 | 
					        let _readlock = get_env_lock().read();
 | 
				
			||||||
        static mut COUNTER: Counter = create_counter!("test", 100);
 | 
					        static mut COUNTER: Counter = create_counter!("test", 1000);
 | 
				
			||||||
        let count = 1;
 | 
					        let count = 1;
 | 
				
			||||||
        inc_counter!(COUNTER, Level::Info, count);
 | 
					        inc_counter!(COUNTER, Level::Info, count);
 | 
				
			||||||
        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.load(Ordering::Relaxed), 100);
 | 
					            assert_eq!(COUNTER.lograte.load(Ordering::Relaxed), 1000);
 | 
				
			||||||
            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");
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -134,7 +131,7 @@ mod tests {
 | 
				
			|||||||
            inc_counter!(COUNTER, Level::Info, 2);
 | 
					            inc_counter!(COUNTER, Level::Info, 2);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        unsafe {
 | 
					        unsafe {
 | 
				
			||||||
            assert_eq!(COUNTER.lastlog.load(Ordering::Relaxed), 199);
 | 
					            assert_eq!(COUNTER.lastlog.load(Ordering::Relaxed), 397);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        inc_counter!(COUNTER, Level::Info, 2);
 | 
					        inc_counter!(COUNTER, Level::Info, 2);
 | 
				
			||||||
        unsafe {
 | 
					        unsafe {
 | 
				
			||||||
@@ -154,40 +151,34 @@ mod tests {
 | 
				
			|||||||
        let _readlock = get_env_lock().read();
 | 
					        let _readlock = get_env_lock().read();
 | 
				
			||||||
        assert_eq!(
 | 
					        assert_eq!(
 | 
				
			||||||
            Counter::default_log_rate(),
 | 
					            Counter::default_log_rate(),
 | 
				
			||||||
            DEFAULT_METRICS_RATE,
 | 
					            DEFAULT_LOG_RATE,
 | 
				
			||||||
            "default_log_rate() is {}, expected {}, SOLANA_DEFAULT_METRICS_RATE environment variable set?",
 | 
					            "default_log_rate() is {}, expected {}, SOLANA_DEFAULT_LOG_RATE environment variable set?",
 | 
				
			||||||
            Counter::default_log_rate(),
 | 
					            Counter::default_log_rate(),
 | 
				
			||||||
            DEFAULT_METRICS_RATE,
 | 
					            DEFAULT_LOG_RATE,
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
        static mut COUNTER: Counter = create_counter!("test_lograte", 0);
 | 
					        static mut COUNTER: Counter = create_counter!("test_lograte", 0);
 | 
				
			||||||
        inc_counter!(COUNTER, Level::Info, 2);
 | 
					        inc_counter!(COUNTER, Level::Info, 2);
 | 
				
			||||||
        unsafe {
 | 
					        unsafe {
 | 
				
			||||||
            assert_eq!(
 | 
					            assert_eq!(COUNTER.lograte.load(Ordering::Relaxed), DEFAULT_LOG_RATE);
 | 
				
			||||||
                COUNTER.lograte.load(Ordering::Relaxed),
 | 
					 | 
				
			||||||
                DEFAULT_METRICS_RATE
 | 
					 | 
				
			||||||
            );
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    #[test]
 | 
					    #[test]
 | 
				
			||||||
    fn test_lograte_env() {
 | 
					    fn test_lograte_env() {
 | 
				
			||||||
        assert_ne!(DEFAULT_METRICS_RATE, 0);
 | 
					        assert_ne!(DEFAULT_LOG_RATE, 0);
 | 
				
			||||||
        let _writelock = get_env_lock().write();
 | 
					        let _writelock = get_env_lock().write();
 | 
				
			||||||
        static mut COUNTER: Counter = create_counter!("test_lograte_env", 0);
 | 
					        static mut COUNTER: Counter = create_counter!("test_lograte_env", 0);
 | 
				
			||||||
        env::set_var("SOLANA_DEFAULT_METRICS_RATE", "50");
 | 
					        env::set_var("SOLANA_DEFAULT_LOG_RATE", "50");
 | 
				
			||||||
        inc_counter!(COUNTER, Level::Info, 2);
 | 
					        inc_counter!(COUNTER, Level::Info, 2);
 | 
				
			||||||
        unsafe {
 | 
					        unsafe {
 | 
				
			||||||
            assert_eq!(COUNTER.lograte.load(Ordering::Relaxed), 50);
 | 
					            assert_eq!(COUNTER.lograte.load(Ordering::Relaxed), 50);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        static mut COUNTER2: Counter = create_counter!("test_lograte_env", 0);
 | 
					        static mut COUNTER2: Counter = create_counter!("test_lograte_env", 0);
 | 
				
			||||||
        env::set_var("SOLANA_DEFAULT_METRICS_RATE", "0");
 | 
					        env::set_var("SOLANA_DEFAULT_LOG_RATE", "0");
 | 
				
			||||||
        inc_counter!(COUNTER2, Level::Info, 2);
 | 
					        inc_counter!(COUNTER2, Level::Info, 2);
 | 
				
			||||||
        unsafe {
 | 
					        unsafe {
 | 
				
			||||||
            assert_eq!(
 | 
					            assert_eq!(COUNTER2.lograte.load(Ordering::Relaxed), DEFAULT_LOG_RATE);
 | 
				
			||||||
                COUNTER2.lograte.load(Ordering::Relaxed),
 | 
					 | 
				
			||||||
                DEFAULT_METRICS_RATE
 | 
					 | 
				
			||||||
            );
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user