You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2023/02/10 10:38:51 UTC

[camel] 02/05: CAMEL-19027: camel-console - Add dev console for backlog tracer

This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch trace-console
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 1c5c850d341d8505f65a3e1ae1ae92cfc10b03d7
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Fri Feb 10 09:28:36 2023 +0100

    CAMEL-19027: camel-console - Add dev console for backlog tracer
---
 .../camel/impl/engine/AbstractCamelContext.java    |  9 ++++++
 .../apache/camel/impl/console/TraceConsole.java    | 36 +++++++++++++++++-----
 2 files changed, 38 insertions(+), 7 deletions(-)

diff --git a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
index 9eab5d8bb63..726a7344dbd 100644
--- a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
+++ b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
@@ -482,7 +482,16 @@ public abstract class AbstractCamelContext extends BaseService
         if (type.isInstance(this)) {
             return type.cast(this);
         }
+        // lookup by direct implementatiin
         Object extension = extensions.get(type);
+        if (extension == null) {
+            // fallback and lookup via interfaces
+            for (Object e : extensions.values()) {
+                if (type.isInstance(e)) {
+                    return type.cast(e);
+                }
+            }
+        }
         if (extension instanceof Supplier) {
             extension = ((Supplier) extension).get();
             setExtension(type, (T) extension);
diff --git a/core/camel-console/src/main/java/org/apache/camel/impl/console/TraceConsole.java b/core/camel-console/src/main/java/org/apache/camel/impl/console/TraceConsole.java
index 685cab3d49c..f7d82ddf928 100644
--- a/core/camel-console/src/main/java/org/apache/camel/impl/console/TraceConsole.java
+++ b/core/camel-console/src/main/java/org/apache/camel/impl/console/TraceConsole.java
@@ -16,9 +16,12 @@
  */
 package org.apache.camel.impl.console;
 
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Map;
 
 import org.apache.camel.spi.BacklogTracer;
+import org.apache.camel.spi.BacklogTracerEventMessage;
 import org.apache.camel.spi.Configurer;
 import org.apache.camel.spi.annotations.DevConsole;
 import org.apache.camel.support.console.AbstractDevConsole;
@@ -28,26 +31,45 @@ import org.apache.camel.util.json.JsonObject;
 @Configurer(bootstrap = true)
 public class TraceConsole extends AbstractDevConsole {
 
-    private BacklogTracer tracer;
-
     public TraceConsole() {
         super("camel", "trace", "Camel Tracing", "Trace routed messages");
     }
 
-    @Override
-    protected void doBuild() throws Exception {
-        tracer = getCamelContext().getExtension(BacklogTracer.class);
-    }
-
     protected String doCallText(Map<String, Object> options) {
         StringBuilder sb = new StringBuilder();
 
+        BacklogTracer tracer = getCamelContext().getExtension(BacklogTracer.class);
+        if (tracer != null) {
+            for (BacklogTracerEventMessage t : tracer.dumpAllTracedMessages()) {
+                String xml = t.toXml(0);
+                sb.append(xml).append("\n");
+            }
+        }
+
         return sb.toString();
     }
 
     protected JsonObject doCallJson(Map<String, Object> options) {
         JsonObject root = new JsonObject();
 
+        BacklogTracer tracer = getCamelContext().getExtension(BacklogTracer.class);
+        if (tracer != null) {
+            List<JsonObject> arr = new ArrayList<>();
+            root.put("traces", arr);
+            for (BacklogTracerEventMessage t : tracer.dumpAllTracedMessages()) {
+                JsonObject jo = new JsonObject();
+                jo.put("uid", t.getUid());
+                jo.put("exchangeId", t.getExchangeId());
+                jo.put("routeId", t.getRouteId());
+                jo.put("nodeId", t.getToNode());
+                if (t.getTimestamp() > 0) {
+                    jo.put("timestamp", t.getTimestamp());
+                }
+                // TODO: message body/headers as json
+                arr.add(jo);
+            }
+        }
+
         return root;
     }