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

gnodet pushed a commit to branch backport/29223-to-camel-4.22.x
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 2e75427fd942f11b05fbccfae6ca107a8fd99110
Author: Guillaume Nodet <[email protected]>
AuthorDate: Thu Nov 5 12:20:05 2026 +0000

    [backport camel-4.22.x] CAMEL-26611: camel-micrometer, 
camel-opentelemetry-metrics - use tags and attributes from headers as given
---
 .../camel/catalog/components/micrometer.json       |   2 +-
 .../catalog/components/opentelemetry-metrics.json  |   2 +-
 .../camel/catalog/docs/micrometer-component.adoc   |  11 +-
 .../docs/opentelemetry-metrics-component.adoc      |   5 +
 .../camel/component/micrometer/micrometer.json     |   2 +-
 .../src/main/docs/micrometer-component.adoc        |  11 +-
 .../micrometer/AbstractMicrometerProducer.java     |   4 +-
 .../component/micrometer/MicrometerConstants.java  |   4 +-
 .../component/micrometer/CounterRouteTest.java     | 138 +++++++++++-----
 .../metrics/opentelemetry-metrics.json             |   2 +-
 .../main/docs/opentelemetry-metrics-component.adoc |   5 +
 .../metrics/AbstractOpenTelemetryProducer.java     |  17 +-
 .../metrics/OpenTelemetryConstants.java            |   3 +-
 .../opentelemetry/metrics/CounterRouteTest.java    | 175 +++++++++------------
 .../dsl/MicrometerEndpointBuilderFactory.java      |   4 +-
 .../dsl/OpenTelemetryEndpointBuilderFactory.java   |   4 +-
 16 files changed, 222 insertions(+), 167 deletions(-)

diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/micrometer.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/micrometer.json
index 2483c49591f5..9ee87d853fb2 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/micrometer.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/micrometer.json
@@ -35,7 +35,7 @@
     "CamelMetricsCounterIncrement": { "index": 3, "kind": "header", 
"displayName": "", "group": "producer", "label": "", "required": false, 
"javaType": "Double", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Override increment value in URI", 
"constantName": 
"org.apache.camel.component.micrometer.MicrometerConstants#HEADER_COUNTER_INCREMENT"
 },
     "CamelMetricsName": { "index": 4, "kind": "header", "displayName": "", 
"group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "Override name value in URI", "constantName": 
"org.apache.camel.component.micrometer.MicrometerConstants#HEADER_METRIC_NAME" 
},
     "CamelMetricsDescription": { "index": 5, "kind": "header", "displayName": 
"", "group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "Override description value in URI", "constantName": 
"org.apache.camel.component.micrometer.MicrometerConstants#HEADER_METRIC_DESCRIPTION"
 },
