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 405c1f989217 CAMEL-24003: Enrich activity data with span decorator 
attributes
405c1f989217 is described below

commit 405c1f98921748dd7075d0b329e0dc629638995f
Author: Claus Ibsen <[email protected]>
AuthorDate: Sun Jul 12 10:14:26 2026 +0200

    CAMEL-24003: Enrich activity data with span decorator attributes
    
    Add activityEnabled option to BacklogTracer, configurable via
    camel.trace.activityEnabled and enabled by default in dev profile.
    When active, camel-telemetry wraps spans with RecordingSpan to capture
    decorator attributes (Kafka topic, SQL query, HTTP method, etc.) and
    stores them on the exchange for BacklogTracer activity enrichment.
    Exposed via JMX, dev console, and TracerConfigurationProperties.
    
    Co-Authored-By: Claude Opus 4.6 <[email protected]>
---
 .../main/camel-main-configuration-metadata.json    |  1 +
 .../org/apache/camel/telemetry/RecordingSpan.java  | 78 ++++++++++++++++++++++
 .../java/org/apache/camel/telemetry/Tracer.java    | 21 +++++-
 .../org/apache/camel/ExchangeConstantProvider.java |  3 +-
 .../src/main/java/org/apache/camel/Exchange.java   |  8 +++
 .../java/org/apache/camel/ExchangePropertyKey.java |  5 +-
 .../java/org/apache/camel/spi/BacklogTracer.java   | 17 +++++
 .../apache/camel/impl/debugger/BacklogTracer.java  | 10 +++
 .../camel/impl/console/ActivityDevConsole.java     |  2 +
 .../TracerConfigurationPropertiesConfigurer.java   |  7 ++
 .../camel-main-configuration-metadata.json         |  1 +
 core/camel-main/src/main/docs/main.adoc            |  3 +-
 .../org/apache/camel/main/BaseMainSupport.java     |  1 +
 .../org/apache/camel/main/ProfileConfigurer.java   |  2 +
 .../camel/main/TracerConfigurationProperties.java  | 22 ++++++
 .../mbean/ManagedBacklogTracerMBean.java           |  6 ++
 .../management/mbean/ManagedBacklogTracer.java     | 10 +++
 .../management/BacklogTracerActivityTest.java      |  8 +++
 18 files changed, 201 insertions(+), 4 deletions(-)

diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/main/camel-main-configuration-metadata.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/main/camel-main-configuration-metadata.json
index 9c5e7a7718e5..996b4d992e3c 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/main/camel-main-configuration-metadata.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/main/camel-main-configuration-metadata.json
@@ -483,6 +483,7 @@
     { "name": "camel.threadpool.poolSize", "required": false, "description": 
"Sets the default core pool size (threads to keep minimum in pool)", 
"sourceType": "org.apache.camel.main.ThreadPoolConfigurationProperties", 
"type": "integer", "javaType": "java.lang.Integer", "secret": false },
     { "name": "camel.threadpool.rejectedPolicy", "required": false, 
"description": "Sets the default handler for tasks which cannot be executed by 
the thread pool.", "sourceType": 
"org.apache.camel.main.ThreadPoolConfigurationProperties", "type": "enum", 
"javaType": "org.apache.camel.util.concurrent.ThreadPoolRejectedPolicy", 
"secret": false, "enum": [ "Abort", "CallerRuns", "DiscardOldest", "Discard" ] 
},
     { "name": "camel.threadpool.timeUnit", "required": false, "description": 
"Sets the default time unit used for keep alive time", "sourceType": 
"org.apache.camel.main.ThreadPoolConfigurationProperties", "type": "object", 
"javaType": "java.util.concurrent.TimeUnit", "secret": false },
+    { "name": "camel.trace.activityEnabled", "required": false, "description": 
"Whether activity tracking is enabled. When enabled, the backlog tracer will 
capture activity data that can be enriched with additional details from tracing 
(such as span decorator attributes).", "sourceType": 
"org.apache.camel.main.TracerConfigurationProperties", "type": "boolean", 
"javaType": "boolean", "defaultValue": false, "secret": false },
     { "name": "camel.trace.activitySize", "required": false, "description": 
"Defines how many completed exchange summaries to keep in the activity queue 
(should be between 1 - 1000). The activity queue captures lightweight metadata 
(no body or headers) each time an exchange completes a route, providing a 
rolling window of recent exchange activity.", "sourceType": 
"org.apache.camel.main.TracerConfigurationProperties", "type": "integer", 
"javaType": "int", "defaultValue": 100, "secret": false },
     { "name": "camel.trace.backlogSize", "required": false, "description": 
"Defines how many of the last messages to keep in the tracer (should be between 
1 - 1000).", "sourceType": 
"org.apache.camel.main.TracerConfigurationProperties", "type": "integer", 
"javaType": "int", "defaultValue": 100, "secret": false },
     { "name": "camel.trace.bodyIncludeFiles", "required": false, 
"description": "Whether to include the message body of file based messages. The 
overhead is that the file content has to be read from the file.", "sourceType": 
"org.apache.camel.main.TracerConfigurationProperties", "type": "boolean", 
"javaType": "boolean", "defaultValue": true, "secret": false },
diff --git 
a/components/camel-telemetry/src/main/java/org/apache/camel/telemetry/RecordingSpan.java
 
