metrics_process/implementation/
linux.rs

1use 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}