This commit is contained in:
csehviktor
2025-06-29 02:44:39 +02:00
commit c83e5c86e0
11 changed files with 474 additions and 0 deletions

8
agent/Cargo.toml Normal file
View File

@@ -0,0 +1,8 @@
[package]
name = "agent"
version = "0.1.0"
edition = "2024"
[dependencies]
common = { path = "../common" }
sysinfo = "0.35.2"

109
agent/src/collector.rs Normal file
View File

@@ -0,0 +1,109 @@
use common::metrics::{CPU, Disk, Memory, Metrics, Network, SystemInfo};
use sysinfo::{Disks, Networks, System};
pub struct Collector {
sys: System,
disks: Disks,
networks: Networks,
}
impl Collector {
pub fn new() -> Self {
Collector {
sys: System::new_all(),
disks: Disks::new_with_refreshed_list(),
networks: Networks::new_with_refreshed_list(),
}
}
pub fn collect_all(&mut self) -> Metrics {
let system_info = self.collect_sysinfo();
self.sys.refresh_cpu_usage();
self.sys.refresh_memory();
self.networks.refresh(true);
let cpu = self.collect_cpu();
let disk = self.collect_disk();
let memory = self.collect_memory();
let network = self.collect_network();
let metrics = Metrics {
system_info,
cpu,
disk,
memory,
network,
};
metrics
}
fn collect_sysinfo(&self) -> SystemInfo {
let system_info = SystemInfo {
uptime: System::uptime(),
host: System::host_name(),
name: System::name(),
kernel: System::kernel_version(),
os_version: System::os_version(),
};
system_info
}
fn collect_cpu(&self) -> CPU {
let cpus = self.sys.cpus();
let threads = cpus.len();
let usage = self.sys.global_cpu_usage();
CPU {
brand: String::from(cpus[0].brand()),
usage,
threads,
}
}
fn collect_disk(&self) -> Disk {
let disk = self
.disks
.iter()
.max_by_key(|disk| disk.total_space())
.unwrap();
let total = disk.total_space();
let free = disk.available_space();
Disk {
used: total - free,
free,
total
}
}
fn collect_memory(&self) -> Memory {
let memory_metrics = Memory {
used: self.sys.used_memory(),
total: self.sys.total_memory(),
swap_used: self.sys.used_swap(),
swap_total: self.sys.total_swap(),
};
memory_metrics
}
fn collect_network(&self) -> Network {
let (down, up): (u64, u64) = self.networks
.values()
.map(|data| (data.received(), data.transmitted()))
.fold((0, 0), |(acc_down, acc_up), (down, up)| {
(acc_down + down, acc_up + up)
});
Network {
down,
up,
}
}
}

19
agent/src/main.rs Normal file
View File

@@ -0,0 +1,19 @@
use collector::Collector;
use std::thread;
use std::time;
pub mod collector;
const REFRESH_INTERVAL: u64 = 3000;
fn main() {
let mut collector = Collector::new();
loop {
let metrics = collector.collect_all();
println!("Metrics: {:?}", metrics);
thread::sleep(time::Duration::from_millis(REFRESH_INTERVAL));
}
}