b/components/camel-telemetry/src/main/java/org/apache/camel/telemetry/RecordingSpan.java
new file mode 100644
index 000000000000..28f40223d963
--- /dev/null
+++ 
b/components/camel-telemetry/src/main/java/org/apache/camel/telemetry/RecordingSpan.java
@@ -0,0 +1,78 @@
+/*
+ * 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.telemetry;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * A {@link Span} wrapper that records all {@code setTag} and {@code 
setComponent} calls into a {@link Map} while
+ * delegating every operation to the underlying span. This is used to capture 
span decorator attributes for the
+ * BacklogTracer activity enrichment without running decorator logic twice.
+ * <p>
+ * The recording is only activated when the BacklogTracer activity feature is 
enabled, so in production there is no
+ * wrapping overhead.
+ */
+class RecordingSpan implements Span {
+
+    private final Span delegate;
+    private final Map<String, String> tags = new LinkedHashMap<>();
+
+    RecordingSpan(Span delegate) {
+        this.delegate = delegate;
+    }
+
+    @Override
+    public void setTag(String key, String value) {
+        delegate.setTag(key, value);
+        if (value != null) {
+            tags.put(key, value);
+        }
+    }
+
+    @Override
+    public void setComponent(String component) {
+        delegate.setComponent(component);
+        if (component != null) {
+            tags.put("component", component);
+        }
+    }
+
+    @Override
+    public void setError(boolean isError) {
+        delegate.setError(isError);
+    }
+
+    @Override
+    public void log(Map<String, String> fields) {
+        delegate.log(fields);
+    }
+
+    /**
+     * Returns the real span that this wrapper delegates to.
+     */
+    Span getDelegate() {
+        return delegate;
+    }
+
+    /**
+     * Returns the recorded tags as an unmodifiable snapshot.
+     */
+    Map<String, String> getRecordedTags() {
+        return Map.copyOf(tags);
+    }
+}
diff --git 
a/components/camel-telemetry/src/main/java/org/apache/camel/telemetry/Tracer.java
 
b/components/camel-telemetry/src/main/java/org/apache/camel/telemetry/Tracer.java
index 40d148fd5c88..92ce155688e6 100644
--- 
a/components/camel-telemetry/src/main/java/org/apache/camel/telemetry/Tracer.java
+++ 
b/components/camel-telemetry/src/main/java/org/apache/camel/telemetry/Tracer.java
@@ -24,11 +24,13 @@ import java.util.concurrent.ConcurrentHashMap;
 import org.apache.camel.CamelContext;
 import org.apache.camel.Endpoint;
 import org.apache.camel.Exchange;
+import org.apache.camel.ExchangePropertyKey;
 import org.apache.camel.NamedNode;
 import org.apache.camel.Route;
 import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.StaticService;
 import org.apache.camel.api.management.ManagedAttribute;
+import org.apache.camel.spi.BacklogTracer;
 import org.apache.camel.spi.CamelEvent;
 import org.apache.camel.spi.CamelLogger;
 import org.apache.camel.spi.CamelTracingService;
