diff options
Diffstat (limited to 'src/db.rs')
-rw-r--r-- | src/db.rs | 69 |
1 files changed, 68 insertions, 1 deletions
diff --git a/src/db.rs b/src/db.rs index f10f9ee..9a0256a 100644 --- a/src/db.rs +++ b/src/db.rs @@ -4,7 +4,7 @@ use camino::Utf8PathBuf; use rusqlite::{params, Connection, OptionalExtension}; use time::OffsetDateTime; -use crate::gatherer::Meminfo; +use crate::gatherer::{Cpuinfo, Meminfo}; pub struct Database { db_path: Utf8PathBuf, @@ -23,6 +23,7 @@ impl Database { let conn = self.conn.lock().unwrap(); conn.execute(CREATE_TABLE_HOSTMEM, params![]).unwrap(); conn.execute(CREATE_TABLE_HOSTNET, params![]).unwrap(); + conn.execute(CREATE_TABLE_HOSTCPU, params![]).unwrap(); } pub fn insert_host_meminfo(&self, meminfo: Meminfo) { @@ -125,6 +126,42 @@ impl Database { .map(|r| r.unwrap()) .collect() } + + pub fn insert_hostcpu( + &self, + span_sec: usize, + user_delta: usize, + nice_delta: usize, + system_delta: usize, + ) { + let conn = self.conn.lock().unwrap(); + + conn.execute( + "INSERT INTO stats_hostcpu(span_sec, user_delta, nice_delta, system_delta) VALUES (?1, ?2, ?3, ?4)", + params![span_sec, user_delta, nice_delta, system_delta], + ) + .unwrap(); + } + + pub fn get_last_n_hostcpu(&self, count: usize) -> Vec<DbCpuinfo> { + let conn = self.conn.lock().unwrap(); + let mut stmt = conn + .prepare("SELECT * FROM stats_hostcpu ORDER BY stamp DESC LIMIT ?1") + .unwrap(); + + stmt.query_map(params![count], |row| { + Ok(DbCpuinfo { + stamp: row.get(0)?, + span_sec: row.get(1)?, + user_delta: row.get(2)?, + nice_delta: row.get(3)?, + system_delta: row.get(4)?, + }) + }) + .unwrap() + .map(|r| r.unwrap()) + .collect() + } } pub const CREATE_TABLE_HOSTMEM: &'static str = "\ @@ -142,6 +179,15 @@ pub const CREATE_TABLE_HOSTNET: &'static str = "\ tx_delta INTEGER NOT NULL );"; +pub const CREATE_TABLE_HOSTCPU: &'static str = "\ + CREATE TABLE IF NOT EXISTS stats_hostcpu( + stamp TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP, + span_sec INTEGER NOT NULL, + user_delta INTEGER NOT NULL, + nice_delta INTEGER NOT NULL, + system_delta INTEGER NOT NULL + );"; + #[derive(Clone, Copy, Debug)] pub struct DbMeminfo { pub stamp: OffsetDateTime, @@ -172,3 +218,24 @@ impl DbNetinfo { self.tx_delta as f32 / self.span_sec as f32 } } + +#[derive(Copy, Clone, Debug)] +pub struct DbCpuinfo { + pub stamp: OffsetDateTime, + pub span_sec: usize, + pub user_delta: usize, + pub nice_delta: usize, + pub system_delta: usize, +} + +impl DbCpuinfo { + /// Returns the avarage usage still in USER_HZ which is + /// in 1/100ths sec on "most systems". This is averaged + /// across the minute sample rate, so unit is: + /// USER_HZ/s + pub fn average_usage(&self) -> f32 { + let used_sum = self.user_delta + self.nice_delta + self.system_delta; + let avg = used_sum as f32 / self.span_sec as f32; + avg + } +} |