This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch feature/CAMEL-24328-jfr-tui-data in repository https://gitbox.apache.org/repos/asf/camel.git
commit b9e29dd15d774131249f2bf289f876e4b1f653da Author: Claus Ibsen <[email protected]> AuthorDate: Mon Aug 3 15:38:41 2026 +0200 CAMEL-24328: Move JFR tab to Observability, shorten title, add MCP table data Co-Authored-By: Claude Opus 4.6 <[email protected]> Signed-off-by: Claus Ibsen <[email protected]> --- .../modules/ROOT/pages/camel-jbang-tui.adoc | 4 +- .../camel/dsl/jbang/core/commands/tui/JfrTab.java | 83 +++++++++++++++++++++- .../dsl/jbang/core/commands/tui/TabRegistry.java | 6 +- 3 files changed, 87 insertions(+), 6 deletions(-) diff --git a/docs/user-manual/modules/ROOT/pages/camel-jbang-tui.adoc b/docs/user-manual/modules/ROOT/pages/camel-jbang-tui.adoc index 8d7d1ef7471b..91dac51ed4fe 100644 --- a/docs/user-manual/modules/ROOT/pages/camel-jbang-tui.adoc +++ b/docs/user-manual/modules/ROOT/pages/camel-jbang-tui.adoc @@ -124,9 +124,9 @@ to any tab, or use *Tab* / *Shift+Tab* to cycle. The *More* menu (key *0*) opens a popup with tabs organized into groups: * *Routing* -- Browse Endpoints, Consumers, HTTP, Inflight, Producers, Route Controller -* *Observability* -- Circuit Breaker, Health, Metrics, Network Services, Exchange Events, Recovery Tasks, OpenTelemetry Spans +* *Observability* -- Circuit Breaker, Health, JFR, Metrics, Network Services, Exchange Events, Recovery Tasks, OpenTelemetry Spans * *Data* -- JDBC DataSource, Kafka, SQL Query, SQL Trace -* *JVM* -- Classpath, Heap Memory Histogram, JFR, Memory Usage, Memory Leak, Process, Startup, Threads +* *JVM* -- Classpath, Heap Memory Histogram, Memory Usage, Memory Leak, Process, Startup, Threads * *Project* -- Beans, Catalog, Configuration, CVE Audit, Maven Dependencies, Type Converters, Data Type Transformers Tabs appear dynamically based on what the integration uses. For example, the Kafka tab appears diff --git a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/JfrTab.java b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/JfrTab.java index 10a9dcf8b92c..8102c0064e53 100644 --- a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/JfrTab.java +++ b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/JfrTab.java @@ -1016,9 +1016,90 @@ class JfrTab extends AbstractTab { }; } + @Override + public JsonObject getTableDataAsJson() { + if (!snapshotLoaded) { + return null; + } + JsonObject result = new JsonObject(); + result.put("tab", "JFR"); + result.put("view", activeView.label); + result.put("eventCount", snapshotEventCount); + + JsonArray rows = new JsonArray(); + switch (activeView) { + case ROUTES -> { + for (RouteStats r : routeData) { + JsonObject row = new JsonObject(); + row.put("routeId", r.routeId()); + row.put("total", r.total()); + row.put("failed", r.failed()); + row.put("failRate", r.total() > 0 ? Math.round(r.failed() * 1000.0 / r.total()) / 10.0 : 0); + row.put("minMs", r.minMs()); + row.put("meanMs", r.meanMs()); + row.put("maxMs", r.maxMs()); + rows.add(row); + } + } + case PROCESSORS -> { + for (ProcessorStats p : processorData) { + JsonObject row = new JsonObject(); + row.put("processorId", p.processorId()); + row.put("processorType", p.processorType()); + row.put("routeId", p.routeId()); + row.put("total", p.total()); + row.put("failed", p.failed()); + row.put("minMs", p.minMs()); + row.put("meanMs", p.meanMs()); + row.put("maxMs", p.maxMs()); + rows.add(row); + } + } + case ENDPOINTS -> { + for (EndpointStats e : endpointData) { + JsonObject row = new JsonObject(); + row.put("endpointUri", e.endpointUri()); + row.put("total", e.total()); + row.put("failed", e.failed()); + row.put("minMs", e.minMs()); + row.put("meanMs", e.meanMs()); + row.put("maxMs", e.maxMs()); + rows.add(row); + } + } + case FAILURES -> { + for (FailureEntry f : failureData) { + JsonObject row = new JsonObject(); + row.put("timestamp", f.timestamp()); + row.put("exchangeId", f.exchangeId()); + row.put("routeId", f.routeId()); + row.put("exceptionType", f.exceptionType()); + row.put("exceptionMessage", f.exceptionMessage()); + rows.add(row); + } + } + case REDELIVERIES -> { + for (RedeliveryEntry r : redeliveryData) { + JsonObject row = new JsonObject(); + row.put("timestamp", r.timestamp()); + row.put("exchangeId", r.exchangeId()); + row.put("routeId", r.routeId()); + row.put("attempt", r.attempt()); + row.put("maxAttempts", r.maxAttempts()); + rows.add(row); + } + } + } + result.put("rows", rows); + result.put("totalRows", rows.size()); + int sel = tableState.selected() != null ? tableState.selected() : -1; + result.put("selectedIndex", sel); + return result; + } + @Override public String description() { - return "JFR runtime instrumentation status, event toggling, and runtime data snapshot"; + return "JFR runtime profiling with route, processor, and endpoint statistics"; } @Override diff --git a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/TabRegistry.java b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/TabRegistry.java index 80b783a1b2d2..c81494078da6 100644 --- a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/TabRegistry.java +++ b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/TabRegistry.java @@ -212,6 +212,9 @@ class TabRegistry { new MoreTab( TuiIcons.TAB_SPANS, "Spans", "&OTel Spans", spansTab, "Observability", List.of("opentelemetry")), + new MoreTab( + TuiIcons.TAB_JFR, "JFR", "J&FR", jfrTab, "Observability", + List.of("jfr")), // Data new MoreTab( TuiIcons.TAB_DATASOURCE, "JDBC DataSource", "&JDBC DataSource", dataSourceTab, "Data", @@ -233,9 +236,6 @@ class TabRegistry { // JVM new MoreTab(TuiIcons.TAB_CLASSPATH, "Classpath", "&Classpath", classpathTab, "JVM"), new MoreTab(TuiIcons.TAB_HEAP, "Heap Memory Histogram", "Heap &Memory Histogram", heapHistogramTab, "JVM"), - new MoreTab( - TuiIcons.TAB_JFR, "Java Flight Recorder (JFR)", "Java Fli&ght Recorder (JFR)", jfrTab, "JVM", - List.of("jfr")), new MoreTab(TuiIcons.TAB_MEMORY, "Memory Usage", "&Memory Usage", memoryTab, "JVM"), new MoreTab(TuiIcons.TAB_MEMORY_LEAK, "Memory Leak", "&Memory Leak", memoryLeakTab, "JVM"), new MoreTab(TuiIcons.TAB_PROCESS, "Process", "&Process", processTab, "JVM"),
