From eaf9f1bcb87953d03c7daf4a874d25ddf65baaf6 Mon Sep 17 00:00:00 2001 From: Bryan Van Deusen Date: Wed, 7 Oct 2026 15:24:29 -0400 Subject: [PATCH] fix(traefik): request chart redraws once the dashboard has placed it, and refreshes every 5 min (#5214) A chart built while its cell was still being laid out could stay blank until a window resize; it now measures and draws again after layout settles. Each refresh rebuilds the chart (the flash), and its buckets are minutes wide, so the widget refreshes every 5 minutes instead of every poll. Co-Authored-By: Claude Opus 5.5 --- .../templates/traefik/widget_request_chart.html | 10 +++++++++- steward/core/widgets.py | 1 + 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/plugins/traefik/templates/traefik/widget_request_chart.html b/plugins/traefik/templates/traefik/widget_request_chart.html index d84112c..0df306c 100644 --- a/plugins/traefik/templates/traefik/widget_request_chart.html +++ b/plugins/traefik/templates/traefik/widget_request_chart.html @@ -30,7 +30,7 @@ var hhmm = function (ms) { return new Date(ms).toLocaleTimeString([], { hour: "2-digit", minute: "2-digit" }); }; - new Chart(ctx.getContext("2d"), { + var chart = new Chart(ctx.getContext("2d"), { type: "line", data: { labels: times, @@ -83,6 +83,14 @@ } } }); + // The chart is built while the dashboard may still be placing this cell, + // and a chart sized then can stay blank until a window resize (#5214). + // Measure and draw again once layout has settled. + setTimeout(function () { + if (!ctx.isConnected) return; + chart.resize(); + chart.update("none"); + }, 250); } catch (err) { fail(err && err.message ? err.message : String(err)); } diff --git a/steward/core/widgets.py b/steward/core/widgets.py index 8fa3fec..5c15d22 100644 --- a/steward/core/widgets.py +++ b/steward/core/widgets.py @@ -131,6 +131,7 @@ WIDGET_REGISTRY: dict[str, dict] = { "detail_url": "/plugins/traefik/", "plugin": "traefik", "poll": True, + "poll_seconds": 300, # buckets are minutes wide; each refresh redraws the chart "params": [ { "key": "hours",