readings-probe 0.1.2

Probe for vital metrics process logging
Documentation
use libc::{getrusage, rusage, RUSAGE_SELF};

use std::time::Duration;

use super::{OsReadings, ReadingsError};

fn get_rusage() -> rusage {
    unsafe {
        let mut usage = std::mem::zeroed();
        getrusage(RUSAGE_SELF, &mut usage);
        usage
    }
}

pub(crate) fn get_os_readings() -> Result<OsReadings, ReadingsError> {
    let proc_stat =
        std::fs::read_to_string("/proc/self/stat").map_err(|e| ReadingsError::ProcStat(e))?;
    let mut tokens = proc_stat.split(" ");
    let rusage = get_rusage();
    Ok(OsReadings {
        virtual_size: tokens.nth(22).unwrap().parse().unwrap_or(0),
        resident_size: 4 * 1024 * tokens.next().unwrap().parse().unwrap_or(0),
        resident_size_max: 1024 * rusage.ru_maxrss as u64,
        user_time: Duration::from_secs(rusage.ru_utime.tv_sec as _) + Duration::from_micros(rusage.ru_utime.tv_usec as _),
        system_time: Duration::from_secs(rusage.ru_stime.tv_sec as _) + Duration::from_micros(rusage.ru_stime.tv_usec as _),
        minor_fault: rusage.ru_minflt as u64,
        major_fault: rusage.ru_majflt as u64,
    })
}