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 21:41:01 UTC

[camel] branch main updated: camel trace to show type of exchange and message class so users better understand the structure of envelope in Camel.

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 8fd9267e359 camel trace to show type of exchange and message class so users better understand the structure of envelope in Camel.
8fd9267e359 is described below

commit 8fd9267e3599a4ec8b4512c2b5b24ae420816403
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Sat Feb 18 22:38:33 2023 +0100

    camel trace to show type of exchange and message class so users better understand the structure of envelope in Camel.
---
 .../org/apache/camel/util/MessageHelperTest.java   |  4 +-
 .../camel/management/BacklogTracerFilterTest.java  |  6 +-
 .../management/BacklogTracerIdOnAllNodesTest.java  |  4 +-
 .../camel/management/BacklogTracerPatternTest.java |  4 +-
 .../management/BacklogTracerStreamCachingTest.java |  2 +-
 .../apache/camel/management/BacklogTracerTest.java | 16 ++---
 .../ManagedBrowsableEndpointAsXmlTest.java         | 34 ++++-----
 .../org/apache/camel/support/MessageHelper.java    | 15 ++--
 .../core/commands/action/CamelTraceAction.java     | 84 +++++++++++++++-------
 9 files changed, 104 insertions(+), 65 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 d78db90ec35..ab9947c9220 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
