Replace cpu usage by load average
[valheim_web.git] / backend / src / valheim_controller.rs
1 use sysinfo::{ ProcessExt, SystemExt };
2
3 #[derive(Debug)]
4 pub struct ValheimExe {
5 memory: u64, // [kB].
6 load_average_5min: f64, // [%].
7 uptime: u64, // [s].
8 }
9
10 impl ValheimExe {
11 pub fn format_memory(&self) -> String {
12 format_byte_size(self.memory * 1024, 2)
13 }
14 pub fn format_load_average(&self) -> String {
15 format!("{:.2} %", self.load_average_5min)
16 }
17 pub fn format_uptime(&self) -> String {
18 let mins = self.uptime / 60;
19 let hours = mins / 60;
20 let days = hours / 24;
21 format!("{}d{}h{}min", days, hours - 24 * days, mins - 60 * hours)
22 }
23 }
24
25 const BINARY_PREFIXES: [&str; 8] = ["B", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB"];
26
27 fn format_byte_size(bytes: u64, precision: usize) -> String {
28 for i in 0 .. 8 {
29 let mut size: u64 = 1;
30 for j in 0 .. i {
31 size *= 1024;
32 }
33
34 if bytes < 1024 {
35 return format!("{} {}", std::cmp::max(0u64, bytes), BINARY_PREFIXES[i]);
36 }
37 else if bytes < 1024 * size {
38 return format!("{:.prec$} {}", bytes as f64 / size as f64, BINARY_PREFIXES[i], prec = precision);
39 }
40 }
41
42 String::from("")
43 }
44
45 const VALHEIM_PROCESS_NAME: &str = "firefox"; //valheim_server";
46
47 pub fn get_valheim_executable_information() -> Option<ValheimExe> {
48 let mut system = sysinfo::System::new_all();
49 system.refresh_all();
50 let processes = system.get_process_by_name(VALHEIM_PROCESS_NAME);
51
52 if processes.len() >= 1 {
53 let process = processes.first().unwrap();
54
55 Some(
56 ValheimExe {
57 memory: process.memory(),
58 load_average_5min: system.get_load_average().five,
59 uptime: std::time::SystemTime::now().duration_since(std::time::UNIX_EPOCH).unwrap().as_secs() - process.start_time()
60 }
61 )
62 } else {
63 None
64 }
65 }