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"),

Reply via email to