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/18 20:59:10 UTC

[camel] branch main updated: camel-core - Backlog tracer to capture message type and shown in camel-jbang trace command.

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

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


The following commit(s) were added to refs/heads/main by this push:
     new 8fbe97f8bbe camel-core - Backlog tracer to capture message type and shown in camel-jbang trace command.
8fbe97f8bbe is described below

commit 8fbe97f8bbe01797c02e625ebf61c8944f9a4488
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Sat Feb 18 21:58:52 2023 +0100

    camel-core - Backlog tracer to capture message type and shown in camel-jbang trace command.
---
 .../org/apache/camel/util/MessageHelperTest.java   |  7 +--
 .../camel/management/BacklogTracerFilterTest.java  |  9 ++--
 .../management/BacklogTracerIdOnAllNodesTest.java  |  6 ++-
 .../camel/management/BacklogTracerPatternTest.java |  6 ++-
 .../management/BacklogTracerStreamCachingTest.java |  3 +-
 .../apache/camel/management/BacklogTracerTest.java | 24 +++++++----
 .../ManagedBrowsableEndpointAsXmlTest.java         | 50 ++++++++++++++--------
 .../org/apache/camel/support/MessageHelper.java    | 13 +++---
 .../core/commands/action/CamelTraceAction.java     | 12 +++---
 9 files changed, 84 insertions(+), 46 deletions(-)

