pub mod cpu;
pub mod disk;
pub mod disk_mount;
pub mod disk_type;
pub mod gpu;
pub mod host;
pub mod memory;
pub mod network;
pub use cpu::CpuMetrics;
pub use disk::DiskMetrics;
pub use disk_mount::DiskMountMetrics;
pub use disk_type::DiskType;
pub use gpu::GpuMetrics;
pub use host::{CloudInfo, HostInfo};
pub use memory::MemoryMetrics;
pub use network::NetworkMetrics;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Sample {
pub timestamp_secs: u64,
#[serde(skip_serializing_if = "Option::is_none")]
pub actual_interval_ms: Option<u64>,
pub job_name: Option<String>,
pub tracked_pid: Option<i32>,
pub cpu: CpuMetrics,
pub memory: MemoryMetrics,
pub network: Vec<NetworkMetrics>,
pub disk: Vec<DiskMetrics>,
pub gpu: Vec<GpuMetrics>,
}
#[cfg(test)]
mod tests {
use super::*;
use crate::metrics::CpuMetrics;
fn minimal_sample(actual_ms: Option<u64>) -> Sample {
Sample {
timestamp_secs: 1_700_000_000,
actual_interval_ms: actual_ms,
job_name: None,
tracked_pid: None,
cpu: CpuMetrics::default(),
memory: MemoryMetrics::default(),
network: vec![],
disk: vec![],
gpu: vec![],
}
}
#[test]
fn test_actual_interval_ms_present_in_json_when_some() {
let sample = minimal_sample(Some(1042));
let v = serde_json::to_value(&sample).expect("serialize failed");
let ms = v["actual_interval_ms"]
.as_u64()
.expect("actual_interval_ms must be a number in JSON when Some");
assert_eq!(
ms, 1042,
"actual_interval_ms value must round-trip through JSON"
);
}
#[test]
fn test_actual_interval_ms_absent_from_json_when_none() {
let sample = minimal_sample(None);
let v = serde_json::to_value(&sample).expect("serialize failed");
assert!(
v["actual_interval_ms"].is_null(),
"actual_interval_ms must not appear in JSON when None, got: {:?}",
v["actual_interval_ms"]
);
}
#[test]
fn test_timestamp_secs_round_trips_through_json() {
let sample = minimal_sample(Some(999));
let v = serde_json::to_value(&sample).expect("serialize failed");
let ts = v["timestamp_secs"]
.as_u64()
.expect("timestamp_secs must be a u64 in JSON");
assert_eq!(ts, 1_700_000_000, "timestamp_secs must round-trip exactly");
}
}