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/11 19:19:21 UTC

[camel] branch camel-3.x updated (4eea4609285 -> b01c2174098)

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

davsclaus pushed a change to branch camel-3.x
in repository https://gitbox.apache.org/repos/asf/camel.git


    from 4eea4609285 CAMEL-19034 - Camel-AWS2-S3: GetObject should preserve the metadata
     new 3a0953edace CAMEL-19033: camel-jbang - Enable backlogTracing out of the box with camel run
     new 6b3b2f682a3 CAMEL-19036: trace console should output last 50 events.
     new 54595477008 CAMEL-19033: camel-jbang - Add trace command
     new 1566b380958 Regen for commit 1cd9b91b98f6c092929c7e5bc3c38f010dccae0c
     new 6241732c492 Regen for commit 0b269e8852d0c465314e764dbf47e19eec6332b6
     new a46cc000c0f CAMEL-19033: camel-jbang - Add trace command
     new b01c2174098 CAMEL-19033: camel-jbang - Add trace command

The 7 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../camel/impl/engine/CamelInternalProcessor.java  |   4 +-
 .../camel/impl/console/TraceConsoleConfigurer.java |  16 +--
 ...figurer.java => TraceDevConsoleConfigurer.java} |   8 +-
 .../org.apache.camel.impl.console.TraceConsole     |   2 -
 .../org.apache.camel.impl.console.TraceDevConsole  |   2 +
 .../services/org/apache/camel/dev-console/trace    |   2 +-
 .../{TraceConsole.java => TraceDevConsole.java}    |  49 ++++++++-
 .../org/apache/camel/support/MessageHelper.java    |  46 ++++++++-
 .../camel/cli/connector/LocalCliConnector.java     |  21 ++++
 .../dsl/jbang/core/commands/CamelCommand.java      |   7 ++
 .../dsl/jbang/core/commands/CamelJBangMain.java    |   2 +
 .../apache/camel/dsl/jbang/core/commands/Run.java  |   1 +
 .../process/{ListEvent.java => ListTrace.java}     | 110 +++++++++++++++------
 .../java/org/apache/camel/main/KameletMain.java    |   9 +-
 14 files changed, 221 insertions(+), 58 deletions(-)
 copy core/camel-console/src/generated/java/org/apache/camel/impl/console/{EventConsoleConfigurer.java => TraceDevConsoleConfigurer.java} (79%)
 delete mode 100644 core/camel-console/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.impl.console.TraceConsole
 create mode 100644 core/camel-console/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.impl.console.TraceDevConsole
 rename core/camel-console/src/main/java/org/apache/camel/impl/console/{TraceConsole.java => TraceDevConsole.java} (62%)
 copy dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/{ListEvent.java => ListTrace.java} (60%)


[camel] 05/07: Regen for commit 0b269e8852d0c465314e764dbf47e19eec6332b6

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 6241732c492c64f50282ffb3acddbd5880b07e17
Author: davsclaus <da...@users.noreply.github.com>
AuthorDate: Sat Feb 11 16:10:22 2023 +0000

    Regen for commit 0b269e8852d0c465314e764dbf47e19eec6332b6
    
    Signed-off-by: GitHub <no...@github.com>
---
 .../org/apache/camel/support/MessageHelper.java    | 32 +++++++++++-----------
 1 file changed, 16 insertions(+), 16 deletions(-)