-    "CamelMetricsTags": { "index": 6, "kind": "header", "displayName": "", 
"group": "producer", "label": "", "required": false, "javaType": 
"java.lang.Iterable<Tag>", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "To augment meter tags 
defined as URI parameters", "constantName": 
"org.apache.camel.component.micrometer.MicrometerConstants#HEADER_METRIC_TAGS" }
+    "CamelMetricsTags": { "index": 6, "kind": "header", "displayName": "", 
"group": "producer", "label": "", "required": false, "javaType": 
"java.lang.Iterable<Tag>", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "To augment meter tags 
defined as URI parameters. The tags from the header are used as given; use the 
tags URI parameters for Simple expressions.", "constantName": 
"org.apache.camel.component.micrometer.MicrometerConstants#HEADER [...]
   },
   "properties": {
     "metricsType": { "index": 0, "kind": "path", "displayName": "Metrics 
Type", "group": "producer", "label": "", "required": true, "type": "enum", 
"javaType": "io.micrometer.core.instrument.Meter.Type", "enum": [ "counter", 
"summary", "timer" ], "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Type of metrics" },
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/opentelemetry-metrics.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/opentelemetry-metrics.json
index 789943d1dee3..5ffaa82b14ed 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/opentelemetry-metrics.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/opentelemetry-metrics.json
@@ -35,7 +35,7 @@
     "CamelMetricsCounterIncrement": { "index": 3, "kind": "header", 
"displayName": "", "group": "producer", "label": "", "required": false, 
"javaType": "Double", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Override increment value in URI", 
"constantName": 
"org.apache.camel.opentelemetry.metrics.OpenTelemetryConstants#HEADER_COUNTER_INCREMENT"
 },
     "CamelMetricsName": { "index": 4, "kind": "header", "displayName": "", 
"group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "Override name value in URI", "constantName": 
"org.apache.camel.opentelemetry.metrics.OpenTelemetryConstants#HEADER_METRIC_NAME"
 },
     "CamelMetricsDescription": { "index": 5, "kind": "header", "displayName": 
"", "group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "Override description value in URI", "constantName": 
"org.apache.camel.opentelemetry.metrics.OpenTelemetryConstants#HEADER_METRIC_DESCRIPTION"
 },
-    "CamelMetricsAttributes": { "index": 6, "kind": "header", "displayName": 
"", "group": "producer", "label": "", "required": false, "javaType": 
"io.opentelemetry.api.common.Attributes", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "description": "To 
augment meter attributes defined as URI parameters", "constantName": 
"org.apache.camel.opentelemetry.metrics.OpenTelemetryConstants#HEADER_METRIC_ATTRIBUTES"
 }
+    "CamelMetricsAttributes": { "index": 6, "kind": "header", "displayName": 
"", "group": "producer", "label": "", "required": false, "javaType": 
"io.opentelemetry.api.common.Attributes", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "description": "To 
augment meter attributes defined as URI parameters. The attributes from the 
header are used as given; use the attributes URI parameters for Simple 
expressions.", "constantName": "org.apache.camel.opentele [...]
   },
   "properties": {
     "metricType": { "index": 0, "kind": "path", "displayName": "Metric Type", 
"group": "producer", "label": "", "required": true, "type": "enum", "javaType": 
"org.apache.camel.opentelemetry.metrics.InstrumentType", "enum": [ "counter", 
"summary", "timer" ], "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Type of metrics" },
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/micrometer-component.adoc
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/micrometer-component.adoc
index d63172bfad4f..7fcb852390bd 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/micrometer-component.adoc
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/micrometer-component.adoc
@@ -148,8 +148,15 @@ from("direct:in")
 will update a counter with name `new.name` instead of `name.not.used` using the
 tag `dynamic-key` with value `dynamic-value` in addition to the tag `key` with 
value `value`.
 
-All Metrics specific headers are removed from the message once the Micrometer 
endpoint finishes processing of exchange. While processing exchange
-Micrometer endpoint will catch all exceptions and write log entry using level 
`warn`.
+The tags from the `CamelMetricsTags` header are used as given: unlike the 
`tags` URI parameters,
+their keys and values are not evaluated as `Simple` expressions. A tag from 
the header overrides a tag
+from the URI with the same key. To tag a meter with a value from the message, 
use a `tags` URI parameter
+such as `tags.customer=${header.customerId}`, or compute the value in the 
route before setting the header.
+
+All Metrics specific headers are removed from the message once the Micrometer 
endpoint finishes processing of exchange.
+If the Micrometer endpoint cannot update the meter, then the exchange fails 
with the exception, which the
+error handler of the route handles as any other failure. For example, a 
`value`, `increment` or `decrement` that is
+not a number, or a timer `action` that is not `start` or `stop`, fails the 
exchange with a `TypeConversionException`.
 
 
 [[MicrometerComponent-counter]]
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/opentelemetry-metrics-component.adoc
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/opentelemetry-metrics-component.adoc
index 6890a325bb17..e39125702e55 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/opentelemetry-metrics-component.adoc
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/opentelemetry-metrics-component.adoc
@@ -90,6 +90,11 @@ from("direct:in")
 
 will update a counter with name `new.name` (instead of `name.not.used`) using 
the attribute `dynamic-key` with value `dynamic-value` in addition to the 
attribute `key` with value `value`.
 
+The attributes from the `CamelMetricsAttributes` header are used as given: 
unlike the `attributes` URI parameters,
+their keys and values are not evaluated as `Simple` expressions. An attribute 
from the header overrides an attribute
+from the URI with the same key. To add an attribute with a value from the 
message, use an `attributes` URI parameter
+such as `attributes.customer=${header.customerId}`, or compute the value in 
the route before setting the header.
+
 All Metrics specific headers are removed from the message once the 
OpenTelemetry endpoint finishes processing the exchange. While processing the 
exchange
 the OpenTelemetry endpoint will catch all exceptions and write log entry using 
level `warn`.
 
diff --git 
a/components/camel-micrometer/src/generated/resources/META-INF/org/apache/camel/component/micrometer/micrometer.json
 
b/components/camel-micrometer/src/generated/resources/META-INF/org/apache/camel/component/micrometer/micrometer.json
index 2483c49591f5..9ee87d853fb2 100644
--- 
a/components/camel-micrometer/src/generated/resources/META-INF/org/apache/camel/component/micrometer/micrometer.json
+++ 
b/components/camel-micrometer/src/generated/resources/META-INF/org/apache/camel/component/micrometer/micrometer.json
@@ -35,7 +35,7 @@
     "CamelMetricsCounterIncrement": { "index": 3, "kind": "header", 
"displayName": "", "group": "producer", "label": "", "required": false, 
"javaType": "Double", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Override increment value in URI", 
"constantName": 
"org.apache.camel.component.micrometer.MicrometerConstants#HEADER_COUNTER_INCREMENT"
 },
     "CamelMetricsName": { "index": 4, "kind": "header", "displayName": "", 
"group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "Override name value in URI", "constantName": 
"org.apache.camel.component.micrometer.MicrometerConstants#HEADER_METRIC_NAME" 
},
     "CamelMetricsDescription": { "index": 5, "kind": "header", "displayName": 
"", "group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "Override description value in URI", "constantName": 
"org.apache.camel.component.micrometer.MicrometerConstants#HEADER_METRIC_DESCRIPTION"
 },
-    "CamelMetricsTags": { "index": 6, "kind": "header", "displayName": "", 
"group": "producer", "label": "", "required": false, "javaType": 
"java.lang.Iterable<Tag>", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "To augment meter tags 
defined as URI parameters", "constantName": 
"org.apache.camel.component.micrometer.MicrometerConstants#HEADER_METRIC_TAGS" }
+    "CamelMetricsTags": { "index": 6, "kind": "header", "displayName": "", 
"group": "producer", "label": "", "required": false, "javaType": 
"java.lang.Iterable<Tag>", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "To augment meter tags 
defined as URI parameters. The tags from the header are used as given; use the 
tags URI parameters for Simple expressions.", "constantName": 
"org.apache.camel.component.micrometer.MicrometerConstants#HEADER [...]
   },
   "properties": {
     "metricsType": { "index": 0, "kind": "path", "displayName": "Metrics 
Type", "group": "producer", "label": "", "required": true, "type": "enum", 
"javaType": "io.micrometer.core.instrument.Meter.Type", "enum": [ "counter", 
"summary", "timer" ], "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Type of metrics" },
diff --git 
a/components/camel-micrometer/src/main/docs/micrometer-component.adoc 
b/components/camel-micrometer/src/main/docs/micrometer-component.adoc
index d63172bfad4f..7fcb852390bd 100644
--- a/components/camel-micrometer/src/main/docs/micrometer-component.adoc
+++ b/components/camel-micrometer/src/main/docs/micrometer-component.adoc
@@ -148,8 +148,15 @@ from("direct:in")
 will update a counter with name `new.name` instead of `name.not.used` using the
 tag `dynamic-key` with value `dynamic-value` in addition to the tag `key` with 
value `value`.
 
-All Metrics specific headers are removed from the message once the Micrometer 
endpoint finishes processing of exchange. While processing exchange
-Micrometer endpoint will catch all exceptions and write log entry using level 
`warn`.
+The tags from the `CamelMetricsTags` header are used as given: unlike the 
`tags` URI parameters,
+their keys and values are not evaluated as `Simple` expressions. A tag from 
the header overrides a tag
+from the URI with the same key. To tag a meter with a value from the message, 
use a `tags` URI parameter
+such as `tags.customer=${header.customerId}`, or compute the value in the 
route before setting the header.
+
+All Metrics specific headers are removed from the message once the Micrometer 
endpoint finishes processing of exchange.
+If the Micrometer endpoint cannot update the meter, then the exchange fails 
with the exception, which the
+error handler of the route handles as any other failure. For example, a 
`value`, `increment` or `decrement` that is
+not a number, or a timer `action` that is not `start` or `stop`, fails the 
exchange with a `TypeConversionException`.
 
 
 [[MicrometerComponent-counter]]
diff --git 
a/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/AbstractMicrometerProducer.java
 
b/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/AbstractMicrometerProducer.java
index c89b6b7234d9..ba1175a296b8 100644
--- 
a/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/AbstractMicrometerProducer.java
+++ 
b/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/AbstractMicrometerProducer.java
@@ -64,11 +64,13 @@ public abstract class AbstractMicrometerProducer<T extends 
Meter> extends Defaul
         String defaultMetricsDescription = simple(exchange, 
getEndpoint().getMetricsDescription(), String.class);
         String finalMetricsDescription = getStringHeader(in, 
HEADER_METRIC_DESCRIPTION, defaultMetricsDescription);
         Iterable<Tag> headerTags = getTagHeader(in, HEADER_METRIC_TAGS, 
Tags.empty());
-        Iterable<Tag> finalTags = Tags.concat(tags, headerTags).stream()
+        // only the tags from the endpoint are simple expressions, the tags 
from the header are used as given
+        Iterable<Tag> finalTags = Tags.of(tags).stream()
                 .map(tag -> Tag.of(
                         simple(exchange, tag.getKey(), String.class),
                         simple(exchange, tag.getValue(), String.class)))
                 .reduce(Tags.empty(), Tags::and, Tags::and)
+                .and(headerTags)
                 .and(Tags.of(
                         CAMEL_CONTEXT_TAG, 
getEndpoint().getCamelContext().getName()));
         try {
diff --git 
a/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/MicrometerConstants.java
 
b/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/MicrometerConstants.java
index 997968187465..8584214872d4 100644
--- 
a/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/MicrometerConstants.java
+++ 
b/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/MicrometerConstants.java
@@ -37,7 +37,9 @@ public final class MicrometerConstants {
     public static final String HEADER_METRIC_NAME = HEADER_PREFIX + "Name";
     @Metadata(description = "Override description value in URI", javaType = 
"String")
     public static final String HEADER_METRIC_DESCRIPTION = HEADER_PREFIX + 
"Description";
-    @Metadata(description = "To augment meter tags defined as URI parameters", 
javaType = "java.lang.Iterable<Tag>")
+    @Metadata(description = "To augment meter tags defined as URI parameters. 
The tags from the header are used as given;"
+                            + " use the tags URI parameters for Simple 
expressions.",
+              javaType = "java.lang.Iterable<Tag>")
     public static final String HEADER_METRIC_TAGS = HEADER_PREFIX + "Tags";
 
     public static final String DEFAULT_CAMEL_MESSAGE_HISTORY_METER_NAME = 
"camel.message.history";
diff --git 
a/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/CounterRouteTest.java
 
b/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/CounterRouteTest.java
index 9feb4a31cccb..8651bda97d78 100644
--- 
a/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/CounterRouteTest.java
+++ 
b/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/CounterRouteTest.java
@@ -16,9 +16,14 @@
  */
 package org.apache.camel.component.micrometer;
 
+import java.util.List;
+import java.util.Map;
+
 import io.micrometer.core.instrument.Counter;
 import io.micrometer.core.instrument.MeterRegistry;
+import io.micrometer.core.instrument.Tags;
 import io.micrometer.core.instrument.simple.SimpleMeterRegistry;
+import org.apache.camel.CamelExecutionException;
 import org.apache.camel.BindToRegistry;
 import org.apache.camel.EndpointInject;
 import org.apache.camel.Produce;
@@ -35,26 +40,26 @@ import 
org.springframework.context.support.AbstractApplicationContext;
 import static 
org.apache.camel.component.micrometer.MicrometerConstants.HEADER_COUNTER_DECREMENT;
 import static 
org.apache.camel.component.micrometer.MicrometerConstants.HEADER_COUNTER_INCREMENT;
 import static 
org.apache.camel.component.micrometer.MicrometerConstants.HEADER_METRIC_NAME;
+import static 
org.apache.camel.component.micrometer.MicrometerConstants.HEADER_METRIC_TAGS;
 import static 
org.apache.camel.component.micrometer.MicrometerConstants.METRICS_REGISTRY_NAME;
 import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertInstanceOf;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+    @Produce("direct:in-5")
+    private ProducerTemplate producer5;
 
-@CamelSpringTest
-public class CounterRouteTest extends CamelSpringTestSupport {
-
-    @EndpointInject("mock:out")
-    private MockEndpoint endpoint;
+    @Produce("direct:in-6")
+    private ProducerTemplate producer6;
 
-    @Produce("direct:in-1")
-    private ProducerTemplate producer1;
+    @Produce("direct:in-7")
+    private ProducerTemplate producer7;
 
-    @Produce("direct:in-2")
-    private ProducerTemplate producer2;
+    @Produce("direct:in-8")
+    private ProducerTemplate producer8;
 
-    @Produce("direct:in-3")
-    private ProducerTemplate producer3;
-
-    @Produce("direct:in-4")
-    private ProducerTemplate producer4;
+    @Produce("direct:in-9")
+    private ProducerTemplate producer9;
 
     @BindToRegistry(METRICS_REGISTRY_NAME)
     private MeterRegistry registry = new SimpleMeterRegistry();
@@ -85,55 +90,108 @@ public class CounterRouteTest extends 
CamelSpringTestSupport {
                 from("direct:in-4")
                         
.to("micrometer:counter:D?increment=${body.length}&tags.a=${body.length}")
                         .to("mock:out");
-            }
-        };
+
+    @Test
+    public void testIncrementFromBody() throws Exception {
+        endpoint.expectedMessageCount(1);
+        producer5.sendBody("42");
+        assertEquals(42.0D, registry.find("E").counter().count(), 0.01D);
+        endpoint.assertIsSatisfied();
     }
 
-    @Override
-    public void doPostTearDown() {
-        endpoint.reset();
+    @Test
+    public void testIncrementFromBodyNotNumber() throws Exception {
+        endpoint.expectedMessageCount(0);
+
+        assertIncrementFails(Map.of("count", 5));
+        assertIncrementFails(List.of(new Object()));
+        assertIncrementFails(new Object());
+        assertIncrementFails(null);
+
+        // the counter is not updated (the exchange fails with 
IllegalArgumentException)
+        assertEquals(0.0D, registry.find("E").counter().count(), 0.01D);
+        endpoint.assertIsSatisfied();
     }
 
     @Test
-    public void testOverrideMetricsName() throws Exception {
-        endpoint.expectedMessageCount(1);
-        producer1.sendBodyAndHeader(new Object(), HEADER_METRIC_NAME, "A1");
-        assertEquals(5.0D, registry.find("A1").counter().count(), 0.01D);
+    public void testIncrementOrDecrementFromHeader() throws Exception {
+        endpoint.expectedMessageCount(2);
+        producer6.sendBodyAndHeader(null, "inc", 10.0D);
+        producer6.sendBodyAndHeader(null, "dec", 3.0D);
+        assertEquals(7.0D, registry.find("F").counter().count(), 0.01D);
         endpoint.assertIsSatisfied();
     }
 
     @Test
-    public void testOverrideIncrement() throws Exception {
-        endpoint.expectedMessageCount(1);
-        producer1.sendBodyAndHeader(new Object(), HEADER_COUNTER_INCREMENT, 
14.0D);
-        assertEquals(14.0D, registry.find("A").counter().count(), 0.01D);
+    public void testIncrementOrDecrementFromHeaderMissing() throws Exception {
+        endpoint.expectedMessageCount(0);
+
+        CamelExecutionException e = assertThrows(CamelExecutionException.class,
+                () -> producer6.sendBody("Hello"));
+        assertInstanceOf(IllegalArgumentException.class, e.getCause());
+        assertEquals("The increment (${header.inc}) and decrement 
(${header.dec}) of counter F did not evaluate to a number",
+                e.getCause().getMessage());
+
+        assertEquals(0.0D, registry.find("F").counter().count(), 0.01D);
         endpoint.assertIsSatisfied();
     }
 
     @Test
-    public void testOverrideDecrement() throws Exception {
-        endpoint.expectedMessageCount(1);
-        producer2.sendBodyAndHeader(new Object(), HEADER_COUNTER_DECREMENT, 
7.0D);
-        assertEquals(-7.0D, registry.find("B").counter().count(), 0.01D);
+    public void testDecrementFromBodyNotNumber() throws Exception {
+        endpoint.expectedMessageCount(0);
+
+        CamelExecutionException e = assertThrows(CamelExecutionException.class,
+                () -> producer8.sendBody(Map.of("count", 5)));
+        assertInstanceOf(IllegalArgumentException.class, e.getCause());
+        assertEquals("The decrement (${body}) of counter H did not evaluate to 
a number",
+                e.getCause().getMessage());
+
+        assertEquals(0.0D, registry.find("H").counter().count(), 0.01D);
         endpoint.assertIsSatisfied();
     }
 
     @Test
-    public void testOverrideUsingConstantValue() throws Exception {
+    public void testNoIncrementOrDecrement() throws Exception {
+        endpoint.expectedMessageCount(2);
+        producer7.sendBody(new Object());
+        producer7.sendBody(null);
+        assertEquals(2.0D, registry.find("G").counter().count(), 0.01D);
+        endpoint.assertIsSatisfied();
+    }
+
+    @Test
+    public void testHeaderTagsAreUsedAsGiven() throws Exception {
         endpoint.expectedMessageCount(1);
-        producer3.sendBody(new Object());
-        assertEquals(417.0D, registry.find("C").counter().count(), 0.01D);
+        producer9.sendBodyAndHeaders("Hello", Map.of(
+                "k", "key",
+                HEADER_METRIC_TAGS, Tags.of("c", "${body}", "${header.k}", 
"d")));
+        Counter counter = registry.find("I").counter();
+        assertEquals(1.0D, counter.count(), 0.01D);
+        // the tags from the uri are resolved per exchange
+        assertEquals("5", counter.getId().getTag("a"));
+        assertEquals("uri", counter.getId().getTag("b"));
+        // the tags from the header are not
+        assertEquals("${body}", counter.getId().getTag("c"));
+        assertEquals("d", counter.getId().getTag("${header.k}"));
+        assertNull(counter.getId().getTag("key"));
         endpoint.assertIsSatisfied();
     }
 
     @Test
-    public void testUsingScriptEvaluation() throws Exception {
+    public void testHeaderTagOverridesUriTagWithSameKey() throws Exception {
         endpoint.expectedMessageCount(1);
-        String message = "Hello from Camel Metrics!";
-        producer4.sendBody(message);
-        Counter counter = registry.find("D").counter();
-        assertEquals(message.length(), counter.count(), 0.01D);
-        assertEquals(Integer.toString(message.length()), 
counter.getId().getTag("a"));
+        producer9.sendBodyAndHeader("Hello", HEADER_METRIC_TAGS, Tags.of("b", 
"header"));
+        Counter counter = registry.find("I").counter();
+        assertEquals("5", counter.getId().getTag("a"));
+        assertEquals("header", counter.getId().getTag("b"));
         endpoint.assertIsSatisfied();
     }
+
+    private void assertIncrementFails(Object body) {
+        CamelExecutionException e = assertThrows(CamelExecutionException.class,
+                () -> producer5.sendBody(body));
+        assertInstanceOf(IllegalArgumentException.class, e.getCause());
+        assertEquals("The increment (${body}) of counter E did not evaluate to 
a number",
+                e.getCause().getMessage());
+    }
 }
diff --git 
a/components/camel-opentelemetry-metrics/src/generated/resources/META-INF/org/apache/camel/opentelemetry/metrics/opentelemetry-metrics.json
 
b/components/camel-opentelemetry-metrics/src/generated/resources/META-INF/org/apache/camel/opentelemetry/metrics/opentelemetry-metrics.json
index 789943d1dee3..5ffaa82b14ed 100644
--- 
a/components/camel-opentelemetry-metrics/src/generated/resources/META-INF/org/apache/camel/opentelemetry/metrics/opentelemetry-metrics.json
+++ 
b/components/camel-opentelemetry-metrics/src/generated/resources/META-INF/org/apache/camel/opentelemetry/metrics/opentelemetry-metrics.json
@@ -35,7 +35,7 @@
     "CamelMetricsCounterIncrement": { "index": 3, "kind": "header", 
"displayName": "", "group": "producer", "label": "", "required": false, 
"javaType": "Double", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Override increment value in URI", 
"constantName": 
"org.apache.camel.opentelemetry.metrics.OpenTelemetryConstants#HEADER_COUNTER_INCREMENT"
 },
     "CamelMetricsName": { "index": 4, "kind": "header", "displayName": "", 
"group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "Override name value in URI", "constantName": 
"org.apache.camel.opentelemetry.metrics.OpenTelemetryConstants#HEADER_METRIC_NAME"
 },
     "CamelMetricsDescription": { "index": 5, "kind": "header", "displayName": 
"", "group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "Override description value in URI", "constantName": 
"org.apache.camel.opentelemetry.metrics.OpenTelemetryConstants#HEADER_METRIC_DESCRIPTION"
 },
-    "CamelMetricsAttributes": { "index": 6, "kind": "header", "displayName": 
"", "group": "producer", "label": "", "required": false, "javaType": 
"io.opentelemetry.api.common.Attributes", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "description": "To 
augment meter attributes defined as URI parameters", "constantName": 
"org.apache.camel.opentelemetry.metrics.OpenTelemetryConstants#HEADER_METRIC_ATTRIBUTES"
 }
+    "CamelMetricsAttributes": { "index": 6, "kind": "header", "displayName": 
"", "group": "producer", "label": "", "required": false, "javaType": 
"io.opentelemetry.api.common.Attributes", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "description": "To 
augment meter attributes defined as URI parameters. The attributes from the 
header are used as given; use the attributes URI parameters for Simple 
expressions.", "constantName": "org.apache.camel.opentele [...]
   },
   "properties": {
     "metricType": { "index": 0, "kind": "path", "displayName": "Metric Type", 
"group": "producer", "label": "", "required": true, "type": "enum", "javaType": 
"org.apache.camel.opentelemetry.metrics.InstrumentType", "enum": [ "counter", 
"summary", "timer" ], "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Type of metrics" },
diff --git 
a/components/camel-opentelemetry-metrics/src/main/docs/opentelemetry-metrics-component.adoc
 
b/components/camel-opentelemetry-metrics/src/main/docs/opentelemetry-metrics-component.adoc
index 6890a325bb17..e39125702e55 100644
--- 
a/components/camel-opentelemetry-metrics/src/main/docs/opentelemetry-metrics-component.adoc
+++ 
b/components/camel-opentelemetry-metrics/src/main/docs/opentelemetry-metrics-component.adoc
@@ -90,6 +90,11 @@ from("direct:in")
 
 will update a counter with name `new.name` (instead of `name.not.used`) using 
the attribute `dynamic-key` with value `dynamic-value` in addition to the 
attribute `key` with value `value`.
 
+The attributes from the `CamelMetricsAttributes` header are used as given: 
unlike the `attributes` URI parameters,
+their keys and values are not evaluated as `Simple` expressions. An attribute 
from the header overrides an attribute
+from the URI with the same key. To add an attribute with a value from the 
message, use an `attributes` URI parameter
+such as `attributes.customer=${header.customerId}`, or compute the value in 
the route before setting the header.
+
 All Metrics specific headers are removed from the message once the 
OpenTelemetry endpoint finishes processing the exchange. While processing the 
exchange
 the OpenTelemetry endpoint will catch all exceptions and write log entry using 
level `warn`.
 
diff --git 
a/components/camel-opentelemetry-metrics/src/main/java/org/apache/camel/opentelemetry/metrics/AbstractOpenTelemetryProducer.java
 
b/components/camel-opentelemetry-metrics/src/main/java/org/apache/camel/opentelemetry/metrics/AbstractOpenTelemetryProducer.java
index f033094546e4..db469ee5a212 100644
--- 
a/components/camel-opentelemetry-metrics/src/main/java/org/apache/camel/opentelemetry/metrics/AbstractOpenTelemetryProducer.java
+++ 
b/components/camel-opentelemetry-metrics/src/main/java/org/apache/camel/opentelemetry/metrics/AbstractOpenTelemetryProducer.java
@@ -16,10 +16,6 @@
  */
 package org.apache.camel.opentelemetry.metrics;
 
-import java.util.HashMap;
-import java.util.Map;
-
-import io.opentelemetry.api.common.AttributeKey;
 import io.opentelemetry.api.common.Attributes;
 import io.opentelemetry.api.common.AttributesBuilder;
 import org.apache.camel.Exchange;
@@ -63,14 +59,13 @@ abstract public class AbstractOpenTelemetryProducer<T> 
extends DefaultProducer {
         String defaultMetricsDescription = simple(exchange, 
getEndpoint().getMetricsDescription(), String.class);
         String finalMetricsDescription = getStringHeader(in, 
HEADER_METRIC_DESCRIPTION, defaultMetricsDescription);
 
-        Map<AttributeKey<?>, Object> map = new HashMap<>(attributes.asMap());
-        map.putAll(getAttributesHeader(in, HEADER_METRIC_ATTRIBUTES, 
Attributes.empty()).asMap());
-
+        // only the attributes from the endpoint are simple expressions, the 
attributes from the header are used as given
         AttributesBuilder ab = Attributes.builder();
-        for (Map.Entry<AttributeKey<?>, Object> entry : map.entrySet()) {
-            ab.put(simple(exchange, entry.getKey().toString(), String.class),
-                    simple(exchange, entry.getValue().toString(), 
String.class));
-        }
+        attributes.forEach((key, value) -> ab.put(
+                simple(exchange, key.getKey(), String.class),
+                simple(exchange, value.toString(), String.class)));
+        getAttributesHeader(in, HEADER_METRIC_ATTRIBUTES, Attributes.empty())
+                .forEach((key, value) -> ab.put(key.getKey(), 
value.toString()));
         ab.put(CAMEL_CONTEXT_ATTRIBUTE, 
getEndpoint().getCamelContext().getName());
 
         try {
diff --git 
a/components/camel-opentelemetry-metrics/src/main/java/org/apache/camel/opentelemetry/metrics/OpenTelemetryConstants.java
 
b/components/camel-opentelemetry-metrics/src/main/java/org/apache/camel/opentelemetry/metrics/OpenTelemetryConstants.java
index 2a2d61c78b94..dcaa6a7000f2 100644
--- 
a/components/camel-opentelemetry-metrics/src/main/java/org/apache/camel/opentelemetry/metrics/OpenTelemetryConstants.java
+++ 
b/components/camel-opentelemetry-metrics/src/main/java/org/apache/camel/opentelemetry/metrics/OpenTelemetryConstants.java
@@ -34,7 +34,8 @@ public class OpenTelemetryConstants {
     public static final String HEADER_METRIC_NAME = HEADER_PREFIX + "Name";
     @Metadata(description = "Override description value in URI", javaType = 
"String")
     public static final String HEADER_METRIC_DESCRIPTION = HEADER_PREFIX + 
"Description";
-    @Metadata(description = "To augment meter attributes defined as URI 
parameters",
+    @Metadata(description = "To augment meter attributes defined as URI 
parameters. The attributes from the header are used"
+                            + " as given; use the attributes URI parameters 
for Simple expressions.",
               javaType = "io.opentelemetry.api.common.Attributes")
 
     public static final String HEADER_METRIC_ATTRIBUTES = HEADER_PREFIX + 
"Attributes";
diff --git 
a/components/camel-opentelemetry-metrics/src/test/java/org/apache/camel/opentelemetry/metrics/CounterRouteTest.java
 
b/components/camel-opentelemetry-metrics/src/test/java/org/apache/camel/opentelemetry/metrics/CounterRouteTest.java
index 9756532f35ce..c28545c8ca3b 100644
--- 
a/components/camel-opentelemetry-metrics/src/test/java/org/apache/camel/opentelemetry/metrics/CounterRouteTest.java
+++ 
b/components/camel-opentelemetry-metrics/src/test/java/org/apache/camel/opentelemetry/metrics/CounterRouteTest.java
@@ -17,12 +17,15 @@
 package org.apache.camel.opentelemetry.metrics;
 
 import java.util.Collection;
+import java.util.List;
+import java.util.Map;
 
 import io.opentelemetry.api.common.AttributeKey;
 import io.opentelemetry.api.common.Attributes;
 import io.opentelemetry.api.metrics.Meter;
 import io.opentelemetry.sdk.metrics.data.LongPointData;
 import io.opentelemetry.sdk.metrics.data.PointData;
+import org.apache.camel.CamelExecutionException;
 import org.apache.camel.BindToRegistry;
 import org.apache.camel.RoutesBuilder;
 import org.apache.camel.builder.RouteBuilder;
@@ -36,6 +39,8 @@ import static 
org.apache.camel.opentelemetry.metrics.OpenTelemetryConstants.HEAD
 import static 
org.apache.camel.opentelemetry.metrics.OpenTelemetryConstants.HEADER_METRIC_NAME;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertInstanceOf;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
 
 public class CounterRouteTest extends CamelTestSupport {
 
@@ -76,154 +81,118 @@ public class CounterRouteTest extends CamelTestSupport {
                         
.setHeader(OpenTelemetryConstants.HEADER_COUNTER_INCREMENT, 
simple("${body.length}"))
                         .to("opentelemetry-metrics:counter:F")
                         .to("mock:result");
-            }
-        };
-    }
-
     @Test
-    public void testOverrideMetricsName() throws Exception {
+    public void testIncrementFromBody() throws Exception {
         MockEndpoint mockEndpoint = getMockEndpoint("mock:result");
         mockEndpoint.expectedMessageCount(1);
-        template.sendBodyAndHeader("direct:in1", new Object(), 
HEADER_METRIC_NAME, "A1");
-
-        assertEquals(5L, getMetric("A1").getValue());
-        MockEndpoint.assertIsSatisfied(context);
-    }
+        template.sendBody("direct:in7", "42");
 
-    // verify multiple counters on the same producer
-    @Test
-    public void testOverrideMetricsMultipleName() throws Exception {
-        MockEndpoint mockEndpoint = getMockEndpoint("mock:result");
-        mockEndpoint.expectedMessageCount(3);
-        template.sendBodyAndHeader("direct:in1", new Object(), 
HEADER_METRIC_NAME, "A1");
-
-        template.sendBodyAndHeader("direct:in1", new Object(), 
HEADER_METRIC_NAME, "A2");
-        template.sendBodyAndHeader("direct:in1", new Object(), 
HEADER_METRIC_NAME, "A2");
-
-        assertEquals(5L, getMetric("A1").getValue());
-        assertEquals(10L, getMetric("A2").getValue());
+        assertEquals(42L, getMetric("G").getValue());
         MockEndpoint.assertIsSatisfied(context);
     }
 
     @Test
-    public void testIterativeIncrement() throws Exception {
+    public void testIncrementFromBodyNotNumber() throws Exception {
         MockEndpoint mockEndpoint = getMockEndpoint("mock:result");
-        mockEndpoint.expectedMessageCount(3);
-        for (int i = 0; i < 3; i++) {
-            template.sendBody("direct:in1", new Object());
-        }
+        mockEndpoint.expectedMessageCount(0);
 
-        assertEquals(15L, getMetric("A").getValue());
-        MockEndpoint.assertIsSatisfied(context);
-    }
-
-    @Test
-    public void testIterativeOverrideMetricsName() throws Exception {
-        MockEndpoint mockEndpoint = getMockEndpoint("mock:result");
-        mockEndpoint.expectedMessageCount(3);
-        for (int i = 0; i < 3; i++) {
-            template.sendBodyAndHeader("direct:in1", new Object(), 
HEADER_METRIC_NAME, "A1");
-        }
-
-        assertEquals(15L, getMetric("A1").getValue());
-        MockEndpoint.assertIsSatisfied(context);
-    }
-
-    @Test
-    public void testOverrideIncrement() throws Exception {
-        MockEndpoint mockEndpoint = getMockEndpoint("mock:result");
-        mockEndpoint.expectedMessageCount(1);
-        template.sendBodyAndHeader("direct:in1", new Object(), 
HEADER_COUNTER_INCREMENT, 14L);
+        assertIncrementFails(Map.of("count", 5));
+        assertIncrementFails(List.of(new Object()));
+        assertIncrementFails(new Object());
+        assertIncrementFails(null);
 
-        assertEquals(14L, getMetric("A").getValue());
+        // the counter is not updated (the exchange fails with 
IllegalArgumentException)
+        assertNull(findMetric("G"));
         MockEndpoint.assertIsSatisfied(context);
     }
 
     @Test
-    public void testOverrideDecrement() throws Exception {
+    public void testIncrementOrDecrementFromHeader() throws Exception {
         MockEndpoint mockEndpoint = getMockEndpoint("mock:result");
-        mockEndpoint.expectedMessageCount(1);
-        template.sendBodyAndHeader("direct:in2", new Object(), 
HEADER_COUNTER_DECREMENT, 7L);
+        mockEndpoint.expectedMessageCount(2);
+        template.sendBodyAndHeader("direct:in8", null, "inc", 10L);
+        template.sendBodyAndHeader("direct:in8", null, "dec", 3L);
 
-        assertEquals(-7L, getMetric("B").getValue());
+        assertEquals(7L, getMetric("H").getValue());
         MockEndpoint.assertIsSatisfied(context);
     }
 
     @Test
-    public void testIterativeOverrideDecrement() throws Exception {
+    public void testIncrementOrDecrementFromHeaderMissing() throws Exception {
         MockEndpoint mockEndpoint = getMockEndpoint("mock:result");
-        mockEndpoint.expectedMessageCount(3);
-        for (int i = 0; i < 3; i++) {
-            template.sendBodyAndHeader("direct:in2", new Object(), 
HEADER_COUNTER_DECREMENT, 7L);
-        }
-
-        assertEquals(-21L, getMetric("B").getValue());
+        mockEndpoint.expectedMessageCount(0);
+
+        CamelExecutionException e = assertThrows(CamelExecutionException.class,
+                () -> template.sendBody("direct:in8", "Hello"));
+        assertInstanceOf(IllegalArgumentException.class, e.getCause());
+        assertEquals("The increment (${header.inc}) and decrement 
(${header.dec}) of counter H did not evaluate to a number",
+                e.getCause().getMessage());
+        assertNull(findMetric("H"));
         MockEndpoint.assertIsSatisfied(context);
     }
 
     @Test
-    public void testOverrideDecrementMultipleRoute() throws Exception {
+    public void testDecrementFromBodyNotNumber() throws Exception {
         MockEndpoint mockEndpoint = getMockEndpoint("mock:result");
-        mockEndpoint.expectedMessageCount(10);
-        for (int i = 0; i < 10; i++) {
-            if (i % 2 == 0) {
-                template.sendBodyAndHeader("direct:in1", new Object(), 
HEADER_COUNTER_INCREMENT, 14L);
-            } else {
-                template.sendBodyAndHeader("direct:in2", new Object(), 
HEADER_COUNTER_DECREMENT, 7L);
-            }
-        }
-
-        assertEquals(70L, getMetric("A").getValue());
-        assertEquals(-35L, getMetric("B").getValue());
+        mockEndpoint.expectedMessageCount(0);
+
+        CamelExecutionException e = assertThrows(CamelExecutionException.class,
+                () -> template.sendBody("direct:in9", Map.of("count", 5)));
+        assertInstanceOf(IllegalArgumentException.class, e.getCause());
+        assertEquals("The decrement (${body}) of counter I did not evaluate to 
a number",
+                e.getCause().getMessage());
+        assertNull(findMetric("I"));
         MockEndpoint.assertIsSatisfied(context);
     }
 
     @Test
-    public void testOverrideUsingConstantValue() throws Exception {
+    public void testHeaderAttributesAreUsedAsGiven() throws Exception {
         MockEndpoint mockEndpoint = getMockEndpoint("mock:result");
         mockEndpoint.expectedMessageCount(1);
-        template.sendBody("direct:in3", new Object());
-
-        assertEquals(417L, getMetric("C").getValue());
+        template.sendBodyAndHeaders("direct:in10", "Hello", Map.of(
+                "k", "key",
+                HEADER_METRIC_ATTRIBUTES, Attributes.of(
+                        AttributeKey.stringKey("c"), "${body}",
+                        AttributeKey.stringKey("${header.k}"), "d")));
+
+        Attributes attributes = getMetric("J").getAttributes();
+        // the attributes from the uri are resolved per exchange
+        assertEquals("5", attributes.get(AttributeKey.stringKey("a")));
+        assertEquals("uri", attributes.get(AttributeKey.stringKey("b")));
+        // the attributes from the header are not
+        assertEquals("${body}", attributes.get(AttributeKey.stringKey("c")));
+        assertEquals("d", 
attributes.get(AttributeKey.stringKey("${header.k}")));
+        assertNull(attributes.get(AttributeKey.stringKey("key")));
         MockEndpoint.assertIsSatisfied(context);
     }
 
     @Test
-    public void testUsingScriptEvaluation() throws Exception {
+    public void testHeaderAttributeOverridesUriAttributeWithSameKey() throws 
Exception {
         MockEndpoint mockEndpoint = getMockEndpoint("mock:result");
         mockEndpoint.expectedMessageCount(1);
-        String message = "Hello from Camel Metrics!";
-        template.sendBodyAndHeader("direct:in4", message, "inc", "5");
+        template.sendBodyAndHeader("direct:in10", "Hello", 
HEADER_METRIC_ATTRIBUTES,
+                Attributes.of(AttributeKey.stringKey("b"), "header"));
 
-        LongPointData pd = getMetric("D");
-        assertEquals(5, pd.getValue());
-        assertEquals(Integer.toString(message.length()), 
pd.getAttributes().get(AttributeKey.stringKey("a")));
-        assertEquals("2", pd.getAttributes().get(AttributeKey.stringKey("b")));
+        Attributes attributes = getMetric("J").getAttributes();
+        assertEquals("5", attributes.get(AttributeKey.stringKey("a")));
+        assertEquals("header", attributes.get(AttributeKey.stringKey("b")));
         MockEndpoint.assertIsSatisfied(context);
     }
 
-    // verify addition of attributes via header
-    @Test
-    public void testDynamicAttribute() throws Exception {
-        MockEndpoint mockEndpoint = getMockEndpoint("mock:result");
-        mockEndpoint.expectedMessageCount(1);
-        template.sendBody("direct:in5", new Object());
-
-        LongPointData lpd = getMetric("E");
-        assertEquals(5L, lpd.getValue());
-        assertEquals("dynamic-value", 
lpd.getAttributes().get(AttributeKey.stringKey("dynamic-key")));
-        MockEndpoint.assertIsSatisfied(context);
+    private void assertIncrementFails(Object body) {
+        CamelExecutionException e = assertThrows(CamelExecutionException.class,
+                () -> template.sendBody("direct:in7", body));
+        assertInstanceOf(IllegalArgumentException.class, e.getCause());
+        assertEquals("The increment (${body}) of counter G did not evaluate to 
a number",
+                e.getCause().getMessage());
     }
 
-    @Test
-    public void testSimpleLanguageIncrement() throws Exception {
-        String message = "Hello from Camel Metrics!";
-        MockEndpoint mockEndpoint = getMockEndpoint("mock:result");
-        mockEndpoint.expectedMessageCount(1);
-        template.sendBody("direct:in6", message);
-
-        assertEquals(message.length(), getMetric("F").getValue());
-        MockEndpoint.assertIsSatisfied(context);
+    protected LongPointData findMetric(String metricName) {
+        return (LongPointData) otelExtension.getMetrics().stream()
+                .filter(d -> d.getName().equals(metricName))
+                .map(metricData -> metricData.getData().getPoints())
+                .flatMap(Collection::stream)
+                .findFirst().orElse(null);
     }
 
     protected LongPointData getMetric(String metricName) {
diff --git 
a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/MicrometerEndpointBuilderFactory.java
 
b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/MicrometerEndpointBuilderFactory.java
index 8eaeb80ca7fc..8fa3ab03f49e 100644
--- 
a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/MicrometerEndpointBuilderFactory.java
+++ 
b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/MicrometerEndpointBuilderFactory.java
@@ -365,7 +365,9 @@ public interface MicrometerEndpointBuilderFactory {
             return "CamelMetricsDescription";
         }
         /**
-         * To augment meter tags defined as URI parameters.
+         * To augment meter tags defined as URI parameters. The tags from the
+         * header are used as given; use the tags URI parameters for Simple
+         * expressions.
          * 
          * The option is a: {@code java.lang.Iterable<Tag>} type.
          * 
diff --git 
a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/OpenTelemetryEndpointBuilderFactory.java
 
b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/OpenTelemetryEndpointBuilderFactory.java
index efe458b25c3b..e5d029e1e922 100644
--- 
a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/OpenTelemetryEndpointBuilderFactory.java
+++ 
b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/OpenTelemetryEndpointBuilderFactory.java
@@ -395,7 +395,9 @@ public interface OpenTelemetryEndpointBuilderFactory {
             return "CamelMetricsDescription";
         }
         /**
-         * To augment meter attributes defined as URI parameters.
+         * To augment meter attributes defined as URI parameters. The 
attributes
+         * from the header are used as given; use the attributes URI parameters
+         * for Simple expressions.
          * 
          * The option is a: {@code io.opentelemetry.api.common.Attributes} 
type.
          * 

Reply via email to