update: ptth_server metrics are at a stopping point for now

main
_ 2020-12-20 18:09:24 -06:00
parent eec17b10a1
commit e79925dc14
1 changed files with 51 additions and 13 deletions

View File

@ -1,4 +1,7 @@
use std::sync::Arc; use std::{
sync::Arc,
time::{Duration, Instant},
};
use arc_swap::ArcSwap; use arc_swap::ArcSwap;
use chrono::{DateTime, Utc}; use chrono::{DateTime, Utc};
@ -35,6 +38,8 @@ pub struct Startup {
#[derive (Debug, serde::Serialize)] #[derive (Debug, serde::Serialize)]
pub struct Interval { pub struct Interval {
#[serde (skip)]
pub at: Instant,
pub utc: DateTime <Utc>, pub utc: DateTime <Utc>,
pub rss_mib: u64, pub rss_mib: u64,
@ -94,6 +99,7 @@ impl Interval {
let rss_mib = mem.rss ().get::<mebibyte> (); let rss_mib = mem.rss ().get::<mebibyte> ();
let x = Self { let x = Self {
at: Instant::now (),
utc: Utc::now (), utc: Utc::now (),
rss_mib, rss_mib,
cpu_usage, cpu_usage,
@ -104,15 +110,53 @@ impl Interval {
pub async fn monitor (interval_writer: Arc <ArcSwap <Option <Interval>>>) pub async fn monitor (interval_writer: Arc <ArcSwap <Option <Interval>>>)
{ {
use std::time::Duration;
use uom::si::ratio::percent; use uom::si::ratio::percent;
let mut interval = tokio::time::interval (Duration::from_secs (60)); let mut interval = tokio::time::interval (Duration::from_secs (60));
#[derive (Default)]
struct Window {
window_length: u64,
next_interval: u64,
last_metrics: Arc <Option <Interval>>,
}
impl Window {
fn new (window_length: u64) -> Self {
Window {
window_length,
next_interval: 0,
last_metrics: Default::default (),
}
}
fn update (
&mut self,
counter: u64,
new_metrics: &Arc <Option <Interval>>
) {
if counter >= self.next_interval {
if let (Some (old), Some (new)) = (&*self.last_metrics, &**new_metrics) {
let diff = new.cpu_usage.clone () - old.cpu_usage.clone ();
trace! (
"CPU usage over {} s: {}%",
(new.at - old.at).as_secs (),
diff.get::<percent> (),
);
}
self.next_interval += self.window_length;
self.last_metrics = new_metrics.clone ();
}
}
}
let mut counter = 0_u64; let mut counter = 0_u64;
let mut next_10_time = counter;
let mut metrics_at_last_10: Arc <Option <Interval>> = Arc::new (None); let mut windows = [1, 5, 10, 60, 1440]
.iter ()
.map (|len| Window::new (*len))
.collect::<Vec <_>> ();
loop { loop {
interval.tick ().await; interval.tick ().await;
@ -126,14 +170,8 @@ impl Interval {
}; };
let new_interval_metrics = Arc::new (Some (new_interval_metrics)); let new_interval_metrics = Arc::new (Some (new_interval_metrics));
if counter >= next_10_time { for window in windows.iter_mut () {
if let (Some (old), Some (new)) = (&*metrics_at_last_10, &*new_interval_metrics) { window.update (counter, &new_interval_metrics);
let diff = new.cpu_usage.clone () - old.cpu_usage.clone ();
trace! ("CPU usage: {}%", diff.get::<percent> ());
}
next_10_time += 1;
metrics_at_last_10 = new_interval_metrics.clone ();
} }
interval_writer.store (new_interval_metrics); interval_writer.store (new_interval_metrics);