@@ -202,7 +202,7 @@ public class MessageHelperTest {
         String out = MessageHelper.dumpAsXml(message, false);
 
         assertEquals("<message exchangeId=\"" + message.getExchange().getExchangeId()
-                     + "\" exchangePattern=\"InOnly\" type=\"org.apache.camel.support.DefaultMessage\">"
+                     + "\" exchangePattern=\"InOnly\" exchangeType=\"org.apache.camel.support.DefaultExchange\" messageType=\"org.apache.camel.support.DefaultMessage\">"
                      + "\n  <headers>\n    <header key=\"foo\" type=\"java.lang.Integer\">123</header>\n  </headers>\n</message>",
                 out);
 
@@ -223,7 +223,7 @@ public class MessageHelperTest {
         String out = MessageHelper.dumpAsXml(message, false, 2);
 
         assertEquals("  <message exchangeId=\"" + message.getExchange().getExchangeId()
-                     + "\" exchangePattern=\"InOut\" type=\"org.apache.camel.support.DefaultMessage\">"
+                     + "\" exchangePattern=\"InOut\" exchangeType=\"org.apache.camel.support.DefaultExchange\" messageType=\"org.apache.camel.support.DefaultMessage\">"
                      + "\n    <headers>\n      <header key=\"foo\" type=\"java.lang.Integer\">123</header>\n    </headers>\n  </message>",
                 out);
 
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 6a26f4bdd6f..120ccf41829 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
@@ -75,7 +75,7 @@ public class BacklogTracerFilterTest extends ManagementTestSupport {
         BacklogTracerEventMessage event = events.get(0);
         assertEquals(null, event.getToNode());
         assertEquals("    <message exchangeId=\"" + exchanges.get(1).getExchangeId()
-                     + "\" exchangePattern=\"InOnly\" type=\"org.apache.camel.support.DefaultMessage\">\n"
+                     + "\" exchangePattern=\"InOnly\" exchangeType=\"org.apache.camel.support.DefaultExchange\" messageType=\"org.apache.camel.support.DefaultMessage\">\n"
                      + "      <headers>\n"
                      + "        <header key=\"foo\" type=\"java.lang.Integer\">123</header>\n"
                      + "      </headers>\n"
@@ -86,7 +86,7 @@ public class BacklogTracerFilterTest extends ManagementTestSupport {
         BacklogTracerEventMessage event1 = events.get(1);
         assertEquals("foo", event1.getToNode());
         assertEquals("    <message exchangeId=\"" + exchanges.get(1).getExchangeId()
-                     + "\" exchangePattern=\"InOnly\" type=\"org.apache.camel.support.DefaultMessage\">\n"
+                     + "\" exchangePattern=\"InOnly\" exchangeType=\"org.apache.camel.support.DefaultExchange\" messageType=\"org.apache.camel.support.DefaultMessage\">\n"
                      + "      <headers>\n"
                      + "        <header key=\"foo\" type=\"java.lang.Integer\">123</header>\n"
                      + "      </headers>\n"
@@ -97,7 +97,7 @@ public class BacklogTracerFilterTest extends ManagementTestSupport {
         BacklogTracerEventMessage event2 = events.get(2);
         assertEquals("bar", event2.getToNode());
         assertEquals("    <message exchangeId=\"" + exchanges.get(1).getExchangeId()
-                     + "\" exchangePattern=\"InOnly\" type=\"org.apache.camel.support.DefaultMessage\">\n"
+                     + "\" exchangePattern=\"InOnly\" exchangeType=\"org.apache.camel.support.DefaultExchange\" messageType=\"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 c3915532c94..45886323e3f 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
@@ -113,7 +113,7 @@ public class BacklogTracerIdOnAllNodesTest extends ManagementTestSupport {
         BacklogTracerEventMessage event1 = events.get(0);
         assertEquals(to2.getId(), event1.getToNode());
         assertEquals("    <message exchangeId=\"" + fooExchanges.get(0).getExchangeId()
-                     + "\" exchangePattern=\"InOnly\" type=\"org.apache.camel.support.DefaultMessage\">\n"
+                     + "\" exchangePattern=\"InOnly\" exchangeType=\"org.apache.camel.support.DefaultExchange\" messageType=\"org.apache.camel.support.DefaultMessage\">\n"
                      + "      <body type=\"java.lang.String\">Hello World</body>\n"
                      + "    </message>",
                 event1.getMessageAsXml());
@@ -127,7 +127,7 @@ public class BacklogTracerIdOnAllNodesTest extends ManagementTestSupport {
         event1 = events.get(0);
         assertEquals("camel", event1.getToNode());
         assertEquals("    <message exchangeId=\"" + camelExchanges.get(0).getExchangeId()
-                     + "\" exchangePattern=\"InOnly\" type=\"org.apache.camel.support.DefaultMessage\">\n"
+                     + "\" exchangePattern=\"InOnly\" exchangeType=\"org.apache.camel.support.DefaultExchange\" messageType=\"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 2317cd8bfd5..988bb4f6425 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
@@ -75,7 +75,7 @@ public class BacklogTracerPatternTest extends ManagementTestSupport {
         BacklogTracerEventMessage event1 = events.get(0);
         assertEquals("foo", event1.getToNode());
         assertEquals("    <message exchangeId=\"" + exchanges.get(0).getExchangeId()
-                     + "\" exchangePattern=\"InOnly\" type=\"org.apache.camel.support.DefaultMessage\">\n"
+                     + "\" exchangePattern=\"InOnly\" exchangeType=\"org.apache.camel.support.DefaultExchange\" messageType=\"org.apache.camel.support.DefaultMessage\">\n"
                      + "      <body type=\"java.lang.String\">Hello World</body>\n"
                      + "    </message>",
                 event1.getMessageAsXml());
@@ -83,7 +83,7 @@ public class BacklogTracerPatternTest extends ManagementTestSupport {
         BacklogTracerEventMessage event2 = events.get(1);
         assertEquals("foo", event2.getToNode());
         assertEquals("    <message exchangeId=\"" + exchanges.get(1).getExchangeId()
-                     + "\" exchangePattern=\"InOnly\" type=\"org.apache.camel.support.DefaultMessage\">\n"
+                     + "\" exchangePattern=\"InOnly\" exchangeType=\"org.apache.camel.support.DefaultExchange\" messageType=\"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 054d9fd25ad..6363a186eca 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
@@ -78,7 +78,7 @@ public class BacklogTracerStreamCachingTest extends ManagementTestSupport {
         BacklogTracerEventMessage event1 = events.get(0);
         assertEquals("bar", event1.getToNode());
         assertEquals("    <message exchangeId=\"" + exchanges.get(0).getExchangeId()
-                     + "\" exchangePattern=\"InOnly\" type=\"org.apache.camel.support.DefaultMessage\">\n"
+                     + "\" exchangePattern=\"InOnly\" exchangeType=\"org.apache.camel.support.DefaultExchange\" messageType=\"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 e66d3be2d59..130aa997704 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
@@ -76,7 +76,7 @@ public class BacklogTracerTest extends ManagementTestSupport {
         BacklogTracerEventMessage event1 = events.get(0);
         assertEquals("foo", event1.getToNode());
         assertEquals("    <message exchangeId=\"" + exchanges.get(0).getExchangeId()
-                     + "\" exchangePattern=\"InOnly\" type=\"org.apache.camel.support.DefaultMessage\">\n"
+                     + "\" exchangePattern=\"InOnly\" exchangeType=\"org.apache.camel.support.DefaultExchange\" messageType=\"org.apache.camel.support.DefaultMessage\">\n"
                      + "      <body type=\"java.lang.String\">Hello World</body>\n"
                      + "    </message>",
                 event1.getMessageAsXml());
@@ -84,7 +84,7 @@ public class BacklogTracerTest extends ManagementTestSupport {
         BacklogTracerEventMessage event2 = events.get(1);
         assertEquals("foo", event2.getToNode());
         assertEquals("    <message exchangeId=\"" + exchanges.get(1).getExchangeId()
-                     + "\" exchangePattern=\"InOnly\" type=\"org.apache.camel.support.DefaultMessage\">\n"
+                     + "\" exchangePattern=\"InOnly\" exchangeType=\"org.apache.camel.support.DefaultExchange\" messageType=\"org.apache.camel.support.DefaultMessage\">\n"
                      + "      <body type=\"java.lang.String\">Bye World</body>\n"
                      + "    </message>",
                 event2.getMessageAsXml());
@@ -163,7 +163,7 @@ public class BacklogTracerTest extends ManagementTestSupport {
         assertEquals("route1", event0.getRouteId());
         assertEquals(null, event0.getToNode());
         assertEquals("    <message exchangeId=\"" + fooExchanges.get(0).getExchangeId()
-                     + "\" exchangePattern=\"InOnly\" type=\"org.apache.camel.support.DefaultMessage\">\n"
+                     + "\" exchangePattern=\"InOnly\" exchangeType=\"org.apache.camel.support.DefaultExchange\" messageType=\"org.apache.camel.support.DefaultMessage\">\n"
                      + "      <body type=\"java.lang.String\">Hello World</body>\n"
                      + "    </message>",
                 event0.getMessageAsXml());
@@ -172,7 +172,7 @@ public class BacklogTracerTest extends ManagementTestSupport {
         assertEquals("route1", event1.getRouteId());
         assertEquals("foo", event1.getToNode());
         assertEquals("    <message exchangeId=\"" + fooExchanges.get(0).getExchangeId()
-                     + "\" exchangePattern=\"InOnly\" type=\"org.apache.camel.support.DefaultMessage\">\n"
+                     + "\" exchangePattern=\"InOnly\" exchangeType=\"org.apache.camel.support.DefaultExchange\" messageType=\"org.apache.camel.support.DefaultMessage\">\n"
                      + "      <body type=\"java.lang.String\">Hello World</body>\n"
                      + "    </message>",
                 event1.getMessageAsXml());
@@ -181,7 +181,7 @@ public class BacklogTracerTest extends ManagementTestSupport {
         assertEquals("route1", event2.getRouteId());
         assertEquals("bar", event2.getToNode());
         assertEquals("    <message exchangeId=\"" + barExchanges.get(0).getExchangeId()
-                     + "\" exchangePattern=\"InOnly\" type=\"org.apache.camel.support.DefaultMessage\">\n"
+                     + "\" exchangePattern=\"InOnly\" exchangeType=\"org.apache.camel.support.DefaultExchange\" messageType=\"org.apache.camel.support.DefaultMessage\">\n"
                      + "      <body type=\"java.lang.String\">Hello World</body>\n"
                      + "    </message>",
                 event2.getMessageAsXml());
@@ -190,7 +190,7 @@ public class BacklogTracerTest extends ManagementTestSupport {
         assertEquals("route1", event3.getRouteId());
         assertEquals(null, event3.getToNode());
         assertEquals("    <message exchangeId=\"" + fooExchanges.get(1).getExchangeId()
-                     + "\" exchangePattern=\"InOnly\" type=\"org.apache.camel.support.DefaultMessage\">\n"
+                     + "\" exchangePattern=\"InOnly\" exchangeType=\"org.apache.camel.support.DefaultExchange\" messageType=\"org.apache.camel.support.DefaultMessage\">\n"
                      + "      <body type=\"java.lang.String\">Bye World</body>\n"
                      + "    </message>",
                 event3.getMessageAsXml());
@@ -199,7 +199,7 @@ public class BacklogTracerTest extends ManagementTestSupport {
         assertEquals("route1", event4.getRouteId());
         assertEquals("foo", event4.getToNode());
         assertEquals("    <message exchangeId=\"" + fooExchanges.get(1).getExchangeId()
-                     + "\" exchangePattern=\"InOnly\" type=\"org.apache.camel.support.DefaultMessage\">\n"
+                     + "\" exchangePattern=\"InOnly\" exchangeType=\"org.apache.camel.support.DefaultExchange\" messageType=\"org.apache.camel.support.DefaultMessage\">\n"
                      + "      <body type=\"java.lang.String\">Bye World</body>\n"
                      + "    </message>",
                 event3.getMessageAsXml());
@@ -208,7 +208,7 @@ public class BacklogTracerTest extends ManagementTestSupport {
         assertEquals("route1", event5.getRouteId());
         assertEquals("bar", event5.getToNode());
         assertEquals("    <message exchangeId=\"" + barExchanges.get(1).getExchangeId()
-                     + "\" exchangePattern=\"InOnly\" type=\"org.apache.camel.support.DefaultMessage\">\n"
+                     + "\" exchangePattern=\"InOnly\" exchangeType=\"org.apache.camel.support.DefaultExchange\" messageType=\"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 16cb16293b6..31965c44787 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
@@ -67,7 +67,7 @@ public class ManagedBrowsableEndpointAsXmlTest extends ManagementTestSupport {
         log.info(out);
 
         assertEquals("<message exchangeId=\"" + exchanges.get(0).getExchangeId()
-                     + "\" exchangePattern=\"InOnly\" type=\"org.apache.camel.support.DefaultMessage\""
+                     + "\" exchangePattern=\"InOnly\" exchangeType=\"org.apache.camel.support.DefaultExchange\" messageType=\"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);
 
@@ -76,7 +76,7 @@ public class ManagedBrowsableEndpointAsXmlTest extends ManagementTestSupport {
         assertNotNull(out);
         log.info(out);
         assertEquals("<message exchangeId=\"" + exchanges.get(1).getExchangeId()
-                     + "\" exchangePattern=\"InOnly\" type=\"org.apache.camel.support.DefaultMessage\""
+                     + "\" exchangePattern=\"InOnly\" exchangeType=\"org.apache.camel.support.DefaultExchange\" messageType=\"org.apache.camel.support.DefaultMessage\""
                      + ">\n  <body type=\"java.lang.String\">Camel &gt; Donkey</body>\n</message>",
                 out);
 
@@ -85,7 +85,7 @@ public class ManagedBrowsableEndpointAsXmlTest extends ManagementTestSupport {
         assertNotNull(out);
         log.info(out);
         assertEquals("<message exchangeId=\"" + exchanges.get(2).getExchangeId()
-                     + "\" exchangePattern=\"InOnly\" type=\"org.apache.camel.support.DefaultMessage\""
+                     + "\" exchangePattern=\"InOnly\" exchangeType=\"org.apache.camel.support.DefaultExchange\" messageType=\"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);
@@ -96,7 +96,7 @@ public class ManagedBrowsableEndpointAsXmlTest extends ManagementTestSupport {
         log.info(out);
         assertEquals(
                 "<message exchangeId=\"" + exchanges.get(3).getExchangeId()
-                     + "\" exchangePattern=\"InOnly\" type=\"org.apache.camel.support.DefaultMessage\">\n  <headers>\n"
+                     + "\" exchangePattern=\"InOnly\" exchangeType=\"org.apache.camel.support.DefaultExchange\" messageType=\"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);
@@ -106,7 +106,7 @@ public class ManagedBrowsableEndpointAsXmlTest extends ManagementTestSupport {
         assertNotNull(out);
         log.info(out);
         assertEquals("<message exchangeId=\"" + exchanges.get(4).getExchangeId()
-                     + "\" exchangePattern=\"InOnly\" type=\"org.apache.camel.support.DefaultMessage\""
+                     + "\" exchangePattern=\"InOnly\" exchangeType=\"org.apache.camel.support.DefaultExchange\" messageType=\"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);
@@ -116,7 +116,7 @@ public class ManagedBrowsableEndpointAsXmlTest extends ManagementTestSupport {
         assertNotNull(out);
         log.info(out);
         assertEquals("<message exchangeId=\"" + exchanges.get(5).getExchangeId()
-                     + "\" exchangePattern=\"InOnly\" type=\"org.apache.camel.support.DefaultMessage\""
+                     + "\" exchangePattern=\"InOnly\" exchangeType=\"org.apache.camel.support.DefaultExchange\" messageType=\"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);
@@ -126,7 +126,7 @@ public class ManagedBrowsableEndpointAsXmlTest extends ManagementTestSupport {
         assertNotNull(out);
         log.info(out);
         assertEquals("<message exchangeId=\"" + exchanges.get(6).getExchangeId()
-                     + "\" exchangePattern=\"InOnly\" type=\"org.apache.camel.support.DefaultMessage\""
+                     + "\" exchangePattern=\"InOnly\" exchangeType=\"org.apache.camel.support.DefaultExchange\" messageType=\"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"
@@ -155,7 +155,7 @@ public class ManagedBrowsableEndpointAsXmlTest extends ManagementTestSupport {
         log.info(out);
 
         assertEquals("<message exchangeId=\"" + exchanges.get(0).getExchangeId()
-                     + "\" exchangePattern=\"InOnly\" type=\"org.apache.camel.support.DefaultMessage\""
+                     + "\" exchangePattern=\"InOnly\" exchangeType=\"org.apache.camel.support.DefaultExchange\" messageType=\"org.apache.camel.support.DefaultMessage\""
                      + ">\n  <headers>\n    <header key=\"foo\" type=\"java.lang.Integer\">123</header>\n  </headers>\n</message>",
                 out);
 
@@ -164,7 +164,7 @@ public class ManagedBrowsableEndpointAsXmlTest extends ManagementTestSupport {
         assertNotNull(out);
         log.info(out);
         assertEquals("<message exchangeId=\"" + exchanges.get(1).getExchangeId()
-                     + "\" exchangePattern=\"InOnly\" type=\"org.apache.camel.support.DefaultMessage\""
+                     + "\" exchangePattern=\"InOnly\" exchangeType=\"org.apache.camel.support.DefaultExchange\" messageType=\"org.apache.camel.support.DefaultMessage\""
                      + ">\n  <headers>\n    <header key=\"foo\" type=\"java.lang.Integer\">456</header>\n  </headers>\n</message>",
                 out);
     }
@@ -190,10 +190,10 @@ public class ManagedBrowsableEndpointAsXmlTest extends ManagementTestSupport {
         log.info(out);
 
         assertEquals("<messages>\n<message exchangeId=\"" + exchanges.get(0).getExchangeId()
-                     + "\" exchangePattern=\"InOnly\" type=\"org.apache.camel.support.DefaultMessage\""
+                     + "\" exchangePattern=\"InOnly\" exchangeType=\"org.apache.camel.support.DefaultExchange\" messageType=\"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\" type=\"org.apache.camel.support.DefaultMessage\""
+                     + "\" exchangePattern=\"InOnly\" exchangeType=\"org.apache.camel.support.DefaultExchange\" messageType=\"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);
@@ -220,10 +220,10 @@ public class ManagedBrowsableEndpointAsXmlTest extends ManagementTestSupport {
         log.info(out);
 
         assertEquals("<messages>\n<message exchangeId=\"" + exchanges.get(0).getExchangeId()
-                     + "\" exchangePattern=\"InOnly\" type=\"org.apache.camel.support.DefaultMessage\">\n  <headers>\n"
+                     + "\" exchangePattern=\"InOnly\" exchangeType=\"org.apache.camel.support.DefaultExchange\" messageType=\"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\" type=\"org.apache.camel.support.DefaultMessage\""
+                     + "\" exchangePattern=\"InOnly\" exchangeType=\"org.apache.camel.support.DefaultExchange\" messageType=\"org.apache.camel.support.DefaultMessage\""
                      + ">\n  <headers>\n    <header key=\"foo\" type=\"java.lang.Integer\">456</header>\n  </headers>\n"
                      + "</message>\n</messages>",
                 out);
@@ -251,10 +251,10 @@ public class ManagedBrowsableEndpointAsXmlTest extends ManagementTestSupport {
         log.info(out);
 
         assertEquals("<messages>\n<message exchangeId=\"" + exchanges.get(0).getExchangeId()
-                     + "\" exchangePattern=\"InOnly\" type=\"org.apache.camel.support.DefaultMessage\""
+                     + "\" exchangePattern=\"InOnly\" exchangeType=\"org.apache.camel.support.DefaultExchange\" messageType=\"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\" type=\"org.apache.camel.support.DefaultMessage\""
+                     + "\" exchangePattern=\"InOnly\" exchangeType=\"org.apache.camel.support.DefaultExchange\" messageType=\"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);
@@ -282,10 +282,10 @@ public class ManagedBrowsableEndpointAsXmlTest extends ManagementTestSupport {
         log.info(out);
 
         assertEquals("<messages>\n<message exchangeId=\"" + exchanges.get(0).getExchangeId()
-                     + "\" exchangePattern=\"InOnly\" type=\"org.apache.camel.support.DefaultMessage\""
+                     + "\" exchangePattern=\"InOnly\" exchangeType=\"org.apache.camel.support.DefaultExchange\" messageType=\"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\" type=\"org.apache.camel.support.DefaultMessage\""
+                     + "\" exchangePattern=\"InOnly\" exchangeType=\"org.apache.camel.support.DefaultExchange\" messageType=\"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 da71ef2e4c3..564105481bb 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
@@ -501,10 +501,12 @@ public final class MessageHelper {
 
         // include exchangeId/exchangePattern/type as attribute on the <message> tag
         sb.append(prefix);
-        String type = ObjectHelper.classCanonicalName(message);
+        String messageType = ObjectHelper.classCanonicalName(message);
+        String exchangeType = ObjectHelper.classCanonicalName(message.getExchange());
         sb.append("<message exchangeId=\"").append(message.getExchange().getExchangeId())
                 .append("\" exchangePattern=\"").append(message.getExchange().getPattern().name())
-                .append("\" type=\"").append(type).append("\">\n");
+                .append("\" exchangeType=\"").append(exchangeType)
+                .append("\" messageType=\"").append(messageType).append("\">\n");
 
         // exchange properties
         if (includeExchangeProperties && message.getExchange().hasProperties()) {
@@ -514,7 +516,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();
-                type = ObjectHelper.classCanonicalName(value);
+                String type = ObjectHelper.classCanonicalName(value);
                 sb.append(prefix);
                 sb.append("    <exchangeProperty key=\"").append(entry.getKey()).append("\"");
                 if (type != null) {
@@ -550,7 +552,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();
-                type = ObjectHelper.classCanonicalName(value);
+                String type = ObjectHelper.classCanonicalName(value);
                 sb.append(prefix);
                 sb.append("    <header key=\"").append(entry.getKey()).append("\"");
                 if (type != null) {
@@ -581,7 +583,7 @@ public final class MessageHelper {
         if (includeBody) {
             sb.append(prefix);
             sb.append("  <body");
-            type = ObjectHelper.classCanonicalName(message.getBody());
+            String type = ObjectHelper.classCanonicalName(message.getBody());
             if (type != null) {
                 sb.append(" type=\"").append(type).append("\"");
             }
@@ -870,7 +872,8 @@ 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));
+        jo.put("exchangeType", ObjectHelper.classCanonicalName(message.getExchange()));
+        jo.put("messageType", 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 b66bc478611..9d583d47798 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
@@ -688,6 +688,12 @@ public class CamelTraceAction extends ActionBaseCommand {
     private String getDataAsTable(Row r) {
         List<TableRow> rows = new ArrayList<>();
 
+        TableRow eRow = new TableRow("Exchange", r.message.getString("exchangeType"), null, null);
+        String tab1 = AsciiTable.getTable(AsciiTable.NO_BORDERS, List.of(eRow), Arrays.asList(
+                new Column().dataAlign(HorizontalAlign.LEFT)
+                        .minWidth(showExchangeProperties ? 11 : 9).with(TableRow::kindAsString),
+                new Column().dataAlign(HorizontalAlign.LEFT).with(TableRow::typeAndLengthAsString)));
+        // exchange properties
         JsonArray arr = r.message.getCollection("exchangeProperties");
         if (arr != null) {
             for (Object o : arr) {
@@ -695,6 +701,23 @@ public class CamelTraceAction extends ActionBaseCommand {
                 rows.add(new TableRow("Property", jo.getString("type"), jo.getString("key"), jo.get("value")));
             }
         }
+        String tab2 = AsciiTable.getTable(AsciiTable.NO_BORDERS, rows, Arrays.asList(
+                new Column().dataAlign(HorizontalAlign.LEFT)
+                        .minWidth(showExchangeProperties ? 12 : 10).with(TableRow::kindAsString),
+                new Column().dataAlign(HorizontalAlign.LEFT)
+                        .maxWidth(40, OverflowBehaviour.ELLIPSIS_LEFT).with(TableRow::typeAsString),
+                new Column().dataAlign(HorizontalAlign.RIGHT)
+                        .maxWidth(40, OverflowBehaviour.NEWLINE).with(TableRow::keyAsString),
+                new Column().dataAlign(HorizontalAlign.LEFT)
+                        .maxWidth(80, OverflowBehaviour.NEWLINE).with(TableRow::valueAsString)));
+        rows.clear();
+
+        // message type before headers
+        TableRow msgRow = new TableRow("Message", r.message.getString("messageType"), null, null);
+        String tab3 = AsciiTable.getTable(AsciiTable.NO_BORDERS, List.of(msgRow), Arrays.asList(
+                new Column().dataAlign(HorizontalAlign.LEFT)
+                        .minWidth(showExchangeProperties ? 12 : 10).with(TableRow::kindAsString),
+                new Column().dataAlign(HorizontalAlign.LEFT).with(TableRow::typeAndLengthAsString)));
         arr = r.message.getCollection("headers");
         if (arr != null) {
             for (Object o : arr) {
@@ -702,10 +725,10 @@ public class CamelTraceAction extends ActionBaseCommand {
                 rows.add(new TableRow("Header", jo.getString("type"), jo.getString("key"), jo.get("value")));
             }
         }
-        // properties and headers
-        String tab1 = AsciiTable.getTable(AsciiTable.NO_BORDERS, rows, Arrays.asList(
+        // headers
+        String tab4 = AsciiTable.getTable(AsciiTable.NO_BORDERS, rows, Arrays.asList(
                 new Column().dataAlign(HorizontalAlign.LEFT)
-                        .minWidth(showExchangeProperties ? 11 : 9).with(TableRow::kindAsString),
+                        .minWidth(showExchangeProperties ? 12 : 10).with(TableRow::kindAsString),
                 new Column().dataAlign(HorizontalAlign.LEFT)
                         .maxWidth(40, OverflowBehaviour.ELLIPSIS_LEFT).with(TableRow::typeAsString),
                 new Column().dataAlign(HorizontalAlign.RIGHT)
@@ -714,50 +737,63 @@ public class CamelTraceAction extends ActionBaseCommand {
                         .maxWidth(80, OverflowBehaviour.NEWLINE).with(TableRow::valueAsString)));
 
         // body and type
-        JsonObject jo = r.message;
-        TableRow msgRow = new TableRow("Message", jo.getString("type"), null, null);
-        jo = r.message.getMap("body");
+        JsonObject 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(msgRow, bodyRow), Arrays.asList(
+        String tab5 = AsciiTable.getTable(AsciiTable.NO_BORDERS, List.of(bodyRow), Arrays.asList(
                 new Column().dataAlign(HorizontalAlign.LEFT)
-                        .minWidth(showExchangeProperties ? 11 : 9).with(TableRow::kindAsString),
+                        .minWidth(showExchangeProperties ? 12 : 10).with(TableRow::kindAsString),
                 new Column().dataAlign(HorizontalAlign.LEFT).with(TableRow::typeAndLengthAsString)));
         // body value only (span)
-        String tab3 = null;
+        String tab6 = null;
         if (bodyRow.value != null) {
-            tab3 = AsciiTable.getTable(AsciiTable.NO_BORDERS, List.of(bodyRow), Arrays.asList(
+            tab6 = AsciiTable.getTable(AsciiTable.NO_BORDERS, List.of(bodyRow), Arrays.asList(
                     new Column().dataAlign(HorizontalAlign.LEFT).maxWidth(160, OverflowBehaviour.NEWLINE)
                             .with(TableRow::valueAsString)));
         }
-        String tab4 = null;
+        String tab7 = null;
         jo = r.exception;
         if (jo != null) {
-            TableRow eRow = new TableRow("Exception", jo.getString("type"), null, jo.get("message"));
-            tab4 = AsciiTable.getTable(AsciiTable.NO_BORDERS, List.of(eRow), Arrays.asList(
+            eRow = new TableRow("Exception", jo.getString("type"), null, jo.get("message"));
+            tab7 = AsciiTable.getTable(AsciiTable.NO_BORDERS, List.of(eRow), Arrays.asList(
                     new Column().dataAlign(HorizontalAlign.LEFT)
-                            .minWidth(showExchangeProperties ? 11 : 9).with(TableRow::kindAsStringRed),
+                            .minWidth(showExchangeProperties ? 12 : 10).with(TableRow::kindAsStringRed),
                     new Column().dataAlign(HorizontalAlign.LEFT)
                             .maxWidth(40, OverflowBehaviour.ELLIPSIS_LEFT).with(TableRow::typeAsString),
                     new Column().dataAlign(HorizontalAlign.LEFT)
                             .maxWidth(80, OverflowBehaviour.NEWLINE).with(TableRow::valueAsStringRed)));
         }
         // stacktrace only (span)
-        String tab5 = null;
+        String tab8 = null;
         if (jo != null) {
-            TableRow eRow = new TableRow("Stacktrace", null, null, jo.get("stackTrace"));
-            tab5 = AsciiTable.getTable(AsciiTable.NO_BORDERS, List.of(eRow), Arrays.asList(
+            eRow = new TableRow("Stacktrace", null, null, jo.get("stackTrace"));
+            tab8 = AsciiTable.getTable(AsciiTable.NO_BORDERS, List.of(eRow), Arrays.asList(
                     new Column().dataAlign(HorizontalAlign.LEFT).maxWidth(160, OverflowBehaviour.NEWLINE)
                             .with(TableRow::valueAsStringRed)));
         }
-        String answer = tab1 + System.lineSeparator() + tab2;
-        if (tab3 != null) {
-            answer = answer + System.lineSeparator() + tab3;
+        String answer = "";
+        if (tab1 != null && !tab1.isEmpty()) {
+            answer = answer + tab1 + System.lineSeparator();
+        }
+        if (tab2 != null && !tab2.isEmpty()) {
+            answer = answer + tab2 + System.lineSeparator();
+        }
+        if (tab3 != null && !tab3.isEmpty()) {
+            answer = answer + tab3 + System.lineSeparator();
+        }
+        if (tab4 != null && !tab4.isEmpty()) {
+            answer = answer + tab4 + System.lineSeparator();
+        }
+        if (tab5 != null && !tab5.isEmpty()) {
+            answer = answer + tab5 + System.lineSeparator();
+        }
+        if (tab6 != null && !tab6.isEmpty()) {
+            answer = answer + tab6 + System.lineSeparator();
         }
-        if (tab4 != null) {
-            answer = answer + System.lineSeparator() + tab4;
+        if (tab7 != null && !tab7.isEmpty()) {
+            answer = answer + tab7 + System.lineSeparator();
         }
-        if (tab5 != null) {
-            answer = answer + System.lineSeparator() + tab5;
+        if (tab8 != null && !tab8.isEmpty()) {
+            answer = answer + tab8 + System.lineSeparator();
         }
         return answer;
     }