Skip to main content

hashiverse_server_lib/server/stats/
system_stats.rs

1use sysinfo::{Disks, System};
2
3/// Build the `system` subtree: process- and host-level metrics that don't
4/// belong to any single subsystem. Numbers only; never asserts a specific
5/// value, since these vary per host.
6///
7/// Disk fields sum across all disks the OS exposes. Load average is reported
8/// as three floats; on platforms that don't compute load averages (notably
9/// Windows) the fields are present but zero.
10pub fn system_stats_subtree() -> serde_json::Value {
11    let mut system = System::new();
12    system.refresh_memory();
13    let disks = Disks::new_with_refreshed_list();
14    let load = System::load_average();
15
16    let memory_total_bytes = system.total_memory();
17    let memory_free_bytes = system.available_memory();
18
19    let mut disk_total_bytes: u64 = 0;
20    let mut disk_free_bytes: u64 = 0;
21    for disk in disks.list() {
22        disk_total_bytes = disk_total_bytes.saturating_add(disk.total_space());
23        disk_free_bytes = disk_free_bytes.saturating_add(disk.available_space());
24    }
25
26    serde_json::json!({
27        "memory_total_bytes": memory_total_bytes,
28        "memory_free_bytes": memory_free_bytes,
29        "disk_total_bytes": disk_total_bytes,
30        "disk_free_bytes": disk_free_bytes,
31        "load_1m": load.one,
32        "load_5m": load.five,
33        "load_15m": load.fifteen,
34    })
35}