container stats: measure agent disk usage through hive-priv, unknown on failure
The disk sampler ran `du -sxb` as the unprivileged hive-core user over
each agent's state/, work/ and container rootfs. hive-core cannot read
the rootfs or all of the agent-owned files, so `du` failed and each
failed path silently counted as 0: the dashboard showed a few MB for
agents using over 13 GB.
Add a hive-priv `MeasureAgentDisk { agent_name }` op. hive-priv
validates the name, derives the three paths itself (the request carries
no path), skips the ones that don't exist, and runs one
`du -s -x -b -c -P` as root with a 10 min timeout. A timeout, a non-zero
exit or output without a `total` line is an error.
hive-c0re calls it every 30 min instead of running `du` every 5 min:
each pass walks every agent's full tree as root on the disk the agents
work on, and the sizes move slowly. A failed measurement is cached as
None, so `disk_bytes` is null, the OTel storage.usage sample is omitted
and the dashboard shows "unknown", never 0.
`Coordinator::agent_work_dir` had no other caller and is removed.
Closes #4956
This commit is contained in:
parent
8ffceea8e3
commit
98ccc31e2b
10 changed files with 244 additions and 179 deletions
|
|
@ -286,14 +286,14 @@ function renderContainerLoad(rows) {
|
|||
: "∞";
|
||||
tr.append(lim);
|
||||
// Disk: on-disk footprint (state/ + work/ + container writable rootfs, shared
|
||||
// nix store excluded). Sampled out-of-band every few minutes server-side,
|
||||
// so it's null until the first sample lands — show an em-dash then.
|
||||
// nix store excluded). Measured out-of-band every 30 min server-side;
|
||||
// null means unknown (not measured yet, or the measurement failed).
|
||||
const disk = document.createElement("td");
|
||||
disk.className = "num";
|
||||
disk.title =
|
||||
"state/ + work/ + container writable rootfs (shared nix store excluded); sampled every few minutes";
|
||||
"state/ + work/ + container writable rootfs (shared nix store excluded); measured every 30 min";
|
||||
disk.textContent =
|
||||
r.disk_bytes != null ? cloadFmtBytes(Number(r.disk_bytes)) : "—";
|
||||
r.disk_bytes != null ? cloadFmtBytes(Number(r.disk_bytes)) : "unknown";
|
||||
tr.append(disk);
|
||||
|
||||
// Configured CPU / memory caps from ContainerView (resolved effective
|
||||
|
|
|
|||
Loading…
Reference in a new issue