pub struct Heartbeat {
pub pc_id: String,
pub at: DateTime<Utc>,
pub agent_version: String,
pub hostname: Option<String>,
pub os_family: Option<String>,
pub agent_cpu_pct: Option<f64>,
pub agent_rss_bytes: Option<i64>,
pub agent_disk_read_bytes: Option<i64>,
pub agent_disk_written_bytes: Option<i64>,
}Expand description
Liveness ping every agent sends on a 30 s cadence (see
inventory_interval / heartbeat_interval in agent_config).
hostname and os_family are enriched baseline facts so the
SPA agents page has something to show as soon as the agent
boots — even when the full WMI-driven HwInventory hasn’t been
(or can’t be) collected. Both stay Option<String> so older
agents that don’t send them still deserialize cleanly.
Fields§
§pc_id: String§at: DateTime<Utc>§agent_version: String§hostname: Option<String>§os_family: Option<String>Coarse OS bucket from std::env::consts::OS — "windows",
"linux", "macos". Rich OS metadata still flows through
the inventory path; this is just the “agent is alive on a
agent_cpu_pct: Option<f64>Agent process CPU usage, in percent-of-one-core (a process
fully pinning one core reports 100; one pinning two cores
reports 200). This is sysinfo’s convention — closer to
top than to Windows Task Manager (which normalises by
total cores, so a 1-core peg on an 8-core box shows up as
~12.5 % in TM). Divide by host core count if you want a
host-normalised view. None is published on the very first
heartbeat after process start, because sysinfo’s CPU% needs
two consecutive samples to diff — populating it would
always report 0.0 there and risk an operator misreading
“agent isn’t doing anything”.
agent_rss_bytes: Option<i64>Agent process resident set size in bytes — sysinfo’s
Process::memory(), which on Windows is
PROCESS_MEMORY_COUNTERS_EX::WorkingSetSize (full working
set, shared + private). Closest Task Manager column is
“Working set (memory)”, NOT “Memory (private working set)”
which would be PrivateUsage and sysinfo exposes
separately as virtual_memory().
agent_disk_read_bytes: Option<i64>Absolute bytes the agent process has read from disk since it started. Wire format is cumulative (not delta) so dropped / out-of-order heartbeats don’t poison rate math for any client that wants to derive a rate by diffing successive snapshots. Today neither the backend projector nor the SPA does that diff — they just store and render the cumulative value. Future SPA work or an exporter can compute rate without a schema change.
agent_disk_written_bytes: Option<i64>Absolute bytes the agent process has written to disk since
it started. Same shape as agent_disk_read_bytes.