From 77131c19b1de36707e1f666d065e8aeb1d27e951 Mon Sep 17 00:00:00 2001 From: rcourtman <8825017+rcourtman@users.noreply.github.com> Date: Tue, 13 Oct 2026 22:59:12 +0100 Subject: [PATCH] Show each bucket's min-max range behind drawer chart lines Drawer charts plot one average per time bucket, so a short CPU burst or I/O spike inside a 6-minute bucket (24h) or an hourly rollup (7d) shrinks into the average and disappears. The trend cards this Overview replaced stated a "24h low-high" range; the charts had nothing in its place. Each stored point already carries its bucket's min and max. A tinted, outlined band now spans those extremes behind every line, so a spike stands as a spire above the average. Series whose buckets never spread draw no band. While a time is inspected, the legend names that bucket's peak when it rises at least a tenth of the plot above the average, and the accessible value states each reading's average and range. Spec 86 also allows sub-pixel clipping when it checks that the drawer's Memory rows are fully in view. With the charts on Overview, CI placed that table on a fractional offset and the rounded table border clipped 0.4% of it (ratio 0.9956), failing an assertion of exactly 1. --- .../subsystems/frontend-primitives.md | 7 +- .../subsystems/performance-and-scalability.md | 5 +- .../35189f0b76ceee53.json | 37 ++++++ .../components/Workloads/GuestDrawer.test.tsx | 30 +++++ .../Workloads/GuestDrawerHistory.tsx | 51 +++++++- .../GuestDrawerHistory.inspection.test.tsx | 120 +++++++++++++++++- .../components/Workloads/guestDrawerModel.ts | 43 +++++++ .../tests/86-hybrid-memory-browser.spec.ts | 5 +- 8 files changed, 292 insertions(+), 6 deletions(-) create mode 100644 frontend-modern/browser-verification/35189f0b76ceee53.json diff --git a/docs/release-control/v6/internal/subsystems/frontend-primitives.md b/docs/release-control/v6/internal/subsystems/frontend-primitives.md index 7fdec8974e..3cf539efc4 100644 --- a/docs/release-control/v6/internal/subsystems/frontend-primitives.md +++ b/docs/release-control/v6/internal/subsystems/frontend-primitives.md @@ -5465,7 +5465,12 @@ reading, qualified "current" or "last known". An active alert on a charted metric tones that reading and, when it carries a numeric trigger, draws it as a dashed line in its severity colour; `getDrawerChartAlerts` maps alert types to chart metrics and converts I/O triggers from the alert engine's MiB/s to -the charts' bytes per second. Any +the charts' bytes per second. Each line is a bucket average, so a tinted band +behind it spans every bucket's own lowest and highest reading +(`buildGuestDrawerHistoryBandPath`): a short spike stays visible after +downsampling. While a time is inspected the readout names that bucket's peak +when it rises at least a tenth of the plot above the average, and the +accessible value states each reading's average and range. Any warning- or danger-toned detail row is lifted into a "Worth checking" section in front, whichever section owns it, so demotion never hides a reason a reading cannot be trusted. Guest diff --git a/docs/release-control/v6/internal/subsystems/performance-and-scalability.md b/docs/release-control/v6/internal/subsystems/performance-and-scalability.md index e3cfaef27d..bb7beb15bb 100644 --- a/docs/release-control/v6/internal/subsystems/performance-and-scalability.md +++ b/docs/release-control/v6/internal/subsystems/performance-and-scalability.md @@ -4013,8 +4013,9 @@ node per observation beyond the marker's two paths, and the readout no longer inserts or removes a line as the inspected time changes. Numeric gridline labels are computed from the scale the panel already holds; the compact "Worth checking" list reuses rows already derived, and an alert's -dashed trigger line reuses the alert the drawer already holds. None adds a read -or timer. +dashed trigger line reuses the alert the drawer already holds. The min-max band +reads the `min`/`max` each stored bucket already carries: one extra path per +series with any spread (none for flat data). None adds a read or timer. The default stored-history legend resolves one latest timestamp from that same bounded, normalized panel index, then looks up each configured series at diff --git a/frontend-modern/browser-verification/35189f0b76ceee53.json b/frontend-modern/browser-verification/35189f0b76ceee53.json new file mode 100644 index 0000000000..5f80e6e9c8 --- /dev/null +++ b/frontend-modern/browser-verification/35189f0b76ceee53.json @@ -0,0 +1,37 @@ +{ + "version": 1, + "base_sha": "b837a8a98d113aa2f06008afc329912eee19b7f4", + "verified_at": "2026-10-13T21:56:00Z", + "result": "passed", + "changed_paths": [ + "frontend-modern/src/components/Workloads/GuestDrawerHistory.tsx", + "frontend-modern/src/components/Workloads/guestDrawerModel.ts" + ], + "content_sha256": { + "frontend-modern/src/components/Workloads/GuestDrawerHistory.tsx": "63d543738ffb71ca86a8f9786d75c6479ae7ed0673a4f96b81620a549be63a82", + "frontend-modern/src/components/Workloads/guestDrawerModel.ts": "9e46fe5e7adc08b9199248516583745af18c3a08d225367645d0e8b47b86c64a" + }, + "routes": [ + "/proxmox/overview" + ], + "viewports": [ + { + "width": 1440, + "height": 900 + }, + { + "width": 390, + "height": 844 + } + ], + "states": [ + "final built bytes of this tree (origin/main b837a8a98d plus this change) embedded in a darwin binary, mock mode, headless Chromium on pulse-dev through a reverse tunnel, full-resolution element screenshots read by eye", + "mock history first: its stored buckets barely spread (10 of 102 points, by under 0.1 percentage points), so bands there are a hairline halo and no peak is named", + "then /api/metrics-store/history intercepted with 96 synthetic 24h buckets: CPU averaging 14-22% with two buckets peaking at 97%, network in peaking at 40 MB/s once, disk read peaking at 30 MB/s twice, memory and disk flat. Each spike shows as a tinted, outlined spire from its average line up to its peak on the Utilization, Network I/O and Disk I/O charts, while flat series draw no band", + "1440px: three charts side by side, spires visible at every spike; 390px: charts stacked, the same spires visible, no horizontal overflow" + ], + "interactions": [ + "expanded the first guest row; hovered the Utilization plot over the CPU spike bucket at 1440 and 390px: the header read \"Stored ยท