use std::time::Duration;
#[derive(Debug, Clone)]
pub struct MonitorConfig {
pub poll_interval: Duration,
pub history_size: usize,
pub background_collection: bool,
}
const DEFAULT_HISTORY_SIZE: usize = 600;
const HIGH_FREQ_HISTORY_SIZE: usize = 1200;
const LOW_OVERHEAD_HISTORY_SIZE: usize = 120;
impl Default for MonitorConfig {
fn default() -> Self {
Self {
poll_interval: Duration::from_millis(100),
history_size: DEFAULT_HISTORY_SIZE,
background_collection: false,
}
}
}
impl MonitorConfig {
#[must_use]
pub fn high_frequency() -> Self {
Self {
poll_interval: Duration::from_millis(50),
history_size: HIGH_FREQ_HISTORY_SIZE,
background_collection: true,
}
}
#[must_use]
pub fn low_overhead() -> Self {
Self {
poll_interval: Duration::from_millis(500),
history_size: LOW_OVERHEAD_HISTORY_SIZE,
background_collection: false,
}
}
}
#[derive(Debug, Clone)]
pub enum MonitorError {
NoDevice,
InvalidDevice(u32),
BackendInit(String),
QueryFailed(String),
NotAvailable(String),
}
impl std::fmt::Display for MonitorError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::NoDevice => write!(f, "No GPU device available"),
Self::InvalidDevice(idx) => write!(f, "Invalid device index: {idx}"),
Self::BackendInit(msg) => write!(f, "Backend initialization failed: {msg}"),
Self::QueryFailed(msg) => write!(f, "Metrics query failed: {msg}"),
Self::NotAvailable(msg) => write!(f, "Feature not available: {msg}"),
}
}
}
impl std::error::Error for MonitorError {}