stomata_core/collectors/process/
collectors.rs

1use sysinfo::{Pid, Process, System};
2
3use crate::collectors::process::metrics::{ProcessData, SingleProcessData};
4
5impl From<&Process> for ProcessData {
6    fn from(process: &Process) -> Self {
7        ProcessData {
8            pid: process.pid().as_u32(),
9            name: process.name().to_string_lossy().to_string(),
10            cpu_usage: process.cpu_usage(),
11            memory: process.memory(),
12            status: process.status().to_string(),
13        }
14    }
15}
16
17impl ProcessData {
18    pub fn fetch(system: &System) -> Vec<Self> {
19        let processes: Vec<ProcessData> =
20            system.processes().values().map(ProcessData::from).collect();
21        return processes;
22    }
23}
24
25// Single Process
26impl<'a> From<(&'a Process, Vec<&'a Process>)> for SingleProcessData<'a> {
27    fn from((process, tasks): (&'a Process, Vec<&'a Process>)) -> Self {
28        let disk_usage = process.disk_usage();
29        let current_working_dir = if let Some(cwd) = process.cwd() {
30            Some(cwd.to_string_lossy().to_string())
31        } else {
32            None
33        };
34        let start_time = process.start_time();
35        let running_time = process.run_time();
36        let parent_pid = process.parent();
37
38        SingleProcessData {
39            basic_process_data: ProcessData::from(process),
40            tasks: tasks,
41            disk_usage,
42            start_time,
43            running_time,
44            current_working_dir,
45            parent_pid,
46        }
47    }
48}
49
50impl SingleProcessData<'_> {
51    pub fn fetch(system: &mut System, pid: u32) -> Option<SingleProcessData<'_>> {
52        if let Some(process) = system.process(Pid::from_u32(pid)) {
53            let tasks = if let Some(task_pids) = process.tasks() {
54                task_pids
55                    .iter()
56                    .filter_map(|p| system.process(*p))
57                    .collect()
58            } else {
59                Vec::new()
60            };
61
62            let single_process_data = SingleProcessData::from((process, tasks));
63            Some(single_process_data)
64        } else {
65            None
66        }
67    }
68}