diff --git a/core/camel-core/src/test/java/org/apache/camel/util/MessageHelperTest.java b/core/camel-core/src/test/java/org/apache/camel/util/MessageHelperTest.java
index fa13148bea2..d78db90ec35 100644
--- a/core/camel-core/src/test/java/org/apache/camel/util/MessageHelperTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/util/MessageHelperTest.java
@@ -201,7 +201,8 @@ public class MessageHelperTest {
 
         String out = MessageHelper.dumpAsXml(message, false);
 
-        assertEquals("<message exchangeId=\"" + message.getExchange().getExchangeId() + "\" exchangePattern=\"InOnly\">"
+        assertEquals("<message exchangeId=\"" + message.getExchange().getExchangeId()
+                     + "\" exchangePattern=\"InOnly\" type=\"org.apache.camel.support.DefaultMessage\">"
                      + "\n  <headers>\n    <header key=\"foo\" type=\"java.lang.Integer\">123</header>\n  </headers>\n</message>",
                 out);
 
@@ -221,7 +222,8 @@ public class MessageHelperTest {
 
         String out = MessageHelper.dumpAsXml(message, false, 2);
 
-        assertEquals("  <message exchangeId=\"" + message.getExchange().getExchangeId() + "\" exchangePattern=\"InOut\">"
+        assertEquals("  <message exchangeId=\"" + message.getExchange().getExchangeId()
+                     + "\" exchangePattern=\"InOut\" type=\"org.apache.camel.support.DefaultMessage\">"
                      + "\n    <headers>\n      <header key=\"foo\" type=\"java.lang.Integer\">123</header>\n    </headers>\n  </message>",
                 out);
 
@@ -273,7 +275,6 @@ public class MessageHelperTest {
 
         String out = MessageHelper.dumpAsJSon(message);
         // xml is escaped in json output
-        assertTrue(out.contains("<?xml version=\\\"1.0\\\"?><hi>Hello World<\\/hi>"));
         assertTrue(out.contains(message.getExchange().getExchangeId()), "Should contain exchangeId");
 
         context.stop();
diff --git a/core/camel-management/src/test/java/org/apache/camel/management/BacklogTracerFilterTest.java b/core/camel-management/src/test/java/org/apache/camel/management/BacklogTracerFilterTest.java
index 7e141a3eaf1..6a26f4bdd6f 100644
--- a/core/camel-management/src/test/java/org/apache/camel/management/BacklogTracerFilterTest.java
+++ b/core/camel-management/src/test/java/org/apache/camel/management/BacklogTracerFilterTest.java
@@ -74,7 +74,8 @@ public class BacklogTracerFilterTest extends ManagementTestSupport {
 
         BacklogTracerEventMessage event = events.get(0);
         assertEquals(null, event.getToNode());
-        assertEquals("    <message exchangeId=\"" + exchanges.get(1).getExchangeId() + "\" exchangePattern=\"InOnly\">\n"
+        assertEquals("    <message exchangeId=\"" + exchanges.get(1).getExchangeId()
+                     + "\" exchangePattern=\"InOnly\" type=\"org.apache.camel.support.DefaultMessage\">\n"
                      + "      <headers>\n"
                      + "        <header key=\"foo\" type=\"java.lang.Integer\">123</header>\n"
                      + "      </headers>\n"
@@ -84,7 +85,8 @@ public class BacklogTracerFilterTest extends ManagementTestSupport {
 
         BacklogTracerEventMessage event1 = events.get(1);
         assertEquals("foo", event1.getToNode());
-        assertEquals("    <message exchangeId=\"" + exchanges.get(1).getExchangeId() + "\" exchangePattern=\"InOnly\">\n"
+        assertEquals("    <message exchangeId=\"" + exchanges.get(1).getExchangeId()
+                     + "\" exchangePattern=\"InOnly\" type=\"org.apache.camel.support.DefaultMessage\">\n"
                      + "      <headers>\n"
                      + "        <header key=\"foo\" type=\"java.lang.Integer\">123</header>\n"
                      + "      </headers>\n"
@@ -94,7 +96,8 @@ public class BacklogTracerFilterTest extends ManagementTestSupport {
 
         BacklogTracerEventMessage event2 = events.get(2);
         assertEquals("bar", event2.getToNode());
-        assertEquals("    <message exchangeId=\"" + exchanges.get(1).getExchangeId() + "\" exchangePattern=\"InOnly\">\n"
+        assertEquals("    <message exchangeId=\"" + exchanges.get(1).getExchangeId()
+                     + "\" exchangePattern=\"InOnly\" type=\"org.apache.camel.support.DefaultMessage\">\n"
                      + "      <headers>\n"
                      + "        <header key=\"foo\" type=\"java.lang.Integer\">123</header>\n"
                      + "      </headers>\n"
diff --git a/core/camel-management/src/test/java/org/apache/camel/management/BacklogTracerIdOnAllNodesTest.java b/core/camel-management/src/test/java/org/apache/camel/management/BacklogTracerIdOnAllNodesTest.java
index 91cf01c77a8..c3915532c94 100644
--- a/core/camel-management/src/test/java/org/apache/camel/management/BacklogTracerIdOnAllNodesTest.java
+++ b/core/camel-management/src/test/java/org/apache/camel/management/BacklogTracerIdOnAllNodesTest.java
@@ -112,7 +112,8 @@ public class BacklogTracerIdOnAllNodesTest extends ManagementTestSupport {
 
         BacklogTracerEventMessage event1 = events.get(0);
         assertEquals(to2.getId(), event1.getToNode());
-        assertEquals("    <message exchangeId=\"" + fooExchanges.get(0).getExchangeId() + "\" exchangePattern=\"InOnly\">\n"
+        assertEquals("    <message exchangeId=\"" + fooExchanges.get(0).getExchangeId()
+                     + "\" exchangePattern=\"InOnly\" type=\"org.apache.camel.support.DefaultMessage\">\n"
                      + "      <body type=\"java.lang.String\">Hello World</body>\n"
                      + "    </message>",
                 event1.getMessageAsXml());
@@ -125,7 +126,8 @@ public class BacklogTracerIdOnAllNodesTest extends ManagementTestSupport {
 
         event1 = events.get(0);
         assertEquals("camel", event1.getToNode());
-        assertEquals("    <message exchangeId=\"" + camelExchanges.get(0).getExchangeId() + "\" exchangePattern=\"InOnly\">\n"
+        assertEquals("    <message exchangeId=\"" + camelExchanges.get(0).getExchangeId()
+                     + "\" exchangePattern=\"InOnly\" type=\"org.apache.camel.support.DefaultMessage\">\n"
                      + "      <body type=\"java.lang.String\">Hello Camel</body>\n"
                      + "    </message>",
                 event1.getMessageAsXml());
diff --git a/core/camel-management/src/test/java/org/apache/camel/management/BacklogTracerPatternTest.java b/core/camel-management/src/test/java/org/apache/camel/management/BacklogTracerPatternTest.java
index 1d3e6b95f1c..2317cd8bfd5 100644
--- a/core/camel-management/src/test/java/org/apache/camel/management/BacklogTracerPatternTest.java
+++ b/core/camel-management/src/test/java/org/apache/camel/management/BacklogTracerPatternTest.java
@@ -74,14 +74,16 @@ public class BacklogTracerPatternTest extends ManagementTestSupport {
 
         BacklogTracerEventMessage event1 = events.get(0);
         assertEquals("foo", event1.getToNode());
-        assertEquals("    <message exchangeId=\"" + exchanges.get(0).getExchangeId() + "\" exchangePattern=\"InOnly\">\n"
+        assertEquals("    <message exchangeId=\"" + exchanges.get(0).getExchangeId()
+                     + "\" exchangePattern=\"InOnly\" type=\"org.apache.camel.support.DefaultMessage\">\n"
                      + "      <body type=\"java.lang.String\">Hello World</body>\n"
                      + "    </message>",
                 event1.getMessageAsXml());
 
         BacklogTracerEventMessage event2 = events.get(1);
         assertEquals("foo", event2.getToNode());
-        assertEquals("    <message exchangeId=\"" + exchanges.get(1).getExchangeId() + "\" exchangePattern=\"InOnly\">\n"
+        assertEquals("    <message exchangeId=\"" + exchanges.get(1).getExchangeId()
+                     + "\" exchangePattern=\"InOnly\" type=\"org.apache.camel.support.DefaultMessage\">\n"
                      + "      <body type=\"java.lang.String\">Bye World</body>\n"
                      + "    </message>",
                 event2.getMessageAsXml());
diff --git a/core/camel-management/src/test/java/org/apache/camel/management/BacklogTracerStreamCachingTest.java b/core/camel-management/src/test/java/org/apache/camel/management/BacklogTracerStreamCachingTest.java
index b8cf3240ab7..054d9fd25ad 100644
--- a/core/camel-management/src/test/java/org/apache/camel/management/BacklogTracerStreamCachingTest.java
+++ b/core/camel-management/src/test/java/org/apache/camel/management/BacklogTracerStreamCachingTest.java
@@ -77,7 +77,8 @@ public class BacklogTracerStreamCachingTest extends ManagementTestSupport {
 
         BacklogTracerEventMessage event1 = events.get(0);
         assertEquals("bar", event1.getToNode());
-        assertEquals("    <message exchangeId=\"" + exchanges.get(0).getExchangeId() + "\" exchangePattern=\"InOnly\">\n"
+        assertEquals("    <message exchangeId=\"" + exchanges.get(0).getExchangeId()
+                     + "\" exchangePattern=\"InOnly\" type=\"org.apache.camel.support.DefaultMessage\">\n"
                      + "      <body type=\"org.apache.camel.converter.stream.ByteArrayInputStreamCache\">Bye World</body>\n"
                      + "    </message>",
                 event1.getMessageAsXml());
diff --git a/core/camel-management/src/test/java/org/apache/camel/management/BacklogTracerTest.java b/core/camel-management/src/test/java/org/apache/camel/management/BacklogTracerTest.java
index 5fb94f7f15d..e66d3be2d59 100644
--- a/core/camel-management/src/test/java/org/apache/camel/management/BacklogTracerTest.java
+++ b/core/camel-management/src/test/java/org/apache/camel/management/BacklogTracerTest.java
@@ -75,14 +75,16 @@ public class BacklogTracerTest extends ManagementTestSupport {
 
         BacklogTracerEventMessage event1 = events.get(0);
         assertEquals("foo", event1.getToNode());
-        assertEquals("    <message exchangeId=\"" + exchanges.get(0).getExchangeId() + "\" exchangePattern=\"InOnly\">\n"
+        assertEquals("    <message exchangeId=\"" + exchanges.get(0).getExchangeId()
+                     + "\" exchangePattern=\"InOnly\" type=\"org.apache.camel.support.DefaultMessage\">\n"
                      + "      <body type=\"java.lang.String\">Hello World</body>\n"
                      + "    </message>",
                 event1.getMessageAsXml());
 
         BacklogTracerEventMessage event2 = events.get(1);
         assertEquals("foo", event2.getToNode());
-        assertEquals("    <message exchangeId=\"" + exchanges.get(1).getExchangeId() + "\" exchangePattern=\"InOnly\">\n"
+        assertEquals("    <message exchangeId=\"" + exchanges.get(1).getExchangeId()
+                     + "\" exchangePattern=\"InOnly\" type=\"org.apache.camel.support.DefaultMessage\">\n"
                      + "      <body type=\"java.lang.String\">Bye World</body>\n"
                      + "    </message>",
                 event2.getMessageAsXml());
@@ -160,7 +162,8 @@ public class BacklogTracerTest extends ManagementTestSupport {
         BacklogTracerEventMessage event0 = events.get(0);
         assertEquals("route1", event0.getRouteId());
         assertEquals(null, event0.getToNode());
-        assertEquals("    <message exchangeId=\"" + fooExchanges.get(0).getExchangeId() + "\" exchangePattern=\"InOnly\">\n"
+        assertEquals("    <message exchangeId=\"" + fooExchanges.get(0).getExchangeId()
+                     + "\" exchangePattern=\"InOnly\" type=\"org.apache.camel.support.DefaultMessage\">\n"
                      + "      <body type=\"java.lang.String\">Hello World</body>\n"
                      + "    </message>",
                 event0.getMessageAsXml());
@@ -168,7 +171,8 @@ public class BacklogTracerTest extends ManagementTestSupport {
         BacklogTracerEventMessage event1 = events.get(1);
         assertEquals("route1", event1.getRouteId());
         assertEquals("foo", event1.getToNode());
-        assertEquals("    <message exchangeId=\"" + fooExchanges.get(0).getExchangeId() + "\" exchangePattern=\"InOnly\">\n"
+        assertEquals("    <message exchangeId=\"" + fooExchanges.get(0).getExchangeId()
+                     + "\" exchangePattern=\"InOnly\" type=\"org.apache.camel.support.DefaultMessage\">\n"
                      + "      <body type=\"java.lang.String\">Hello World</body>\n"
                      + "    </message>",
                 event1.getMessageAsXml());
@@ -176,7 +180,8 @@ public class BacklogTracerTest extends ManagementTestSupport {
         BacklogTracerEventMessage event2 = events.get(2);
         assertEquals("route1", event2.getRouteId());
         assertEquals("bar", event2.getToNode());
-        assertEquals("    <message exchangeId=\"" + barExchanges.get(0).getExchangeId() + "\" exchangePattern=\"InOnly\">\n"
+        assertEquals("    <message exchangeId=\"" + barExchanges.get(0).getExchangeId()
+                     + "\" exchangePattern=\"InOnly\" type=\"org.apache.camel.support.DefaultMessage\">\n"
                      + "      <body type=\"java.lang.String\">Hello World</body>\n"
                      + "    </message>",
                 event2.getMessageAsXml());
@@ -184,7 +189,8 @@ public class BacklogTracerTest extends ManagementTestSupport {
         BacklogTracerEventMessage event3 = events.get(4);
         assertEquals("route1", event3.getRouteId());
         assertEquals(null, event3.getToNode());
-        assertEquals("    <message exchangeId=\"" + fooExchanges.get(1).getExchangeId() + "\" exchangePattern=\"InOnly\">\n"
+        assertEquals("    <message exchangeId=\"" + fooExchanges.get(1).getExchangeId()
+                     + "\" exchangePattern=\"InOnly\" type=\"org.apache.camel.support.DefaultMessage\">\n"
                      + "      <body type=\"java.lang.String\">Bye World</body>\n"
                      + "    </message>",
                 event3.getMessageAsXml());
@@ -192,7 +198,8 @@ public class BacklogTracerTest extends ManagementTestSupport {
         BacklogTracerEventMessage event4 = events.get(5);
         assertEquals("route1", event4.getRouteId());
         assertEquals("foo", event4.getToNode());
-        assertEquals("    <message exchangeId=\"" + fooExchanges.get(1).getExchangeId() + "\" exchangePattern=\"InOnly\">\n"
+        assertEquals("    <message exchangeId=\"" + fooExchanges.get(1).getExchangeId()
+                     + "\" exchangePattern=\"InOnly\" type=\"org.apache.camel.support.DefaultMessage\">\n"
                      + "      <body type=\"java.lang.String\">Bye World</body>\n"
                      + "    </message>",
                 event3.getMessageAsXml());
@@ -200,7 +207,8 @@ public class BacklogTracerTest extends ManagementTestSupport {
         BacklogTracerEventMessage event5 = events.get(6);
         assertEquals("route1", event5.getRouteId());
         assertEquals("bar", event5.getToNode());
-        assertEquals("    <message exchangeId=\"" + barExchanges.get(1).getExchangeId() + "\" exchangePattern=\"InOnly\">\n"
+        assertEquals("    <message exchangeId=\"" + barExchanges.get(1).getExchangeId()
+                     + "\" exchangePattern=\"InOnly\" type=\"org.apache.camel.support.DefaultMessage\">\n"
                      + "      <body type=\"java.lang.String\">Bye World</body>\n"
                      + "    </message>",
                 event4.getMessageAsXml());
diff --git a/core/camel-management/src/test/java/org/apache/camel/management/ManagedBrowsableEndpointAsXmlTest.java b/core/camel-management/src/test/java/org/apache/camel/management/ManagedBrowsableEndpointAsXmlTest.java
index f1f21a9f21d..16cb16293b6 100644
--- a/core/camel-management/src/test/java/org/apache/camel/management/ManagedBrowsableEndpointAsXmlTest.java
+++ b/core/camel-management/src/test/java/org/apache/camel/management/ManagedBrowsableEndpointAsXmlTest.java
@@ -66,7 +66,8 @@ public class ManagedBrowsableEndpointAsXmlTest extends ManagementTestSupport {
         assertNotNull(out);
         log.info(out);
 
-        assertEquals("<message exchangeId=\"" + exchanges.get(0).getExchangeId() + "\" exchangePattern=\"InOnly\""
+        assertEquals("<message exchangeId=\"" + exchanges.get(0).getExchangeId()
+                     + "\" exchangePattern=\"InOnly\" type=\"org.apache.camel.support.DefaultMessage\""
                      + ">\n  <body type=\"java.lang.String\">&lt;foo&gt;Camel &amp;gt; Donkey&lt;/foo&gt;</body>\n</message>",
                 out);
 
@@ -74,7 +75,8 @@ public class ManagedBrowsableEndpointAsXmlTest extends ManagementTestSupport {
                 new String[] { "java.lang.Integer", "java.lang.Boolean" });
         assertNotNull(out);
         log.info(out);
-        assertEquals("<message exchangeId=\"" + exchanges.get(1).getExchangeId() + "\" exchangePattern=\"InOnly\""
+        assertEquals("<message exchangeId=\"" + exchanges.get(1).getExchangeId()
+                     + "\" exchangePattern=\"InOnly\" type=\"org.apache.camel.support.DefaultMessage\""
                      + ">\n  <body type=\"java.lang.String\">Camel &gt; Donkey</body>\n</message>",
                 out);
 
@@ -82,7 +84,8 @@ public class ManagedBrowsableEndpointAsXmlTest extends ManagementTestSupport {
                 new String[] { "java.lang.Integer", "java.lang.Boolean" });
         assertNotNull(out);
         log.info(out);
-        assertEquals("<message exchangeId=\"" + exchanges.get(2).getExchangeId() + "\" exchangePattern=\"InOnly\""
+        assertEquals("<message exchangeId=\"" + exchanges.get(2).getExchangeId()
+                     + "\" exchangePattern=\"InOnly\" type=\"org.apache.camel.support.DefaultMessage\""
                      + ">\n  <headers>\n    <header key=\"name\" type=\"java.lang.String\">Me &amp; You</header>\n  </headers>\n"
                      + "  <body type=\"java.lang.String\">&lt;foo&gt;Camel &amp;gt; Donkey&lt;/foo&gt;</body>\n</message>",
                 out);
@@ -92,7 +95,8 @@ public class ManagedBrowsableEndpointAsXmlTest extends ManagementTestSupport {
         assertNotNull(out);
         log.info(out);
         assertEquals(
-                "<message exchangeId=\"" + exchanges.get(3).getExchangeId() + "\" exchangePattern=\"InOnly\">\n  <headers>\n"
+                "<message exchangeId=\"" + exchanges.get(3).getExchangeId()
+                     + "\" exchangePattern=\"InOnly\" type=\"org.apache.camel.support.DefaultMessage\">\n  <headers>\n"
                      + "    <header key=\"title\" type=\"java.lang.String\">&lt;title&gt;Me &amp;amp; You&lt;/title&gt;</header>\n  </headers>\n"
                      + "  <body type=\"java.lang.String\">&lt;foo&gt;Camel &amp;gt; Donkey&lt;/foo&gt;</body>\n</message>",
                 out);
@@ -101,7 +105,8 @@ public class ManagedBrowsableEndpointAsXmlTest extends ManagementTestSupport {
                 new String[] { "java.lang.Integer", "java.lang.Boolean" });
         assertNotNull(out);
         log.info(out);
-        assertEquals("<message exchangeId=\"" + exchanges.get(4).getExchangeId() + "\" exchangePattern=\"InOnly\""
+        assertEquals("<message exchangeId=\"" + exchanges.get(4).getExchangeId()
+                     + "\" exchangePattern=\"InOnly\" type=\"org.apache.camel.support.DefaultMessage\""
                      + ">\n  <headers>\n    <header key=\"name\" type=\"java.lang.String\">Me &amp; You</header>\n  </headers>\n"
                      + "  <body type=\"java.lang.String\">Camel &gt; Donkey</body>\n</message>",
                 out);
@@ -110,7 +115,8 @@ public class ManagedBrowsableEndpointAsXmlTest extends ManagementTestSupport {
                 new String[] { "java.lang.Integer", "java.lang.Boolean" });
         assertNotNull(out);
         log.info(out);
-        assertEquals("<message exchangeId=\"" + exchanges.get(5).getExchangeId() + "\" exchangePattern=\"InOnly\""
+        assertEquals("<message exchangeId=\"" + exchanges.get(5).getExchangeId()
+                     + "\" exchangePattern=\"InOnly\" type=\"org.apache.camel.support.DefaultMessage\""
                      + ">\n  <headers>\n    <header key=\"user\" type=\"java.lang.Boolean\">true</header>\n  </headers>\n"
                      + "  <body type=\"java.lang.Integer\">123</body>\n</message>",
                 out);
@@ -119,7 +125,8 @@ public class ManagedBrowsableEndpointAsXmlTest extends ManagementTestSupport {
                 new String[] { "java.lang.Integer", "java.lang.Boolean" });
         assertNotNull(out);
         log.info(out);
-        assertEquals("<message exchangeId=\"" + exchanges.get(6).getExchangeId() + "\" exchangePattern=\"InOnly\""
+        assertEquals("<message exchangeId=\"" + exchanges.get(6).getExchangeId()
+                     + "\" exchangePattern=\"InOnly\" type=\"org.apache.camel.support.DefaultMessage\""
                      + ">\n  <headers>\n    <header key=\"title\" type=\"java.lang.String\">Camel rocks</header>\n"
                      + "    <header key=\"uid\" type=\"java.lang.Integer\">123</header>\n"
                      + "    <header key=\"user\" type=\"java.lang.Boolean\">false</header>\n  </headers>\n"
@@ -147,7 +154,8 @@ public class ManagedBrowsableEndpointAsXmlTest extends ManagementTestSupport {
         assertNotNull(out);
         log.info(out);
 
-        assertEquals("<message exchangeId=\"" + exchanges.get(0).getExchangeId() + "\" exchangePattern=\"InOnly\""
+        assertEquals("<message exchangeId=\"" + exchanges.get(0).getExchangeId()
+                     + "\" exchangePattern=\"InOnly\" type=\"org.apache.camel.support.DefaultMessage\""
                      + ">\n  <headers>\n    <header key=\"foo\" type=\"java.lang.Integer\">123</header>\n  </headers>\n</message>",
                 out);
 
@@ -155,7 +163,8 @@ public class ManagedBrowsableEndpointAsXmlTest extends ManagementTestSupport {
                 new String[] { "java.lang.Integer", "java.lang.Boolean" });
         assertNotNull(out);
         log.info(out);
-        assertEquals("<message exchangeId=\"" + exchanges.get(1).getExchangeId() + "\" exchangePattern=\"InOnly\""
+        assertEquals("<message exchangeId=\"" + exchanges.get(1).getExchangeId()
+                     + "\" exchangePattern=\"InOnly\" type=\"org.apache.camel.support.DefaultMessage\""
                      + ">\n  <headers>\n    <header key=\"foo\" type=\"java.lang.Integer\">456</header>\n  </headers>\n</message>",
                 out);
     }
@@ -180,9 +189,11 @@ public class ManagedBrowsableEndpointAsXmlTest extends ManagementTestSupport {
         assertNotNull(out);
         log.info(out);
 
-        assertEquals("<messages>\n<message exchangeId=\"" + exchanges.get(0).getExchangeId() + "\" exchangePattern=\"InOnly\""
+        assertEquals("<messages>\n<message exchangeId=\"" + exchanges.get(0).getExchangeId()
+                     + "\" exchangePattern=\"InOnly\" type=\"org.apache.camel.support.DefaultMessage\""
                      + ">\n  <body type=\"java.lang.String\">Hello World</body>\n</message>\n"
-                     + "<message exchangeId=\"" + exchanges.get(1).getExchangeId() + "\" exchangePattern=\"InOnly\""
+                     + "<message exchangeId=\"" + exchanges.get(1).getExchangeId()
+                     + "\" exchangePattern=\"InOnly\" type=\"org.apache.camel.support.DefaultMessage\""
                      + ">\n  <headers>\n    <header key=\"foo\" type=\"java.lang.Integer\">456</header>\n  </headers>\n"
                      + "  <body type=\"java.lang.String\">Bye World</body>\n</message>\n</messages>",
                 out);
@@ -209,9 +220,10 @@ public class ManagedBrowsableEndpointAsXmlTest extends ManagementTestSupport {
         log.info(out);
 
         assertEquals("<messages>\n<message exchangeId=\"" + exchanges.get(0).getExchangeId()
-                     + "\" exchangePattern=\"InOnly\">\n  <headers>\n"
+                     + "\" exchangePattern=\"InOnly\" type=\"org.apache.camel.support.DefaultMessage\">\n  <headers>\n"
                      + "    <header key=\"foo\" type=\"java.lang.Integer\">123</header>\n  </headers>\n</message>\n"
-                     + "<message exchangeId=\"" + exchanges.get(1).getExchangeId() + "\" exchangePattern=\"InOnly\""
+                     + "<message exchangeId=\"" + exchanges.get(1).getExchangeId()
+                     + "\" exchangePattern=\"InOnly\" type=\"org.apache.camel.support.DefaultMessage\""
                      + ">\n  <headers>\n    <header key=\"foo\" type=\"java.lang.Integer\">456</header>\n  </headers>\n"
                      + "</message>\n</messages>",
                 out);
@@ -238,9 +250,11 @@ public class ManagedBrowsableEndpointAsXmlTest extends ManagementTestSupport {
         assertNotNull(out);
         log.info(out);
 
-        assertEquals("<messages>\n<message exchangeId=\"" + exchanges.get(0).getExchangeId() + "\" exchangePattern=\"InOnly\""
+        assertEquals("<messages>\n<message exchangeId=\"" + exchanges.get(0).getExchangeId()
+                     + "\" exchangePattern=\"InOnly\" type=\"org.apache.camel.support.DefaultMessage\""
                      + ">\n  <body type=\"java.lang.String\">Hello World</body>\n</message>\n"
-                     + "<message exchangeId=\"" + exchanges.get(1).getExchangeId() + "\" exchangePattern=\"InOnly\""
+                     + "<message exchangeId=\"" + exchanges.get(1).getExchangeId()
+                     + "\" exchangePattern=\"InOnly\" type=\"org.apache.camel.support.DefaultMessage\""
                      + ">\n  <headers>\n    <header key=\"foo\" type=\"java.lang.Integer\">456</header>\n  </headers>\n"
                      + "  <body type=\"java.lang.String\">Bye World</body>\n</message>\n</messages>",
                 out);
@@ -267,9 +281,11 @@ public class ManagedBrowsableEndpointAsXmlTest extends ManagementTestSupport {
         assertNotNull(out);
         log.info(out);
 
-        assertEquals("<messages>\n<message exchangeId=\"" + exchanges.get(0).getExchangeId() + "\" exchangePattern=\"InOnly\""
+        assertEquals("<messages>\n<message exchangeId=\"" + exchanges.get(0).getExchangeId()
+                     + "\" exchangePattern=\"InOnly\" type=\"org.apache.camel.support.DefaultMessage\""
                      + ">\n  <headers>\n    <header key=\"foo\" type=\"java.lang.Integer\">123</header>\n  </headers>\n</message>\n"
-                     + "<message exchangeId=\"" + exchanges.get(1).getExchangeId() + "\" exchangePattern=\"InOnly\""
+                     + "<message exchangeId=\"" + exchanges.get(1).getExchangeId()
+                     + "\" exchangePattern=\"InOnly\" type=\"org.apache.camel.support.DefaultMessage\""
                      + ">\n  <headers>\n    <header key=\"foo\" type=\"java.lang.Integer\">456</header>\n  </headers>\n"
                      + "</message>\n</messages>",
                 out);
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 d949abfee07..da71ef2e4c3 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
@@ -499,10 +499,12 @@ public final class MessageHelper {
             prefix.append(" ");
         }
 
-        // include exchangeId/exchangePattern as attribute on the <message> tag
+        // include exchangeId/exchangePattern/type as attribute on the <message> tag
         sb.append(prefix);
+        String type = ObjectHelper.classCanonicalName(message);
         sb.append("<message exchangeId=\"").append(message.getExchange().getExchangeId())
-                .append("\" exchangePattern=\"").append(message.getExchange().getPattern().name()).append("\">\n");
+                .append("\" exchangePattern=\"").append(message.getExchange().getPattern().name())
+                .append("\" type=\"").append(type).append("\">\n");
 
         // exchange properties
         if (includeExchangeProperties && message.getExchange().hasProperties()) {
@@ -512,7 +514,7 @@ public final class MessageHelper {
             Map<String, Object> properties = new TreeMap<>(message.getExchange().getProperties());
             for (Map.Entry<String, Object> entry : properties.entrySet()) {
                 Object value = entry.getValue();
-                String type = ObjectHelper.classCanonicalName(value);
+                type = ObjectHelper.classCanonicalName(value);
                 sb.append(prefix);
                 sb.append("    <exchangeProperty key=\"").append(entry.getKey()).append("\"");
                 if (type != null) {
@@ -548,7 +550,7 @@ public final class MessageHelper {
             Map<String, Object> headers = new TreeMap<>(message.getHeaders());
             for (Map.Entry<String, Object> entry : headers.entrySet()) {
                 Object value = entry.getValue();
-                String type = ObjectHelper.classCanonicalName(value);
+                type = ObjectHelper.classCanonicalName(value);
                 sb.append(prefix);
                 sb.append("    <header key=\"").append(entry.getKey()).append("\"");
                 if (type != null) {
@@ -579,7 +581,7 @@ public final class MessageHelper {
         if (includeBody) {
             sb.append(prefix);
             sb.append("  <body");
-            String type = ObjectHelper.classCanonicalName(message.getBody());
+            type = ObjectHelper.classCanonicalName(message.getBody());
             if (type != null) {
                 sb.append(" type=\"").append(type).append("\"");
             }
@@ -868,6 +870,7 @@ public final class MessageHelper {
         root.put("message", jo);
         jo.put("exchangeId", message.getExchange().getExchangeId());
         jo.put("exchangePattern", message.getExchange().getPattern().name());
+        jo.put("type", ObjectHelper.classCanonicalName(message));
 
         // exchange properties
         if (includeExchangeProperties && message.getExchange().hasProperties()) {
diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelTraceAction.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelTraceAction.java
index 66b63166117..b66bc478611 100644
--- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelTraceAction.java
+++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelTraceAction.java
@@ -705,7 +705,7 @@ public class CamelTraceAction extends ActionBaseCommand {
         // properties and headers
         String tab1 = AsciiTable.getTable(AsciiTable.NO_BORDERS, rows, Arrays.asList(
                 new Column().dataAlign(HorizontalAlign.LEFT)
-                        .minWidth(showExchangeProperties ? 10 : 8).with(TableRow::kindAsString),
+                        .minWidth(showExchangeProperties ? 11 : 9).with(TableRow::kindAsString),
                 new Column().dataAlign(HorizontalAlign.LEFT)
                         .maxWidth(40, OverflowBehaviour.ELLIPSIS_LEFT).with(TableRow::typeAsString),
                 new Column().dataAlign(HorizontalAlign.RIGHT)
@@ -714,11 +714,13 @@ public class CamelTraceAction extends ActionBaseCommand {
                         .maxWidth(80, OverflowBehaviour.NEWLINE).with(TableRow::valueAsString)));
 
         // body and type
-        JsonObject jo = r.message.getMap("body");
+        JsonObject jo = r.message;
+        TableRow msgRow = new TableRow("Message", jo.getString("type"), null, null);
+        jo = r.message.getMap("body");
         TableRow bodyRow = new TableRow("Body", jo.getString("type"), null, jo.get("value"));
-        String tab2 = AsciiTable.getTable(AsciiTable.NO_BORDERS, List.of(bodyRow), Arrays.asList(
+        String tab2 = AsciiTable.getTable(AsciiTable.NO_BORDERS, List.of(msgRow, bodyRow), Arrays.asList(
                 new Column().dataAlign(HorizontalAlign.LEFT)
-                        .minWidth(showExchangeProperties ? 10 : 8).with(t -> "Body"),
+                        .minWidth(showExchangeProperties ? 11 : 9).with(TableRow::kindAsString),
                 new Column().dataAlign(HorizontalAlign.LEFT).with(TableRow::typeAndLengthAsString)));
         // body value only (span)
         String tab3 = null;
@@ -733,7 +735,7 @@ public class CamelTraceAction extends ActionBaseCommand {
             TableRow eRow = new TableRow("Exception", jo.getString("type"), null, jo.get("message"));
             tab4 = AsciiTable.getTable(AsciiTable.NO_BORDERS, List.of(eRow), Arrays.asList(
                     new Column().dataAlign(HorizontalAlign.LEFT)
-                            .minWidth(showExchangeProperties ? 10 : 8).with(TableRow::kindAsStringRed),
+                            .minWidth(showExchangeProperties ? 11 : 9).with(TableRow::kindAsStringRed),
                     new Column().dataAlign(HorizontalAlign.LEFT)
                             .maxWidth(40, OverflowBehaviour.ELLIPSIS_LEFT).with(TableRow::typeAsString),
                     new Column().dataAlign(HorizontalAlign.LEFT)