about summary refs log tree commit diff
path: root/src/db.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/db.rs')
-rw-r--r--src/db.rs69
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
+	}
+}