metrics_process/implementation/
linux.rs1use once_cell::sync::Lazy;
2use procfs::prelude::*;
3use procfs::process::{LimitValue, Process};
4
5use super::Metrics;
6
7static TICKS_PER_SECOND: Lazy<f64> = Lazy::new(|| procfs::ticks_per_second() as f64);
8static BOOT_TIME_SECS: Lazy<Option<u64>> = Lazy::new(|| procfs::boot_time_secs().ok());
9
10pub fn collect() -> Metrics {
11 let mut metrics = Metrics::default();
12 if let Ok(proc) = Process::myself() {
13 if let Ok(stat) = proc.stat() {
14 if let Some(bts) = *BOOT_TIME_SECS {
15 metrics.start_time_seconds =
16 Some(bts + ((stat.starttime as f64) / *TICKS_PER_SECOND) as u64);
17 }
18 metrics.cpu_seconds_total = Some((stat.utime + stat.stime) as f64 / *TICKS_PER_SECOND);
19 metrics.resident_memory_bytes = Some(stat.rss_bytes().get());
20 metrics.virtual_memory_bytes = Some(stat.vsize);
21 metrics.threads = Some(stat.num_threads as u64);
22 }
23 metrics.open_fds = proc.fd_count().ok().map(|v| v as u64);
24 if let Ok(limit) = proc.limits() {
25 metrics.max_fds = match limit.max_open_files.soft_limit {
26 LimitValue::Value(v) => Some(v),
27 LimitValue::Unlimited => Some(0),
28 };
29 metrics.virtual_memory_max_bytes = match limit.max_address_space.soft_limit {
30 LimitValue::Value(v) => Some(v),
31 LimitValue::Unlimited => Some(0),
32 };
33 }
34 }
35 metrics
36}