Address review findings on the fleet metrics page.
Data correctness:
- bucket raw Sentinel samples into epoch-aligned windows (5m/30m/2h per range)
and average them, replacing per-server LTTB. Every server now reports the
same bucket timestamps, so the fleet sums add up point by point instead of
zigzagging between servers (and RX+TX really combine)
- keep only the root mount in disk history, matching HasMetrics::getDiskMetrics
- leave sparkline gaps as null instead of 0, so absent samples read as gaps
Robustness:
- normalize containerMetric in mount()/updatedContainerMetric(), so
/metrics?cmetric=foo no longer throws an undefined array key
- include the server uuid in the container row wire:key; system containers
share one Sentinel id across servers
- round the range start to the minute so the 60s history cache can hit
- cap the Sentinel curl with --max-time 10, so one hung request cannot stall
the serial per-server loop
UI:
- pass the spark time axis on first paint, so tooltips no longer show 1970
- show the active series name (RX/TX) in the server network chart tooltip
Refine the /metrics fleet page and align the per-server metrics page with it.
Fleet overview:
- add live sparklines to the CPU/Memory/Disk/Network KPI tiles (shared axis,
capped to ~40 points per sparkline)
- fill the Servers online + Containers tiles (fleet-health bar, hottest
container) so all six tiles read as one system
- scope-aware labels: drop the "Fleet" prefix and helper copy when a single
server is selected
Trend charts:
- hero layout: CPU spans full width, the other four form a 2x2 grid
- apply the same hero layout + skeleton to the per-server page for consistency
Hottest containers table:
- add a rank column and a per-row magnitude bar scaled to the busiest container
- fix a leaked Blade @break directive that rendered literally and forced
horizontal scroll on the Network tab
- keep the value column a fixed width so bars align across rows
Live refresh:
- add analytics-style loading feedback to the range tabs and server filter
- stable wire:key on table rows + width transitions on bars so data glides
on live refresh instead of snapping
Generalize the shared _sparkline partial (optional color/label/format) so it
serves non-traffic metrics without changing analytics behaviour.