@@ -68,6 +70,7 @@ public abstract class Tracer extends ServiceSupport 
implements CamelTracingServi
     private final TracingEventNotifier eventNotifier = new 
TracingEventNotifier();
     private final SpanStorageManager spanStorageManager = new 
SpanStorageManagerExchange();
     private final SpanDecoratorManager spanDecoratorManager = new 
SpanDecoratorManagerImpl();
+    private BacklogTracer backlogTracer;
 
     /*
      * It has to be provided by the specific implementation
@@ -209,6 +212,8 @@ public abstract class Tracer extends ServiceSupport 
implements CamelTracingServi
         InterceptStrategy interceptStrategy = new 
TraceProcessorsInterceptStrategy(this);
         
camelContext.getCamelContextExtension().addInterceptStrategy(interceptStrategy);
 
+        backlogTracer = 
camelContext.getCamelContextExtension().getContextPlugin(BacklogTracer.class);
+
         initTracer();
         ServiceHelper.startService(eventNotifier);
     }
@@ -349,7 +354,21 @@ public abstract class Tracer extends ServiceSupport 
implements CamelTracingServi
         Span span = spanLifecycleManager.create(spanName, spanKind, parentSpan,
                 spanDecorator.getExtractor(exchange));
         span.setTag(TagConstants.OP, op.toString());
-        spanDecorator.beforeTracingEvent(span, exchange, endpoint);
+
+        if (backlogTracer != null && backlogTracer.isActivityEnabled() && op 
== Op.EVENT_SENT) {
+            // wrap with recording span to capture decorator attributes for 
activity enrichment
+            RecordingSpan recording = new RecordingSpan(span);
+            spanDecorator.beforeTracingEvent(recording, exchange, endpoint);
+            // store recorded tags on exchange for BacklogTracer activity to 
pick up
+            Map<String, String> tags = recording.getRecordedTags();
+            if (!tags.isEmpty()) {
+                exchange.setProperty(ExchangePropertyKey.ACTIVITY_SPAN_TAGS, 
tags);
+            }
+            // continue with the real span for activation/storage
+        } else {
+            spanDecorator.beforeTracingEvent(span, exchange, endpoint);
+        }
+
         spanLifecycleManager.activate(span);
         spanStorageManager.push(exchange, span);
         spanLifecycleManager.inject(span, spanDecorator.getInjector(exchange), 
this.traceHeadersInclusion);
diff --git 
a/core/camel-api/src/generated/java/org/apache/camel/ExchangeConstantProvider.java
 
b/core/camel-api/src/generated/java/org/apache/camel/ExchangeConstantProvider.java
index efc177fdf5ff..6522152b19f2 100644
--- 
a/core/camel-api/src/generated/java/org/apache/camel/ExchangeConstantProvider.java
+++ 
b/core/camel-api/src/generated/java/org/apache/camel/ExchangeConstantProvider.java
@@ -17,7 +17,8 @@ public class ExchangeConstantProvider {
 
     private static final Map<String, String> MAP;
     static {
-        Map<String, String> map = new HashMap<>(153);
+        Map<String, String> map = new HashMap<>(154);
+        map.put("ACTIVITY_SPAN_TAGS", "CamelActivitySpanTags");
         map.put("AGGREGATED_COLLECTION_GUARD", 
"CamelAggregatedCollectionGuard");
         map.put("AGGREGATED_COMPLETED_BY", "CamelAggregatedCompletedBy");
         map.put("AGGREGATED_CORRELATION_KEY", "CamelAggregatedCorrelationKey");
diff --git a/core/camel-api/src/main/java/org/apache/camel/Exchange.java 
b/core/camel-api/src/main/java/org/apache/camel/Exchange.java
index 27607438f0a8..c764291302a2 100644
--- a/core/camel-api/src/main/java/org/apache/camel/Exchange.java
+++ b/core/camel-api/src/main/java/org/apache/camel/Exchange.java
@@ -327,6 +327,14 @@ public interface Exchange extends VariableAware {
     String OTEL_ACTIVE_SPAN = "OpenTracing.activeSpan";
     @Deprecated(since = "4.19.0")
     String OTEL_CLOSE_CLIENT_SCOPE = "OpenTracing.closeClientScope";
+    /**
+     * Exchange property set by tracing implementations (e.g., 
camel-telemetry) containing span decorator attributes as
+     * a {@code Map<String, String>}. Used by the BacklogTracer activity 
feature to enrich endpoint send entries with
+     * component-specific details (e.g., Kafka topic, SQL query, HTTP method).
+     *
+     * @since 4.22
+     */
+    String ACTIVITY_SPAN_TAGS = "CamelActivitySpanTags";
 
     /**
      * Returns the {@link ExchangePattern} (MEP) of this exchange.
diff --git 
a/core/camel-api/src/main/java/org/apache/camel/ExchangePropertyKey.java 
b/core/camel-api/src/main/java/org/apache/camel/ExchangePropertyKey.java
index 8b4dd6415e0c..c3d9ed220f05 100644
--- a/core/camel-api/src/main/java/org/apache/camel/ExchangePropertyKey.java
+++ b/core/camel-api/src/main/java/org/apache/camel/ExchangePropertyKey.java
@@ -100,7 +100,8 @@ public enum ExchangePropertyKey {
     @Deprecated(since = "4.19.0")
     OTEL_ACTIVE_SPAN(Exchange.OTEL_ACTIVE_SPAN),
     @Deprecated(since = "4.19.0")
-    OTEL_CLOSE_CLIENT_SCOPE(Exchange.OTEL_CLOSE_CLIENT_SCOPE);
+    OTEL_CLOSE_CLIENT_SCOPE(Exchange.OTEL_CLOSE_CLIENT_SCOPE),
+    ACTIVITY_SPAN_TAGS(Exchange.ACTIVITY_SPAN_TAGS);
 
     private final String name;
 
@@ -246,6 +247,8 @@ public enum ExchangePropertyKey {
             // Deprecated since 4.19.0
             case Exchange.OTEL_CLOSE_CLIENT_SCOPE:
                 return OTEL_CLOSE_CLIENT_SCOPE;
+            case Exchange.ACTIVITY_SPAN_TAGS:
+                return ACTIVITY_SPAN_TAGS;
             default:
                 return null;
         }
diff --git 
a/core/camel-api/src/main/java/org/apache/camel/spi/BacklogTracer.java 
b/core/camel-api/src/main/java/org/apache/camel/spi/BacklogTracer.java
index 5b7563ae8247..672087ba0f50 100644
--- a/core/camel-api/src/main/java/org/apache/camel/spi/BacklogTracer.java
+++ b/core/camel-api/src/main/java/org/apache/camel/spi/BacklogTracer.java
@@ -43,6 +43,23 @@ import org.jspecify.annotations.Nullable;
  */
 public interface BacklogTracer {
 
+    /**
+     * Whether the activity tracking feature is enabled.
+     *
+     * @since 4.22
+     */
+    default boolean isActivityEnabled() {
+        return false;
+    }
+
+    /**
+     * To turn on or off the activity tracking feature.
+     *
+     * @since 4.22
+     */
+    default void setActivityEnabled(boolean activityEnabled) {
+    }
+
     /**
      * Is the tracer enabled.
      */
diff --git 
a/core/camel-base-engine/src/main/java/org/apache/camel/impl/debugger/BacklogTracer.java
 
b/core/camel-base-engine/src/main/java/org/apache/camel/impl/debugger/BacklogTracer.java
index 29e77353857a..c716dfbcd11c 100644
--- 
a/core/camel-base-engine/src/main/java/org/apache/camel/impl/debugger/BacklogTracer.java
+++ 
b/core/camel-base-engine/src/main/java/org/apache/camel/impl/debugger/BacklogTracer.java
@@ -86,6 +86,7 @@ public class BacklogTracer extends ServiceSupport implements 
org.apache.camel.sp
     private boolean includeExchangeProperties = true;
     private boolean includeExchangeVariables = true;
     private boolean includeException = true;
+    private boolean activityEnabled;
     private boolean traceRests;
     private boolean traceTemplates;
     // a pattern to filter tracing nodes
@@ -316,6 +317,11 @@ public class BacklogTracer extends ServiceSupport 
implements org.apache.camel.sp
         return predicate.matches(exchange);
     }
 