diff --git a/core/camel-support/src/main/java/org/apache/camel/support/MessageHelper.java b/core/camel-support/src/main/java/org/apache/camel/support/MessageHelper.java
index c27bac39f7e..ce2b57f2713 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/MessageHelper.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/MessageHelper.java
@@ -477,15 +477,15 @@ public final class MessageHelper {
     /**
      * Dumps the message as a generic XML structure.
      *
-     * @param  message      the message
-     * @param  includeBody  whether or not to include the message body
-     * @param  indent       number of spaces to indent
+     * @param  message            the message
+     * @param  includeBody        whether or not to include the message body
+     * @param  indent             number of spaces to indent
      * @param  allowCachedStreams whether to include message body if they are stream cache based
-     * @param  allowStreams whether to include message body if they are stream based
-     * @param  allowFiles   whether to include message body if they are file based
-     * @param  maxChars     clip body after maximum chars (to avoid very big messages). Use 0 or negative value to not
-     *                      limit at all.
-     * @return              the XML
+     * @param  allowStreams       whether to include message body if they are stream based
+     * @param  allowFiles         whether to include message body if they are file based
+     * @param  maxChars           clip body after maximum chars (to avoid very big messages). Use 0 or negative value to
+     *                            not limit at all.
+     * @return                    the XML
      */
     public static String dumpAsXml(
             Message message, boolean includeBody, int indent, boolean allowCachedStreams, boolean allowStreams,
@@ -809,15 +809,15 @@ public final class MessageHelper {
     /**
      * Dumps the message as a generic JSon structure.
      *
-     * @param  message      the message
-     * @param  includeBody  whether or not to include the message body
-     * @param  indent       number of spaces to indent
+     * @param  message            the message
+     * @param  includeBody        whether or not to include the message body
+     * @param  indent             number of spaces to indent
      * @param  allowCachedStreams whether to include message body if they are stream cached based
-     * @param  allowStreams whether to include message body if they are stream based
-     * @param  allowFiles   whether to include message body if they are file based
-     * @param  maxChars     clip body after maximum chars (to avoid very big messages). Use 0 or negative value to not
-     *                      limit at all.
-     * @return              the JSon
+     * @param  allowStreams       whether to include message body if they are stream based
+     * @param  allowFiles         whether to include message body if they are file based
+     * @param  maxChars           clip body after maximum chars (to avoid very big messages). Use 0 or negative value to
+     *                            not limit at all.
+     * @return                    the JSon
      */
     public static String dumpAsJSon(
             Message message, boolean includeBody, int indent, boolean allowCachedStreams, boolean allowStreams,


[camel] 06/07: CAMEL-19033: camel-jbang - Add trace command

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit a46cc000c0f91064272395fccc4db23e0df95ff7
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Sat Feb 11 20:12:31 2023 +0100

    CAMEL-19033: camel-jbang - Add trace command
---
 .../src/main/java/org/apache/camel/support/MessageHelper.java  |  4 +++-
 .../camel/dsl/jbang/core/commands/process/ListTrace.java       | 10 +++++++++-
 2 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/core/camel-support/src/main/java/org/apache/camel/support/MessageHelper.java b/core/camel-support/src/main/java/org/apache/camel/support/MessageHelper.java
index ce2b57f2713..fb490910c60 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/MessageHelper.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/MessageHelper.java
@@ -831,7 +831,6 @@ public final class MessageHelper {
         // headers
         if (message.hasHeaders()) {
             JsonArray arr = new JsonArray();
-            jo.put("headers", arr);
             // sort the headers so they are listed A..Z
             Map<String, Object> headers = new TreeMap<>(message.getHeaders());
             for (Map.Entry<String, Object> entry : headers.entrySet()) {
@@ -855,6 +854,9 @@ public final class MessageHelper {
                     }
                 }
             }
+            if (!arr.isEmpty()) {
+                jo.put("headers", arr);
+            }
         }
 
         if (includeBody) {
diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListTrace.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListTrace.java
index e4ad7556206..3cbcc458431 100644
--- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListTrace.java
+++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListTrace.java
@@ -51,6 +51,10 @@ public class ListTrace extends ProcessWatchCommand {
                         description = "Only output last message")
     boolean last;
 
+    @CommandLine.Option(names = { "--pretty" },
+                        description = "Pretty print traced message")
+    boolean pretty;
+
     public ListTrace(CamelJBangMain main) {
         super(main);
     }
@@ -165,7 +169,11 @@ public class ListTrace extends ProcessWatchCommand {
     }
 
     private String getMessage(Row r) {
-        return r.message.toJson();
+        String s = r.message.toJson();
+        if (pretty) {
+            s = Jsoner.prettyPrint(s);
+        }
+        return s;
     }
 
     protected int sortRow(Row o1, Row o2) {


[camel] 01/07: CAMEL-19033: camel-jbang - Enable backlogTracing out of the box with camel run

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 3a0953edaceaefe12965b1dd8de2f9a97b766b55
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Fri Feb 10 13:02:37 2023 +0100

    CAMEL-19033: camel-jbang - Enable backlogTracing out of the box with camel run
---
 .../main/java/org/apache/camel/dsl/jbang/core/commands/Run.java  | 1 +
 .../src/main/java/org/apache/camel/main/KameletMain.java         | 9 +++++----
 2 files changed, 6 insertions(+), 4 deletions(-)

diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java
index a543981cd9f..de462ba942c 100644
--- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java
+++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java
@@ -336,6 +336,7 @@ class Run extends CamelCommand {
         writeSetting(main, profileProperties, "camel.jbang.repos", repos);
         writeSetting(main, profileProperties, "camel.jbang.health", health ? "true" : "false");
         writeSetting(main, profileProperties, "camel.jbang.console", console ? "true" : "false");
+        writeSetting(main, profileProperties, "camel.jbang.backlogTracing", "true");
         // the runtime version of Camel is what is loaded via the catalog
         writeSetting(main, profileProperties, "camel.jbang.camel-version", new DefaultCamelCatalog().getCatalogVersion());
         // merge existing dependencies with --deps
diff --git a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/KameletMain.java b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/KameletMain.java
index d28a5bc67ff..aa331e16659 100644
--- a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/KameletMain.java
+++ b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/KameletMain.java
@@ -177,8 +177,6 @@ public class KameletMain extends MainCommandLineSupport {
     /**
      * Optionally set the location of Maven settings.xml if it's different than {@code ~/.m2/settings.xml}. If set to
      * {@code false}, no default settings file will be used at all.
-     * 
-     * @param mavenSettings
      */
     public void setMavenSettings(String mavenSettings) {
         this.mavenSettings = mavenSettings;
@@ -191,8 +189,6 @@ public class KameletMain extends MainCommandLineSupport {
     /**
      * Optionally set the location of Maven settings-security.xml if it's different than
      * {@code ~/.m2/settings-security.xml}.
-     * 
-     * @param mavenSettingsSecurity
      */
     public void setMavenSettingsSecurity(String mavenSettingsSecurity) {
         this.mavenSettingsSecurity = mavenSettingsSecurity;
@@ -397,6 +393,11 @@ public class KameletMain extends MainCommandLineSupport {
         configure().withShutdownLogInflightExchangesOnTimeout(false);
         configure().withShutdownTimeout(10);
 
+        boolean tracing = "true".equals(getInitialProperties().get("camel.jbang.backlogTracing"));
+        if (tracing) {
+            configure().withBacklogTracing(true);
+        }
+
         boolean health = "true".equals(getInitialProperties().get("camel.jbang.health"));
         if (health && port == null) {
             // use default port 8080 if console is enabled


[camel] 02/07: CAMEL-19036: trace console should output last 50 events.

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 6b3b2f682a3102a8522969c8a2f4f94379a75064
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Sat Feb 11 15:58:24 2023 +0100

    CAMEL-19036: trace console should output last 50 events.
---
 .../camel/impl/console/TraceConsoleConfigurer.java |  16 +-
 .../services/org/apache/camel/dev-console/trace    |   2 +-
 .../{TraceConsole.java => TraceDevConsole.java}    |  49 ++++-
 .../camel/cli/connector/LocalCliConnector.java     |  21 +++
 .../dsl/jbang/core/commands/CamelCommand.java      |   7 +
 .../dsl/jbang/core/commands/CamelJBangMain.java    |   2 +
 .../dsl/jbang/core/commands/process/ListTrace.java | 208 +++++++++++++++++++++
 7 files changed, 293 insertions(+), 12 deletions(-)

diff --git a/core/camel-console/src/generated/java/org/apache/camel/impl/console/TraceConsoleConfigurer.java b/core/camel-console/src/generated/java/org/apache/camel/impl/console/TraceConsoleConfigurer.java
index e5feb4a2b1a..510d2c19c3b 100644
--- a/core/camel-console/src/generated/java/org/apache/camel/impl/console/TraceConsoleConfigurer.java
+++ b/core/camel-console/src/generated/java/org/apache/camel/impl/console/TraceConsoleConfigurer.java
@@ -1,15 +1,9 @@
 /* Generated by camel build tools - do NOT edit this file! */
 package org.apache.camel.impl.console;
 
-import java.util.Map;
-
 import org.apache.camel.CamelContext;
-import org.apache.camel.spi.ExtendedPropertyConfigurerGetter;
 import org.apache.camel.spi.PropertyConfigurerGetter;
-import org.apache.camel.spi.ConfigurerStrategy;
 import org.apache.camel.spi.GeneratedPropertyConfigurer;
-import org.apache.camel.util.CaseInsensitiveMap;
-import org.apache.camel.impl.console.TraceConsole;
 
 /**
  * Generated by camel build tools - do NOT edit this file!
@@ -19,10 +13,12 @@ public class TraceConsoleConfigurer extends org.apache.camel.support.component.P
 
     @Override
     public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) {
-        org.apache.camel.impl.console.TraceConsole target = (org.apache.camel.impl.console.TraceConsole) obj;
+        TraceDevConsole target = (TraceDevConsole) obj;
         switch (ignoreCase ? name.toLowerCase() : name) {
         case "camelcontext":
         case "CamelContext": target.setCamelContext(property(camelContext, org.apache.camel.CamelContext.class, value)); return true;
+        case "capacity":
+        case "Capacity": target.setCapacity(property(camelContext, int.class, value)); return true;
         default: return false;
         }
     }
@@ -32,16 +28,20 @@ public class TraceConsoleConfigurer extends org.apache.camel.support.component.P
         switch (ignoreCase ? name.toLowerCase() : name) {
         case "camelcontext":
         case "CamelContext": return org.apache.camel.CamelContext.class;
+        case "capacity":
+        case "Capacity": return int.class;
         default: return null;
         }
     }
 
     @Override
     public Object getOptionValue(Object obj, String name, boolean ignoreCase) {
-        org.apache.camel.impl.console.TraceConsole target = (org.apache.camel.impl.console.TraceConsole) obj;
+        TraceDevConsole target = (TraceDevConsole) obj;
         switch (ignoreCase ? name.toLowerCase() : name) {
         case "camelcontext":
         case "CamelContext": return target.getCamelContext();
+        case "capacity":
+        case "Capacity": return target.getCapacity();
         default: return null;
         }
     }
diff --git a/core/camel-console/src/generated/resources/META-INF/services/org/apache/camel/dev-console/trace b/core/camel-console/src/generated/resources/META-INF/services/org/apache/camel/dev-console/trace
index e92d8dd5461..a79ddc1c371 100644
--- a/core/camel-console/src/generated/resources/META-INF/services/org/apache/camel/dev-console/trace
+++ b/core/camel-console/src/generated/resources/META-INF/services/org/apache/camel/dev-console/trace
@@ -1,2 +1,2 @@
 # Generated by camel build tools - do NOT edit this file!
-class=org.apache.camel.impl.console.TraceConsole
+class=org.apache.camel.impl.console.TraceDevConsole
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/TraceDevConsole.java
similarity index 62%
rename from core/camel-console/src/main/java/org/apache/camel/impl/console/TraceConsole.java
rename to core/camel-console/src/main/java/org/apache/camel/impl/console/TraceDevConsole.java
index 1e02a9f12cf..f1d2ce1d9fe 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/TraceDevConsole.java
@@ -19,28 +19,56 @@ package org.apache.camel.impl.console;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
+import java.util.Queue;
+import java.util.concurrent.LinkedBlockingQueue;
 
 import org.apache.camel.spi.BacklogTracer;
 import org.apache.camel.spi.BacklogTracerEventMessage;
 import org.apache.camel.spi.Configurer;
+import org.apache.camel.spi.Metadata;
 import org.apache.camel.spi.annotations.DevConsole;
 import org.apache.camel.support.console.AbstractDevConsole;
 import org.apache.camel.util.json.JsonObject;
 
 @DevConsole("trace")
 @Configurer(bootstrap = true)
-public class TraceConsole extends AbstractDevConsole {
+public class TraceDevConsole extends AbstractDevConsole {
 
-    public TraceConsole() {
+    @Metadata(defaultValue = "50",
+            description = "Maximum capacity of last number of messages to capture (capacity must be between 50 and 1000)")
+    private int capacity = 50;
+
+    private Queue<BacklogTracerEventMessage> queue;
+
+    public TraceDevConsole() {
         super("camel", "trace", "Camel Tracing", "Trace routed messages");
     }
 
+    public int getCapacity() {
+        return capacity;
+    }
+
+    public void setCapacity(int capacity) {
+        this.capacity = capacity;
+    }
+
+    @Override
+    protected void doInit() throws Exception {
+        if (capacity > 1000 || capacity < 50) {
+            throw new IllegalArgumentException("Capacity must be between 50 and 1000");
+        }
+        this.queue = new LinkedBlockingQueue<>(capacity);
+    }
+
     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()) {
+                addMessage(t);
+            }
+            for (BacklogTracerEventMessage t : queue) {
                 String xml = t.toXml(0);
                 sb.append(xml).append("\n");
             }
@@ -49,14 +77,29 @@ public class TraceConsole extends AbstractDevConsole {
         return sb.toString();
     }
 
+    private void addMessage(BacklogTracerEventMessage message) {
+        // ensure there is space on the queue by polling until at least single slot is free
+        int drain = queue.size() - capacity + 1;
+        if (drain > 0) {
+            for (int i = 0; i < drain; i++) {
+                queue.poll();
+            }
+        }
+        queue.add(message);
+    }
+
     protected JsonObject doCallJson(Map<String, Object> options) {
         JsonObject root = new JsonObject();
 
         BacklogTracer tracer = getCamelContext().getExtension(BacklogTracer.class);
         if (tracer != null) {
+            for (BacklogTracerEventMessage t : tracer.dumpAllTracedMessages()) {
+                addMessage(t);
+            }
+
             List<JsonObject> arr = new ArrayList<>();
             root.put("traces", arr);
-            for (BacklogTracerEventMessage t : tracer.dumpAllTracedMessages()) {
+            for (BacklogTracerEventMessage t : queue) {
                 JsonObject jo = (JsonObject) t.asJSon();
                 arr.add(jo);
             }
diff --git a/dsl/camel-cli-connector/src/main/java/org/apache/camel/cli/connector/LocalCliConnector.java b/dsl/camel-cli-connector/src/main/java/org/apache/camel/cli/connector/LocalCliConnector.java
index fa5a5e58198..75c19f72ad0 100644
--- a/dsl/camel-cli-connector/src/main/java/org/apache/camel/cli/connector/LocalCliConnector.java
+++ b/dsl/camel-cli-connector/src/main/java/org/apache/camel/cli/connector/LocalCliConnector.java
@@ -78,6 +78,7 @@ public class LocalCliConnector extends ServiceSupport implements CliConnector, C
     private File statusFile;
     private File actionFile;
     private File outputFile;
+    private File traceFile;
 
     public LocalCliConnector(CliConnectorFactory cliConnectorFactory) {
         this.cliConnectorFactory = cliConnectorFactory;
@@ -136,6 +137,7 @@ public class LocalCliConnector extends ServiceSupport implements CliConnector, C
             statusFile = createLockFile(lockFile.getName() + "-status.json");
             actionFile = createLockFile(lockFile.getName() + "-action.json");
             outputFile = createLockFile(lockFile.getName() + "-output.json");
+            traceFile = createLockFile(lockFile.getName() + "-trace.json");
             executor.scheduleWithFixedDelay(this::task, 0, delay, TimeUnit.MILLISECONDS);
             LOG.info("Camel CLI enabled (local)");
         } else {
@@ -286,6 +288,13 @@ public class LocalCliConnector extends ServiceSupport implements CliConnector, C
                     LOG.trace("Updating output file: {}", outputFile);
                     IOHelper.writeText(json.toJson(), outputFile);
                 }
+            } else if ("trace".equals(action)) {
+                DevConsole dc = camelContext.getExtension(DevConsoleRegistry.class).resolveById("trace");
+                if (dc != null) {
+                    JsonObject json = (JsonObject) dc.call(DevConsole.MediaType.JSON);
+                    LOG.trace("Updating trace file: {}", traceFile);
+                    IOHelper.writeText(json.toJson(), traceFile);
+                }
             }
 
             // action done so delete file
@@ -418,6 +427,15 @@ public class LocalCliConnector extends ServiceSupport implements CliConnector, C
                         root.put("fault-tolerance", json);
                     }
                 }
+                DevConsole dc12 = dcr.resolveById("trace");
+                if (dc12 != null) {
+                    JsonObject json = (JsonObject) dc12.call(DevConsole.MediaType.JSON);
+                    if (json != null && !json.isEmpty()) {
+                        // special for trace messages which is stored in its own file
+                        LOG.trace("Updating trace file: {}", traceFile);
+                        IOHelper.writeText(json.toJson(), traceFile);
+                    }
+                }
             }
             // various details
             JsonObject services = collectServices();
@@ -600,6 +618,9 @@ public class LocalCliConnector extends ServiceSupport implements CliConnector, C
         if (outputFile != null) {
             FileUtil.deleteFile(outputFile);
         }
+        if (traceFile != null) {
+            FileUtil.deleteFile(traceFile);
+        }
         if (executor != null) {
             camelContext.getExecutorServiceManager().shutdown(executor);
             executor = null;
diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/CamelCommand.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/CamelCommand.java
index ef5e1b44b67..842ac8059bc 100644
--- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/CamelCommand.java
+++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/CamelCommand.java
@@ -68,6 +68,13 @@ public abstract class CamelCommand implements Callable<Integer> {
         return new File(camelDir, pid + "-output.json");
     }
 
+    public File getTraceFile(String pid) {
+        if (camelDir == null) {
+            camelDir = new File(System.getProperty("user.home"), ".camel");
+        }
+        return new File(camelDir, pid + "-trace.json");
+    }
+
     protected abstract static class ParameterConsumer<T> implements IParameterConsumer {
 
         @Override
diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/CamelJBangMain.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/CamelJBangMain.java
index 5176926abe2..d28dc582c79 100644
--- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/CamelJBangMain.java
+++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/CamelJBangMain.java
@@ -59,6 +59,7 @@ import org.apache.camel.dsl.jbang.core.commands.process.ListInflight;
 import org.apache.camel.dsl.jbang.core.commands.process.ListMetric;
 import org.apache.camel.dsl.jbang.core.commands.process.ListProcess;
 import org.apache.camel.dsl.jbang.core.commands.process.ListService;
+import org.apache.camel.dsl.jbang.core.commands.process.ListTrace;
 import org.apache.camel.dsl.jbang.core.commands.process.ListVault;
 import org.apache.camel.dsl.jbang.core.commands.process.StopProcess;
 import picocli.CommandLine;
@@ -84,6 +85,7 @@ public class CamelJBangMain implements Callable<Integer> {
                         .addSubcommand("health", new CommandLine(new ListHealth(main)))
                         .addSubcommand("endpoint", new CommandLine(new ListEndpoint(main)))
                         .addSubcommand("event", new CommandLine(new ListEvent(main)))
+                        .addSubcommand("trace", new CommandLine(new ListTrace(main)))
                         .addSubcommand("inflight", new CommandLine(new ListInflight(main)))
                         .addSubcommand("blocked", new CommandLine(new ListBlocked(main)))
                         .addSubcommand("route-controller", new CommandLine(new RouteControllerAction(main)))
diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListTrace.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListTrace.java
new file mode 100644
index 00000000000..e4ad7556206
--- /dev/null
+++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListTrace.java
@@ -0,0 +1,208 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.dsl.jbang.core.commands.process;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import com.github.freva.asciitable.AsciiTable;
+import com.github.freva.asciitable.Column;
+import com.github.freva.asciitable.HorizontalAlign;
+import com.github.freva.asciitable.OverflowBehaviour;
+import org.apache.camel.dsl.jbang.core.commands.CamelJBangMain;
+import org.apache.camel.dsl.jbang.core.common.ProcessHelper;
+import org.apache.camel.util.IOHelper;
+import org.apache.camel.util.TimeUtils;
+import org.apache.camel.util.json.JsonArray;
+import org.apache.camel.util.json.JsonObject;
+import org.apache.camel.util.json.Jsoner;
+import picocli.CommandLine;
+import picocli.CommandLine.Command;
+
+@Command(name = "trace",
+         description = "Get latest traced messages of Camel integrations")
+public class ListTrace extends ProcessWatchCommand {
+
+    @CommandLine.Parameters(description = "Name or pid of running Camel integration", arity = "0..1")
+    String name = "*";
+
+    @CommandLine.Option(names = { "--sort" },
+                        description = "Sort by pid, name or age", defaultValue = "pid")
+    String sort;
+
+    @CommandLine.Option(names = { "--last" },
+                        description = "Only output last message")
+    boolean last;
+
+    public ListTrace(CamelJBangMain main) {
+        super(main);
+    }
+
+    @Override
+    public Integer doCall() throws Exception {
+        List<Row> rows = new ArrayList<>();
+
+        List<Long> pids = findPids(name);
+        ProcessHandle.allProcesses()
+                .filter(ph -> pids.contains(ph.pid()))
+                .forEach(ph -> {
+                    JsonObject root = loadStatus(ph.pid());
+                    // there must be a status file for the running Camel integration
+                    if (root != null) {
+                        Row row = new Row();
+                        JsonObject context = (JsonObject) root.get("context");
+                        if (context == null) {
+                            return;
+                        }
+                        row.name = context.getString("name");
+                        if ("CamelJBang".equals(row.name)) {
+                            row.name = ProcessHelper.extractName(root, ph);
+                        }
+                        row.pid = "" + ph.pid();
+                        fetchTraces(row, rows);
+                    }
+                });
+
+        // sort rows
+        rows.sort(this::sortRow);
+
+        if (!rows.isEmpty()) {
+            System.out.println(AsciiTable.getTable(AsciiTable.NO_BORDERS, rows, Arrays.asList(
+                    new Column().header("PID").headerAlign(HorizontalAlign.CENTER).with(r -> r.pid),
+                    new Column().header("NAME").dataAlign(HorizontalAlign.LEFT).maxWidth(30, OverflowBehaviour.ELLIPSIS_RIGHT)
+                            .with(r -> r.name),
+                    new Column().header("UID").headerAlign(HorizontalAlign.CENTER).dataAlign(HorizontalAlign.RIGHT)
+                            .maxWidth(6).with(this::getUid),
+                    new Column().header("ROUTE").dataAlign(HorizontalAlign.LEFT).maxWidth(25, OverflowBehaviour.ELLIPSIS_RIGHT)
+                            .with(r -> r.routeId),
+                    new Column().header("ID").dataAlign(HorizontalAlign.LEFT).maxWidth(25, OverflowBehaviour.ELLIPSIS_RIGHT)
+                            .with(r -> r.nodeId),
+                    new Column().header("AGE").dataAlign(HorizontalAlign.RIGHT).with(this::getTimestamp),
+                    new Column().header("MESSAGE").dataAlign(HorizontalAlign.LEFT).maxWidth(110, OverflowBehaviour.NEWLINE)
+                            .with(this::getMessage))));
+        }
+
+        return 0;
+    }
+
+    private void fetchTraces(Row row, List<Row> rows) {
+        // load trace file if exists
+        JsonObject root = loadTrace(row.pid);
+        String lastId = null;
+        if (root != null) {
+            List<Row> local = new ArrayList<>();
+            JsonArray arr = root.getCollection("traces");
+            if (arr != null) {
+                for (Object o : arr) {
+                    row = row.copy();
+                    JsonObject jo = (JsonObject) o;
+                    row.uid = jo.getLong("uid");
+                    row.routeId = jo.getString("routeId");
+                    row.nodeId = jo.getString("nodeId");
+                    Long ts = jo.getLong("timestamp");
+                    if (ts != null) {
+                        row.timestamp = ts;
+                    }
+                    row.message = jo.getMap("message");
+                    lastId = getExchangeId(row);
+                    local.add(row);
+                }
+            }
+            if (last && lastId != null) {
+                // filter out all that does not match last exchange id
+                final String target = lastId;
+                local.removeIf(r -> !target.equals(getExchangeId(r)));
+            }
+            rows.addAll(local);
+        }
+    }
+
+    private JsonObject loadTrace(String pid) {
+        try {
+            File f = getTraceFile(pid);
+            if (f != null && f.exists()) {
+                FileInputStream fis = new FileInputStream(f);
+                String text = IOHelper.loadText(fis);
+                IOHelper.close(fis);
+                return (JsonObject) Jsoner.deserialize(text);
+            }
+        } catch (Throwable e) {
+            // ignore
+        }
+        return null;
+    }
+
+    private String getTimestamp(Row r) {
+        if (r.timestamp > 0) {
+            return TimeUtils.printSince(r.timestamp);
+        }
+        return "";
+    }
+
+    private String getUid(Row r) {
+        return "" + r.uid;
+    }
+
+    private String getExchangeId(Row r) {
+        return r.message.getString("exchangeId");
+    }
+
+    private String getMessage(Row r) {
+        return r.message.toJson();
+    }
+
+    protected int sortRow(Row o1, Row o2) {
+        String s = sort;
+        int negate = 1;
+        if (s.startsWith("-")) {
+            s = s.substring(1);
+            negate = -1;
+        }
+        switch (s) {
+            case "pid":
+                return Long.compare(Long.parseLong(o1.pid), Long.parseLong(o2.pid)) * negate;
+            case "name":
+                return o1.name.compareToIgnoreCase(o2.name) * negate;
+            case "age":
+                return Long.compare(o1.timestamp, o2.timestamp) * negate;
+            default:
+                return 0;
+        }
+    }
+
+    private static class Row implements Cloneable {
+        String pid;
+        String name;
+        long uid;
+        String routeId;
+        String nodeId;
+        long timestamp;
+        JsonObject message;
+
+        Row copy() {
+            try {
+                return (Row) clone();
+            } catch (CloneNotSupportedException e) {
+                return null;
+            }
+        }
+    }
+
+}


[camel] 07/07: CAMEL-19033: camel-jbang - Add trace command

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit b01c21740980541762d0583901cbef5a837dc29f
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Sat Feb 11 20:15:13 2023 +0100

    CAMEL-19033: camel-jbang - Add trace command
---
 .../org/apache/camel/dsl/jbang/core/commands/process/ListTrace.java     | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListTrace.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListTrace.java
index 3cbcc458431..0fdde579aef 100644
--- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListTrace.java
+++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListTrace.java
@@ -171,7 +171,7 @@ public class ListTrace extends ProcessWatchCommand {
     private String getMessage(Row r) {
         String s = r.message.toJson();
         if (pretty) {
-            s = Jsoner.prettyPrint(s);
+            s = Jsoner.prettyPrint(s, 2);
         }
         return s;
     }


[camel] 03/07: CAMEL-19033: camel-jbang - Add trace command

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 545954770080dd3d706d0b7cdd68babc9bfbd815
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Sat Feb 11 16:11:53 2023 +0100

    CAMEL-19033: camel-jbang - Add trace command
---
 .../camel/impl/engine/CamelInternalProcessor.java  |  4 +-
 .../impl/console/TraceDevConsoleConfigurer.java    | 55 ++++++++++++++++++++++
 .../org.apache.camel.impl.console.TraceConsole     |  2 -
 .../org.apache.camel.impl.console.TraceDevConsole  |  2 +
 .../org/apache/camel/support/MessageHelper.java    | 42 ++++++++++++++++-
 5 files changed, 99 insertions(+), 6 deletions(-)

diff --git a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/CamelInternalProcessor.java b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/CamelInternalProcessor.java
index 358ceaeee5d..0ab81f951f0 100644
--- a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/CamelInternalProcessor.java
+++ b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/CamelInternalProcessor.java
@@ -585,10 +585,10 @@ public class CamelInternalProcessor extends DelegateAsyncProcessor implements In
                 String toNode = processorDefinition.getId();
                 String exchangeId = exchange.getExchangeId();
                 String messageAsXml = MessageHelper.dumpAsXml(exchange.getIn(), true, 4,
-                        backlogTracer.isBodyIncludeStreams(), backlogTracer.isBodyIncludeFiles(),
+                        true, backlogTracer.isBodyIncludeStreams(), backlogTracer.isBodyIncludeFiles(),
                         backlogTracer.getBodyMaxChars());
                 String messageAsJSon = MessageHelper.dumpAsJSon(exchange.getIn(), true, 4,
-                        backlogTracer.isBodyIncludeStreams(), backlogTracer.isBodyIncludeFiles(),
+                        true, backlogTracer.isBodyIncludeStreams(), backlogTracer.isBodyIncludeFiles(),
                         backlogTracer.getBodyMaxChars(), true);
 
                 // if first we should add a pseudo trace message as well, so we have a starting message (eg from the route)
diff --git a/core/camel-console/src/generated/java/org/apache/camel/impl/console/TraceDevConsoleConfigurer.java b/core/camel-console/src/generated/java/org/apache/camel/impl/console/TraceDevConsoleConfigurer.java
new file mode 100644
index 00000000000..7d70d191020
--- /dev/null
+++ b/core/camel-console/src/generated/java/org/apache/camel/impl/console/TraceDevConsoleConfigurer.java
@@ -0,0 +1,55 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.impl.console;
+
+import java.util.Map;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.spi.ExtendedPropertyConfigurerGetter;
+import org.apache.camel.spi.PropertyConfigurerGetter;
+import org.apache.camel.spi.ConfigurerStrategy;
+import org.apache.camel.spi.GeneratedPropertyConfigurer;
+import org.apache.camel.util.CaseInsensitiveMap;
+import org.apache.camel.impl.console.TraceDevConsole;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@SuppressWarnings("unchecked")
+public class TraceDevConsoleConfigurer extends org.apache.camel.support.component.PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter {
+
+    @Override
+    public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) {
+        org.apache.camel.impl.console.TraceDevConsole target = (org.apache.camel.impl.console.TraceDevConsole) obj;
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "camelcontext":
+        case "CamelContext": target.setCamelContext(property(camelContext, org.apache.camel.CamelContext.class, value)); return true;
+        case "capacity":
+        case "Capacity": target.setCapacity(property(camelContext, int.class, value)); return true;
+        default: return false;
+        }
+    }
+
+    @Override
+    public Class<?> getOptionType(String name, boolean ignoreCase) {
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "camelcontext":
+        case "CamelContext": return org.apache.camel.CamelContext.class;
+        case "capacity":
+        case "Capacity": return int.class;
+        default: return null;
+        }
+    }
+
+    @Override
+    public Object getOptionValue(Object obj, String name, boolean ignoreCase) {
+        org.apache.camel.impl.console.TraceDevConsole target = (org.apache.camel.impl.console.TraceDevConsole) obj;
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "camelcontext":
+        case "CamelContext": return target.getCamelContext();
+        case "capacity":
+        case "Capacity": return target.getCapacity();
+        default: return null;
+        }
+    }
+}
+
diff --git a/core/camel-console/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.impl.console.TraceConsole b/core/camel-console/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.impl.console.TraceConsole
deleted file mode 100644
index ec3cab66805..00000000000
--- a/core/camel-console/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.impl.console.TraceConsole
+++ /dev/null
@@ -1,2 +0,0 @@
-# Generated by camel build tools - do NOT edit this file!
-class=org.apache.camel.impl.console.TraceConsoleConfigurer
diff --git a/core/camel-console/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.impl.console.TraceDevConsole b/core/camel-console/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.impl.console.TraceDevConsole
new file mode 100644
index 00000000000..2f166a49f31
--- /dev/null
+++ b/core/camel-console/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.impl.console.TraceDevConsole
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.impl.console.TraceDevConsoleConfigurer
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/MessageHelper.java b/core/camel-support/src/main/java/org/apache/camel/support/MessageHelper.java
index 04789b1d1a6..c27bac39f7e 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/MessageHelper.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/MessageHelper.java
@@ -471,6 +471,25 @@ public final class MessageHelper {
      */
     public static String dumpAsXml(
             Message message, boolean includeBody, int indent, boolean allowStreams, boolean allowFiles, int maxChars) {
+        return dumpAsXml(message, includeBody, indent, allowStreams, allowStreams, allowFiles, maxChars);
+    }
+
+    /**
+     * Dumps the message as a generic XML structure.
+     *
+     * @param  message      the message
+     * @param  includeBody  whether or not to include the message body
+     * @param  indent       number of spaces to indent
+     * @param  allowCachedStreams whether to include message body if they are stream cache based
+     * @param  allowStreams whether to include message body if they are stream based
+     * @param  allowFiles   whether to include message body if they are file based
+     * @param  maxChars     clip body after maximum chars (to avoid very big messages). Use 0 or negative value to not
+     *                      limit at all.
+     * @return              the XML
+     */
+    public static String dumpAsXml(
+            Message message, boolean includeBody, int indent, boolean allowCachedStreams, boolean allowStreams,
+            boolean allowFiles, int maxChars) {
         StringBuilder sb = new StringBuilder();
 
         StringBuilder prefix = new StringBuilder();
@@ -528,7 +547,7 @@ public final class MessageHelper {
             }
             sb.append(">");
 
-            String xml = extractBodyForLogging(message, null, allowStreams, allowFiles, maxChars);
+            String xml = extractBodyForLogging(message, null, allowCachedStreams, allowStreams, allowFiles, maxChars);
             if (xml != null) {
                 // must always xml encode
                 sb.append(StringHelper.xmlEncode(xml));
@@ -784,6 +803,25 @@ public final class MessageHelper {
     public static String dumpAsJSon(
             Message message, boolean includeBody, int indent, boolean allowStreams, boolean allowFiles, int maxChars,
             boolean pretty) {
+        return dumpAsJSon(message, includeBody, indent, false, allowStreams, allowFiles, maxChars, pretty);
+    }
+
+    /**
+     * Dumps the message as a generic JSon structure.
+     *
+     * @param  message      the message
+     * @param  includeBody  whether or not to include the message body
+     * @param  indent       number of spaces to indent
+     * @param  allowCachedStreams whether to include message body if they are stream cached based
+     * @param  allowStreams whether to include message body if they are stream based
+     * @param  allowFiles   whether to include message body if they are file based
+     * @param  maxChars     clip body after maximum chars (to avoid very big messages). Use 0 or negative value to not
+     *                      limit at all.
+     * @return              the JSon
+     */
+    public static String dumpAsJSon(
+            Message message, boolean includeBody, int indent, boolean allowCachedStreams, boolean allowStreams,
+            boolean allowFiles, int maxChars, boolean pretty) {
 
         JsonObject root = new JsonObject();
         JsonObject jo = new JsonObject();
@@ -827,7 +865,7 @@ public final class MessageHelper {
                 jb.put("type", type);
             }
 
-            String data = extractBodyForLogging(message, null, allowStreams, allowFiles, maxChars);
+            String data = extractBodyForLogging(message, null, allowCachedStreams, allowStreams, allowFiles, maxChars);
             if (data != null) {
                 jb.put("value", Jsoner.unescape(data));
             }


[camel] 04/07: Regen for commit 1cd9b91b98f6c092929c7e5bc3c38f010dccae0c

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 1566b3809588c3f6a76be71b3231802da1cfd70c
Author: davsclaus <da...@users.noreply.github.com>
AuthorDate: Sat Feb 11 15:40:23 2023 +0000

    Regen for commit 1cd9b91b98f6c092929c7e5bc3c38f010dccae0c
    
    Signed-off-by: GitHub <no...@github.com>
---
 .../src/main/java/org/apache/camel/impl/console/TraceDevConsole.java    | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/core/camel-console/src/main/java/org/apache/camel/impl/console/TraceDevConsole.java b/core/camel-console/src/main/java/org/apache/camel/impl/console/TraceDevConsole.java
index f1d2ce1d9fe..77dd5f02e40 100644
--- a/core/camel-console/src/main/java/org/apache/camel/impl/console/TraceDevConsole.java
+++ b/core/camel-console/src/main/java/org/apache/camel/impl/console/TraceDevConsole.java
@@ -35,7 +35,7 @@ import org.apache.camel.util.json.JsonObject;
 public class TraceDevConsole extends AbstractDevConsole {
 
     @Metadata(defaultValue = "50",
-            description = "Maximum capacity of last number of messages to capture (capacity must be between 50 and 1000)")
+              description = "Maximum capacity of last number of messages to capture (capacity must be between 50 and 1000)")
     private int capacity = 50;
 
     private Queue<BacklogTracerEventMessage> queue;