use gregg_protocol::{
CpuMetrics, LoadAverage, MemoryMetrics, MetricCapabilities, StatusSnapshot, SwapMetrics,
SystemIdentity,
};
#[cfg(target_os = "linux")]
pub mod linux;
#[cfg(target_os = "macos")]
pub mod macos;
pub mod error;
#[derive(Debug, Clone, PartialEq)]
pub struct CollectedMetrics {
pub logical_cores: u32,
pub cpu_usage_pct: Option<f32>,
pub cpu_iowait_pct: Option<f32>,
pub load: LoadAverage,
pub memory: MemoryMetrics,
pub swap: SwapMetrics,
}
impl CollectedMetrics {
#[must_use]
pub fn into_snapshot(
self,
schema_version: u16,
observed_at_unix_ms: u64,
sample_interval_ms: u64,
capabilities: MetricCapabilities,
system: SystemIdentity,
) -> StatusSnapshot {
let cpu_usage_pct = self.cpu_usage_pct.unwrap_or(0.0);
let cpu_usage_pct = if cpu_usage_pct.is_finite() {
cpu_usage_pct
} else {
0.0
};
let cpu_iowait_pct = if capabilities.cpu_iowait {
Some(self.cpu_iowait_pct.unwrap_or(0.0))
} else {
None
};
StatusSnapshot {
schema_version,
observed_at_unix_ms,
sample_interval_ms,
capabilities,
system,
cpu: CpuMetrics {
logical_cores: self.logical_cores,
usage_pct: cpu_usage_pct,
iowait_pct: cpu_iowait_pct,
},
load: self.load,
memory: self.memory,
swap: self.swap,
}
}
}
pub trait SystemCollector: Send {
fn identity(&self) -> Result<SystemIdentity, error::CollectError>;
fn sample(&mut self) -> Result<CollectedMetrics, error::CollectError>;
fn capabilities(&self) -> MetricCapabilities;
}