+    @Override
+    public boolean isActivityEnabled() {
+        return activityEnabled;
+    }
+
     @Override
     public boolean isEnabled() {
         return enabled;
@@ -689,6 +695,10 @@ public class BacklogTracer extends ServiceSupport 
implements org.apache.camel.sp
         return traceCounter.incrementAndGet();
     }
 
+    public void setActivityEnabled(boolean activityEnabled) {
+        this.activityEnabled = activityEnabled;
+    }
+
     @Override
     protected void doStart() throws Exception {
         
camelContext.getManagementStrategy().addEventNotifier(activityEventNotifier);
diff --git 
a/core/camel-console/src/main/java/org/apache/camel/impl/console/ActivityDevConsole.java
 
b/core/camel-console/src/main/java/org/apache/camel/impl/console/ActivityDevConsole.java
index 4082259daafa..e126c5a3ae45 100644
--- 
a/core/camel-console/src/main/java/org/apache/camel/impl/console/ActivityDevConsole.java
+++ 
b/core/camel-console/src/main/java/org/apache/camel/impl/console/ActivityDevConsole.java
@@ -39,6 +39,7 @@ public class ActivityDevConsole extends AbstractDevConsole {
 
         BacklogTracer tracer = 
getCamelContext().getCamelContextExtension().getContextPlugin(BacklogTracer.class);
         if (tracer != null) {
+            sb.append("Activity Enabled: 
").append(tracer.isActivityEnabled()).append("\n");
             sb.append("Activity Size: 
").append(tracer.getActivitySize()).append("\n");
             for (BacklogTracerActivityMessage event : tracer.getActivity()) {
                 sb.append(String.format("  %s | %s | %s | %dms | %s",
@@ -64,6 +65,7 @@ public class ActivityDevConsole extends AbstractDevConsole {
 
         BacklogTracer tracer = 
getCamelContext().getCamelContextExtension().getContextPlugin(BacklogTracer.class);
         if (tracer != null) {
+            root.put("activityEnabled", tracer.isActivityEnabled());
             root.put("activitySize", tracer.getActivitySize());
 
             JsonArray arr = new JsonArray();
diff --git 
a/core/camel-main/src/generated/java/org/apache/camel/main/TracerConfigurationPropertiesConfigurer.java
 
b/core/camel-main/src/generated/java/org/apache/camel/main/TracerConfigurationPropertiesConfigurer.java
index 811931a0aad8..ddb0b731980a 100644
--- 
a/core/camel-main/src/generated/java/org/apache/camel/main/TracerConfigurationPropertiesConfigurer.java
+++ 
b/core/camel-main/src/generated/java/org/apache/camel/main/TracerConfigurationPropertiesConfigurer.java
@@ -22,6 +22,7 @@ public class TracerConfigurationPropertiesConfigurer extends 
org.apache.camel.su
     private static final Map<String, Object> ALL_OPTIONS;
     static {
         Map<String, Object> map = new CaseInsensitiveMap();
+        map.put("ActivityEnabled", boolean.class);
         map.put("ActivitySize", int.class);
         map.put("BacklogSize", int.class);
         map.put("BodyIncludeFiles", boolean.class);
@@ -44,6 +45,8 @@ public class TracerConfigurationPropertiesConfigurer extends 
org.apache.camel.su
     public boolean configure(CamelContext camelContext, Object obj, String 
name, Object value, boolean ignoreCase) {
         org.apache.camel.main.TracerConfigurationProperties target = 
(org.apache.camel.main.TracerConfigurationProperties) obj;
         switch (ignoreCase ? name.toLowerCase() : name) {
+        case "activityenabled":
+        case "activityEnabled": 
target.setActivityEnabled(property(camelContext, boolean.class, value)); return 
true;
         case "activitysize":
         case "activitySize": target.setActivitySize(property(camelContext, 
int.class, value)); return true;
         case "backlogsize":
@@ -84,6 +87,8 @@ public class TracerConfigurationPropertiesConfigurer extends 
org.apache.camel.su
     @Override
     public Class<?> getOptionType(String name, boolean ignoreCase) {
         switch (ignoreCase ? name.toLowerCase() : name) {
+        case "activityenabled":
+        case "activityEnabled": return boolean.class;
         case "activitysize":
         case "activitySize": return int.class;
         case "backlogsize":
@@ -120,6 +125,8 @@ public class TracerConfigurationPropertiesConfigurer 
extends org.apache.camel.su
     public Object getOptionValue(Object obj, String name, boolean ignoreCase) {
         org.apache.camel.main.TracerConfigurationProperties target = 
(org.apache.camel.main.TracerConfigurationProperties) obj;
         switch (ignoreCase ? name.toLowerCase() : name) {
+        case "activityenabled":
+        case "activityEnabled": return target.isActivityEnabled();
         case "activitysize":
         case "activitySize": return target.getActivitySize();
         case "backlogsize":
diff --git 
a/core/camel-main/src/generated/resources/META-INF/camel-main-configuration-metadata.json
 
b/core/camel-main/src/generated/resources/META-INF/camel-main-configuration-metadata.json
index 9c5e7a7718e5..996b4d992e3c 100644
--- 
a/core/camel-main/src/generated/resources/META-INF/camel-main-configuration-metadata.json
+++ 
b/core/camel-main/src/generated/resources/META-INF/camel-main-configuration-metadata.json
@@ -483,6 +483,7 @@
     { "name": "camel.threadpool.poolSize", "required": false, "description": 
"Sets the default core pool size (threads to keep minimum in pool)", 
"sourceType": "org.apache.camel.main.ThreadPoolConfigurationProperties", 
"type": "integer", "javaType": "java.lang.Integer", "secret": false },
     { "name": "camel.threadpool.rejectedPolicy", "required": false, 
"description": "Sets the default handler for tasks which cannot be executed by 
the thread pool.", "sourceType": 
"org.apache.camel.main.ThreadPoolConfigurationProperties", "type": "enum", 
"javaType": "org.apache.camel.util.concurrent.ThreadPoolRejectedPolicy", 
"secret": false, "enum": [ "Abort", "CallerRuns", "DiscardOldest", "Discard" ] 
},
     { "name": "camel.threadpool.timeUnit", "required": false, "description": 
"Sets the default time unit used for keep alive time", "sourceType": 
"org.apache.camel.main.ThreadPoolConfigurationProperties", "type": "object", 
"javaType": "java.util.concurrent.TimeUnit", "secret": false },
+    { "name": "camel.trace.activityEnabled", "required": false, "description": 
"Whether activity tracking is enabled. When enabled, the backlog tracer will 
capture activity data that can be enriched with additional details from tracing 
(such as span decorator attributes).", "sourceType": 
"org.apache.camel.main.TracerConfigurationProperties", "type": "boolean", 
"javaType": "boolean", "defaultValue": false, "secret": false },
     { "name": "camel.trace.activitySize", "required": false, "description": 
"Defines how many completed exchange summaries to keep in the activity queue 
(should be between 1 - 1000). The activity queue captures lightweight metadata 
(no body or headers) each time an exchange completes a route, providing a 
rolling window of recent exchange activity.", "sourceType": 
"org.apache.camel.main.TracerConfigurationProperties", "type": "integer", 
"javaType": "int", "defaultValue": 100, "secret": false },
     { "name": "camel.trace.backlogSize", "required": false, "description": 
"Defines how many of the last messages to keep in the tracer (should be between 
1 - 1000).", "sourceType": 
"org.apache.camel.main.TracerConfigurationProperties", "type": "integer", 
"javaType": "int", "defaultValue": 100, "secret": false },
     { "name": "camel.trace.bodyIncludeFiles", "required": false, 
"description": "Whether to include the message body of file based messages. The 
overhead is that the file content has to be read from the file.", "sourceType": 
"org.apache.camel.main.TracerConfigurationProperties", "type": "boolean", 
"javaType": "boolean", "defaultValue": true, "secret": false },
diff --git a/core/camel-main/src/main/docs/main.adoc 
b/core/camel-main/src/main/docs/main.adoc
index f19111d9f174..684b463909f9 100644
--- a/core/camel-main/src/main/docs/main.adoc
+++ b/core/camel-main/src/main/docs/main.adoc
@@ -282,11 +282,12 @@ The camel.debug supports 15 options, which are listed 
below.
 
 
 === Camel Tracer configurations
-The camel.trace supports 15 options, which are listed below.
+The camel.trace supports 16 options, which are listed below.
 
 [width="100%",cols="2,5,^1,2",options="header"]
 |===
 | Name | Description | Default | Type
+| *camel.trace.activityEnabled* | Whether activity tracking is enabled. When 
enabled, the backlog tracer will capture activity data that can be enriched 
with additional details from tracing (such as span decorator attributes). | 
false | boolean
 | *camel.trace.activitySize* | Defines how many completed exchange summaries 
to keep in the activity queue (should be between 1 - 1000). The activity queue 
captures lightweight metadata (no body or headers) each time an exchange 
completes a route, providing a rolling window of recent exchange activity. | 
100 | int
 | *camel.trace.backlogSize* | Defines how many of the last messages to keep in 
the tracer (should be between 1 - 1000). | 100 | int
 | *camel.trace.bodyIncludeFiles* | Whether to include the message body of file 
based messages. The overhead is that the file content has to be read from the 
file. | true | boolean
diff --git 
a/core/camel-main/src/main/java/org/apache/camel/main/BaseMainSupport.java 
b/core/camel-main/src/main/java/org/apache/camel/main/BaseMainSupport.java
index 26ce5b2e0bb7..977fdeafce89 100644
--- a/core/camel-main/src/main/java/org/apache/camel/main/BaseMainSupport.java
+++ b/core/camel-main/src/main/java/org/apache/camel/main/BaseMainSupport.java
@@ -2504,6 +2504,7 @@ public abstract class BaseMainSupport extends BaseService 
{
         tracer.setStandby(config.isStandby());
         tracer.setBacklogSize(config.getBacklogSize());
         tracer.setActivitySize(config.getActivitySize());
+        tracer.setActivityEnabled(config.isActivityEnabled());
         tracer.setRemoveOnDump(config.isRemoveOnDump());
         tracer.setBodyMaxChars(config.getBodyMaxChars());
         tracer.setBodyIncludeStreams(config.isBodyIncludeStreams());
diff --git 
a/core/camel-main/src/main/java/org/apache/camel/main/ProfileConfigurer.java 
b/core/camel-main/src/main/java/org/apache/camel/main/ProfileConfigurer.java
index 6abe909806b5..209d7595328d 100644
--- a/core/camel-main/src/main/java/org/apache/camel/main/ProfileConfigurer.java
+++ b/core/camel-main/src/main/java/org/apache/camel/main/ProfileConfigurer.java
@@ -54,6 +54,8 @@ public class ProfileConfigurer {
             if (!enabled) {
                 config.tracerConfig().withStandby(true);
             }
+            // enable activity tracking so backlog tracer captures enriched 
data
+            config.tracerConfig().withActivityEnabled(true);
             // enable error registry to capture routing errors
             config.errorRegistryConfig().withEnabled(true);
             // dev profile allows insecure:dev options by default since those 
features
diff --git 
a/core/camel-main/src/main/java/org/apache/camel/main/TracerConfigurationProperties.java
 
b/core/camel-main/src/main/java/org/apache/camel/main/TracerConfigurationProperties.java
index de5e6939c335..7f92e10dc413 100644
--- 
a/core/camel-main/src/main/java/org/apache/camel/main/TracerConfigurationProperties.java
+++ 
b/core/camel-main/src/main/java/org/apache/camel/main/TracerConfigurationProperties.java
@@ -32,6 +32,8 @@ public class TracerConfigurationProperties implements 
BootstrapCloseable {
     private boolean enabled;
     @Metadata
     private boolean standby;
+    @Metadata
+    private boolean activityEnabled;
     @Metadata(label = "advanced", defaultValue = "100")
     private int backlogSize = 100;
     @Metadata(label = "advanced", defaultValue = "100")
@@ -95,6 +97,18 @@ public class TracerConfigurationProperties implements 
BootstrapCloseable {
         this.standby = standby;
     }
 
+    public boolean isActivityEnabled() {
+        return activityEnabled;
+    }
+
+    /**
+     * Whether activity tracking is enabled. When enabled, the backlog tracer 
will capture activity data that can be
+     * enriched with additional details from tracing (such as span decorator 
attributes).
+     */
+    public void setActivityEnabled(boolean activityEnabled) {
+        this.activityEnabled = activityEnabled;
+    }
+
     public int getBacklogSize() {
         return backlogSize;
     }
@@ -260,6 +274,14 @@ public class TracerConfigurationProperties implements 
BootstrapCloseable {
         return this;
     }
 
+    /**
+     * Whether activity tracking is enabled.
+     */
+    public TracerConfigurationProperties withActivityEnabled(boolean 
activityEnabled) {
+        this.activityEnabled = activityEnabled;
+        return this;
+    }
+
     /**
      * Defines how many of the last messages to keep in the tracer (should be 
between 1 - 1000).
      */
diff --git 
a/core/camel-management-api/src/main/java/org/apache/camel/api/management/mbean/ManagedBacklogTracerMBean.java
 
b/core/camel-management-api/src/main/java/org/apache/camel/api/management/mbean/ManagedBacklogTracerMBean.java
index 2e63926b8bd7..f3d8364fdbd7 100644
--- 
a/core/camel-management-api/src/main/java/org/apache/camel/api/management/mbean/ManagedBacklogTracerMBean.java
+++ 
b/core/camel-management-api/src/main/java/org/apache/camel/api/management/mbean/ManagedBacklogTracerMBean.java
@@ -39,6 +39,12 @@ public interface ManagedBacklogTracerMBean {
     @ManagedAttribute(description = "Is tracing enabled")
     void setEnabled(boolean enabled);
 
+    @ManagedAttribute(description = "Whether activity tracking is enabled")
+    boolean isActivityEnabled();
+
+    @ManagedAttribute(description = "Whether activity tracking is enabled")
+    void setActivityEnabled(boolean activityEnabled);
+
     @ManagedAttribute(description = "Number of maximum traced messages in 
total to keep in the backlog (FIFO queue)")
     int getBacklogSize();
 
diff --git 
a/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedBacklogTracer.java
 
b/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedBacklogTracer.java
index bd449b0d4134..619f9bb30f0c 100644
--- 
a/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedBacklogTracer.java
+++ 
b/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedBacklogTracer.java
@@ -76,6 +76,16 @@ public class ManagedBacklogTracer implements 
ManagedBacklogTracerMBean {
         return backlogTracer.isEnabled();
     }
 
+    @Override
+    public boolean isActivityEnabled() {
+        return backlogTracer.isActivityEnabled();
+    }
+
+    @Override
+    public void setActivityEnabled(boolean activityEnabled) {
+        backlogTracer.setActivityEnabled(activityEnabled);
+    }
+
     @Override
     public int getBacklogSize() {
         return backlogTracer.getBacklogSize();
diff --git 
a/core/camel-management/src/test/java/org/apache/camel/management/BacklogTracerActivityTest.java
 
b/core/camel-management/src/test/java/org/apache/camel/management/BacklogTracerActivityTest.java
index b245b4470829..4f90906de9bc 100644
--- 
a/core/camel-management/src/test/java/org/apache/camel/management/BacklogTracerActivityTest.java
+++ 
b/core/camel-management/src/test/java/org/apache/camel/management/BacklogTracerActivityTest.java
@@ -43,6 +43,14 @@ public class BacklogTracerActivityTest extends 
ManagementTestSupport {
         assertNotNull(on);
         assertTrue(mbeanServer.isRegistered(on));
 
+        Boolean activityEnabled = (Boolean) mbeanServer.getAttribute(on, 
"ActivityEnabled");
+        assertFalse(activityEnabled, "Activity should be disabled by default 
(no dev profile)");
+
+        // enable activity via JMX
+        mbeanServer.setAttribute(on, new Attribute("ActivityEnabled", true));
+        activityEnabled = (Boolean) mbeanServer.getAttribute(on, 
"ActivityEnabled");
+        assertTrue(activityEnabled, "Activity should be enabled after setting 
via JMX");
+
         Integer activitySize = (Integer) mbeanServer.getAttribute(on, 
"ActivitySize");
         assertEquals(100, activitySize.intValue());
 

Reply via email to