stomata_core/collectors/process/
collectors.rs1use 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
25impl<'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}