From 223a47ffde6413190c0a466acb0cd5becaa21d74 Mon Sep 17 00:00:00 2001 From: Guillaume Nodet Date: Mon, 29 Jun 2026 15:44:10 +0200 Subject: [PATCH 1/2] fix: make TUI charts fill available width on wide terminals Charts previously used a fixed 60-point buffer which left empty space on wide terminals. Increase history buffers to 300 points and compute renderPoints dynamically from the available area width so sparklines and bar charts fill their panels. Co-Authored-By: Claude Opus 4.6 --- .../camel/dsl/jbang/core/commands/tui/EndpointsTab.java | 8 ++++---- .../dsl/jbang/core/commands/tui/MetricsCollector.java | 4 ++-- .../camel/dsl/jbang/core/commands/tui/OverviewTab.java | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/EndpointsTab.java b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/EndpointsTab.java index 68813cbb9ee09..e50c0b0acb795 100644 --- a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/EndpointsTab.java +++ b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/EndpointsTab.java @@ -51,7 +51,7 @@ class EndpointsTab implements MonitorTab { private static final String[] SORT_COLUMNS = { "component", "route", "dir", "total", "body", "hdr", "uri" }; - private static final int MAX_CHART_POINTS = 60; + private static final int MAX_CHART_POINTS = 300; private static final int CHART_ALL = 0; private static final int CHART_SINGLE = 1; private static final int CHART_OFF = 2; @@ -426,7 +426,7 @@ private void renderEndpointFlow( LinkedList inHist = inHistMap.getOrDefault(pid, new LinkedList<>()); LinkedList outHist = outHistMap.getOrDefault(pid, new LinkedList<>()); - int renderPoints = MAX_CHART_POINTS; + int renderPoints = Math.min(MAX_CHART_POINTS, Math.max(2, hSplit.get(1).width() - 6)); long[] inArr = new long[renderPoints]; long[] outArr = new long[renderPoints]; for (int i = 0; i < renderPoints; i++) { @@ -529,7 +529,7 @@ private void renderSingleEndpointChart(Frame frame, Rect area, String selectedUr LinkedList inHist = perEndpointInHistory.getOrDefault(key, new LinkedList<>()); LinkedList outHist = perEndpointOutHistory.getOrDefault(key, new LinkedList<>()); - int renderPoints = MAX_CHART_POINTS; + int renderPoints = Math.min(MAX_CHART_POINTS, Math.max(2, hSplit.get(1).width() - 6)); long[] inArr = new long[renderPoints]; long[] outArr = new long[renderPoints]; for (int i = 0; i < renderPoints; i++) { @@ -576,7 +576,7 @@ private void renderPayloadSizeChart(Frame frame, Rect area, String pid) { LinkedList inHist = endpointInSizeHistory.getOrDefault(pid, new LinkedList<>()); LinkedList outHist = endpointOutSizeHistory.getOrDefault(pid, new LinkedList<>()); - int renderPoints = MAX_CHART_POINTS; + int renderPoints = Math.min(MAX_CHART_POINTS, Math.max(2, area.width() - 6)); long[] inArr = new long[renderPoints]; long[] outArr = new long[renderPoints]; for (int i = 0; i < renderPoints; i++) { diff --git a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/MetricsCollector.java b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/MetricsCollector.java index a2db00029ec8b..974af492c85fd 100644 --- a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/MetricsCollector.java +++ b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/MetricsCollector.java @@ -29,8 +29,8 @@ */ class MetricsCollector { - static final int MAX_SPARKLINE_POINTS = 60; - static final int MAX_ENDPOINT_CHART_POINTS = 60; + static final int MAX_SPARKLINE_POINTS = 300; + static final int MAX_ENDPOINT_CHART_POINTS = 300; static final int MAX_HEAP_HISTORY_POINTS = 120; static final long HEAP_SAMPLE_INTERVAL_MS = 5000; diff --git a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/OverviewTab.java b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/OverviewTab.java index b45dea4e93a52..09b95d7995cf8 100644 --- a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/OverviewTab.java +++ b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/OverviewTab.java @@ -71,7 +71,7 @@ interface OverviewActions { } private static final long VANISH_DURATION_MS = 6000; - private static final int MAX_SPARKLINE_POINTS = 60; + private static final int MAX_SPARKLINE_POINTS = 300; private static final String[] SORT_COLUMNS = { "pid", "name", "version", "status", "total", "fail" }; static final int CHART_ALL = 0; From cf8d06e5934450859cc9a74810f387ee7796a925 Mon Sep 17 00:00:00 2001 From: Guillaume Nodet Date: Mon, 29 Jun 2026 21:09:26 +0200 Subject: [PATCH 2/2] fix: apply dynamic chart sizing to CircuitBreakerTab Same treatment as EndpointsTab: increase MAX_CHART_POINTS to 300, compute renderPoints from available width, and use dynamic x-axis labels. Co-Authored-By: Claude Opus 4.6 --- .../dsl/jbang/core/commands/tui/CircuitBreakerTab.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/CircuitBreakerTab.java b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/CircuitBreakerTab.java index 762cac0d0d739..8cc985eaed270 100644 --- a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/CircuitBreakerTab.java +++ b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/CircuitBreakerTab.java @@ -49,7 +49,7 @@ class CircuitBreakerTab implements MonitorTab { private static final String[] SORT_COLUMNS = { "route", "id", "component", "state" }; - private static final int MAX_CHART_POINTS = 60; + private static final int MAX_CHART_POINTS = 300; private final MonitorContext ctx; private final TableState tableState = new TableState(); @@ -352,7 +352,7 @@ private void renderChart(Frame frame, Rect area, CircuitBreakerInfo cb, String p LinkedList successHist = cbSuccessHistory.get(key); LinkedList failHist = cbFailHistory.get(key); - int renderPoints = MAX_CHART_POINTS; + int renderPoints = Math.min(MAX_CHART_POINTS, Math.max(2, vSplit.get(1).width() - 6)); long[] successArr = new long[renderPoints]; long[] failArr = new long[renderPoints]; if (successHist != null) { @@ -384,7 +384,8 @@ private void renderChart(Frame frame, Rect area, CircuitBreakerInfo cb, String p .topStyle(Style.EMPTY.fg(Color.GREEN)) .bottomStyle(Style.EMPTY.fg(Color.LIGHT_RED)) .showYAxis(true) - .xLabels("-60s", "-45s", "-30s", "-15s", "now") + .xLabels("-" + renderPoints + "s", "-" + (renderPoints * 3 / 4) + "s", + "-" + (renderPoints / 2) + "s", "-" + (renderPoints / 4) + "s", "now") .block(Block.builder().borderType(BorderType.ROUNDED).borders(Borders.ALL) .title(Title.from(chartTitle)).build()) .build(), vSplit.get(1));