summaryrefslogtreecommitdiffstats
path: root/src/app
diff options
context:
space:
mode:
authorpvanheus <pvh@webbedfeet.co.za>2021-03-13 03:03:25 +0200
committerGitHub <noreply@github.com>2021-03-12 20:03:25 -0500
commitd8f8a92b55f1404b17c7db41d8fd5f49c12b83b5 (patch)
tree4b9b3722553b28608ac2b226fcd6c474101e78fd /src/app
parentfd41c1367c0d9cf30c8598c1c4388e49054a9e68 (diff)
feature: Add support for displaying load average (#392)
Diffstat (limited to 'src/app')
-rw-r--r--src/app/data_farmer.rs17
-rw-r--r--src/app/data_harvester.rs12
-rw-r--r--src/app/data_harvester/load_avg.rs12
3 files changed, 40 insertions, 1 deletions
diff --git a/src/app/data_farmer.rs b/src/app/data_farmer.rs
index b1ba6a51..bfc7ae8d 100644
--- a/src/app/data_farmer.rs
+++ b/src/app/data_farmer.rs
@@ -16,8 +16,9 @@ use once_cell::sync::Lazy;
use std::{time::Instant, vec::Vec};
+use crate::app::data_harvester::load_avg::LoadAvgHarvest;
use crate::{
- data_harvester::{batteries, cpu, disks, mem, network, processes, temperature, Data},
+ data_harvester::{batteries, cpu, disks, load_avg, mem, network, processes, temperature, Data},
utils::gen_util::get_simple_byte_values,
};
use regex::Regex;
@@ -30,6 +31,7 @@ pub struct TimedData {
pub rx_data: Value,
pub tx_data: Value,
pub cpu_data: Vec<Value>,
+ pub load_avg_data: [f32; 3],
pub mem_data: Option<Value>,
pub swap_data: Option<Value>,
}
@@ -52,6 +54,7 @@ pub struct DataCollection {
pub memory_harvest: mem::MemHarvest,
pub swap_harvest: mem::MemHarvest,
pub cpu_harvest: cpu::CpuHarvest,
+ pub load_avg_harvest: load_avg::LoadAvgHarvest,
pub process_harvest: Vec<processes::ProcessHarvest>,
pub disk_harvest: Vec<disks::DiskHarvest>,
pub io_harvest: disks::IOHarvest,
@@ -71,6 +74,7 @@ impl Default for DataCollection {
memory_harvest: mem::MemHarvest::default(),
swap_harvest: mem::MemHarvest::default(),
cpu_harvest: cpu::CpuHarvest::default(),
+ load_avg_harvest: load_avg::LoadAvgHarvest::default(),
process_harvest: Vec::default(),
disk_harvest: Vec::default(),
io_harvest: disks::IOHarvest::default(),
@@ -143,6 +147,11 @@ impl DataCollection {
self.eat_cpu(cpu, &mut new_entry);
}
+ // Load Average
+ if let Some(load_avg) = harvested_data.load_avg {
+ self.eat_load_avg(load_avg, &mut new_entry);
+ }
+
// Temp
if let Some(temperature_sensors) = harvested_data.temperature_sensors {
self.eat_temp(temperature_sensors);
@@ -228,6 +237,12 @@ impl DataCollection {
self.cpu_harvest = cpu.to_vec();
}
+ fn eat_load_avg(&mut self, load_avg: LoadAvgHarvest, new_entry: &mut TimedData) {
+ new_entry.load_avg_data = load_avg;
+
+ self.load_avg_harvest = load_avg;
+ }
+
fn eat_temp(&mut self, temperature_sensors: Vec<temperature::TempHarvest>) {
// trace!("Eating temps.");
// TODO: [PO] To implement
diff --git a/src/app/data_harvester.rs b/src/app/data_harvester.rs
index 0fc8c6a5..3b7a0f63 100644
--- a/src/app/data_harvester.rs
+++ b/src/app/data_harvester.rs
@@ -19,6 +19,7 @@ use super::DataFilters;
pub mod batteries;
pub mod cpu;
pub mod disks;
+pub mod load_avg;
pub mod mem;
pub mod network;
pub mod processes;
@@ -28,6 +29,7 @@ pub mod temperature;
pub struct Data {
pub last_collection_time: Instant,
pub cpu: Option<cpu::CpuHarvest>,
+ pub load_avg: Option<load_avg::LoadAvgHarvest>,
pub memory: Option<mem::MemHarvest>,
pub swap: Option<mem::MemHarvest>,
pub temperature_sensors: Option<Vec<temperature::TempHarvest>>,
@@ -43,6 +45,7 @@ impl Default for Data {
Data {
last_collection_time: Instant::now(),
cpu: None,
+ load_avg: None,
memory: None,
swap: None,
temperature_sensors: None,
@@ -64,6 +67,7 @@ impl Data {
self.memory = None;
self.swap = None;
self.cpu = None;
+ self.load_avg = None;
if let Some(network) = &mut self.network {
network.first_run_cleanup();
@@ -248,6 +252,14 @@ impl DataCollector {
self.data.cpu = Some(cpu_data);
}
}
+
+ #[cfg(target_family = "unix")]
+ {
+ // Load Average
+ if let Ok(load_avg_data) = load_avg::get_load_avg().await {
+ self.data.load_avg = Some(load_avg_data);
+ }
+ }
}
// Batteries
diff --git a/src/app/data_harvester/load_avg.rs b/src/app/data_harvester/load_avg.rs
new file mode 100644
index 00000000..0f58ea8b
--- /dev/null
+++ b/src/app/data_harvester/load_avg.rs
@@ -0,0 +1,12 @@
+pub type LoadAvgHarvest = [f32; 3];
+
+#[cfg(target_family = "unix")]
+pub async fn get_load_avg() -> crate::error::Result<LoadAvgHarvest> {
+ let (one, five, fifteen) = heim::cpu::os::unix::loadavg().await?;
+
+ Ok([
+ one.get::<heim::units::ratio::ratio>(),
+ five.get::<heim::units::ratio::ratio>(),
+ fifteen.get::<heim::units::ratio::ratio>(),
+ ])
+}