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 82db67ce746 CAMEL-22007: camel-micrometer - Configuring tags is not 
tooling friendly
82db67ce746 is described below

commit 82db67ce7468fd04ef432759f3ec3d20babf88e0
Author: Claus Ibsen <claus.ib...@gmail.com>
AuthorDate: Wed Apr 23 09:18:02 2025 +0200

    CAMEL-22007: camel-micrometer - Configuring tags is not tooling friendly
---
 .../camel/catalog/components/micrometer.json       | 10 ++---
 .../micrometer/MicrometerEndpointConfigurer.java   | 11 ++++++
 .../micrometer/MicrometerEndpointUriFactory.java   |  5 ++-
 .../camel/component/micrometer/micrometer.json     | 10 ++---
 .../micrometer/AbstractMicrometerProducer.java     | 11 +++++-
 .../component/micrometer/MicrometerComponent.java  | 45 ++++++++++++++--------
 .../component/micrometer/MicrometerEndpoint.java   | 34 ++++++++++++----
 .../component/micrometer/CounterEndpointTest.java  |  3 +-
 .../component/micrometer/CounterRouteTest.java     |  2 +-
 .../DistributionSummaryEndpointTest.java           |  3 +-
 .../micrometer/MicrometerComponentTest.java        |  7 ++--
 .../micrometer/MicrometerEndpointTest.java         |  3 +-
 .../component/micrometer/TimerEndpointTest.java    |  3 +-
 ...a => TimerRouteBackwardsCompatibleTagTest.java} |  3 +-
 .../camel/component/micrometer/TimerRouteTest.java |  2 +-
 .../ROOT/pages/camel-4x-upgrade-guide-4_12.adoc    |  6 +++
 .../builder/endpoint/StaticEndpointBuilders.java   |  6 ---
 .../dsl/MicrometerEndpointBuilderFactory.java      | 43 ++++++++++++++++++---
 18 files changed, 141 insertions(+), 66 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 bd9fcb5142f..3a9479ad622 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
@@ -40,11 +40,11 @@
   "properties": {
     "metricsType": { "index": 0, "kind": "path", "displayName": "Metrics 
Type", "group": "producer", "label": "", "required": true, "type": "object", 
"javaType": "io.micrometer.core.instrument.Meter.Type", "enum": [ "counter", 
"summary", "timer" ], "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Type of metrics" },
     "metricsName": { "index": 1, "kind": "path", "displayName": "Metrics 
Name", "group": "producer", "label": "", "required": true, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "Name of metrics" },
-    "tags": { "index": 2, "kind": "path", "displayName": "Tags", "group": 
"producer", "label": "", "required": false, "type": "object", "javaType": 
"java.lang.Iterable<io.micrometer.core.instrument.Tag>", "deprecated": false, 
"autowired": false, "secret": false, "description": "Tags of metrics" },
-    "action": { "index": 3, "kind": "parameter", "displayName": "Action", 
"group": "producer", "label": "", "required": false, "type": "string", 
"javaType": "java.lang.String", "enum": [ "start", "stop" ], "deprecated": 
false, "autowired": false, "secret": false, "description": "Action expression 
when using timer type" },
-    "decrement": { "index": 4, "kind": "parameter", "displayName": 
"Decrement", "group": "producer", "label": "", "required": false, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, "autowired": 
false, "secret": false, "description": "Decrement value expression when using 
counter type" },
-    "increment": { "index": 5, "kind": "parameter", "displayName": 
"Increment", "group": "producer", "label": "", "required": false, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, "autowired": 
false, "secret": false, "description": "Increment value expression when using 
counter type" },
-    "metricsDescription": { "index": 6, "kind": "parameter", "displayName": 
"Metrics Description", "group": "producer", "label": "", "required": false, 
"type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "description": "Description of metrics" },
+    "action": { "index": 2, "kind": "parameter", "displayName": "Action", 
"group": "producer", "label": "", "required": false, "type": "string", 
"javaType": "java.lang.String", "enum": [ "start", "stop" ], "deprecated": 
false, "autowired": false, "secret": false, "description": "Action expression 
when using timer type" },
+    "decrement": { "index": 3, "kind": "parameter", "displayName": 
"Decrement", "group": "producer", "label": "", "required": false, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, "autowired": 
false, "secret": false, "description": "Decrement value expression when using 
counter type" },
+    "increment": { "index": 4, "kind": "parameter", "displayName": 
"Increment", "group": "producer", "label": "", "required": false, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, "autowired": 
false, "secret": false, "description": "Increment value expression when using 
counter type" },
+    "metricsDescription": { "index": 5, "kind": "parameter", "displayName": 
"Metrics Description", "group": "producer", "label": "", "required": false, 
"type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "description": "Description of metrics" },
+    "tags": { "index": 6, "kind": "parameter", "displayName": "Tags", "group": 
"producer", "label": "", "required": false, "type": "object", "javaType": 
"java.util.Map<java.lang.String, java.lang.String>", "prefix": "tags.", 
"multiValue": true, "deprecated": false, "autowired": false, "secret": false, 
"description": "Tags of metrics" },
     "value": { "index": 7, "kind": "parameter", "displayName": "Value", 
"group": "producer", "label": "", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "autowired": false, 
"secret": false, "description": "Value expression when using histogram type" },
     "lazyStartProducer": { "index": 8, "kind": "parameter", "displayName": 
"Lazy Start Producer", "group": "producer (advanced)", "label": 
"producer,advanced", "required": false, "type": "boolean", "javaType": 
"boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "Whether the producer should be started 
lazy (on the first message). By starting lazy you can use this to allow 
CamelContext and routes to startup in situations where a produc [...]
   }
diff --git 
a/components/camel-micrometer/src/generated/java/org/apache/camel/component/micrometer/MicrometerEndpointConfigurer.java
 
b/components/camel-micrometer/src/generated/java/org/apache/camel/component/micrometer/MicrometerEndpointConfigurer.java
index 1d2007a622b..b80fa4809a8 100644
--- 
a/components/camel-micrometer/src/generated/java/org/apache/camel/component/micrometer/MicrometerEndpointConfigurer.java
+++ 
b/components/camel-micrometer/src/generated/java/org/apache/camel/component/micrometer/MicrometerEndpointConfigurer.java
@@ -30,6 +30,7 @@ public class MicrometerEndpointConfigurer extends 
PropertyConfigurerSupport impl
         case "lazyStartProducer": 
target.setLazyStartProducer(property(camelContext, boolean.class, value)); 
return true;
         case "metricsdescription":
         case "metricsDescription": 
target.setMetricsDescription(property(camelContext, java.lang.String.class, 
value)); return true;
+        case "tags": target.setTags(property(camelContext, 
java.util.Map.class, value)); return true;
         case "value": target.setValue(property(camelContext, 
java.lang.String.class, value)); return true;
         default: return false;
         }
@@ -45,6 +46,7 @@ public class MicrometerEndpointConfigurer extends 
PropertyConfigurerSupport impl
         case "lazyStartProducer": return boolean.class;
         case "metricsdescription":
         case "metricsDescription": return java.lang.String.class;
+        case "tags": return java.util.Map.class;
         case "value": return java.lang.String.class;
         default: return null;
         }
@@ -61,9 +63,18 @@ public class MicrometerEndpointConfigurer extends 
PropertyConfigurerSupport impl
         case "lazyStartProducer": return target.isLazyStartProducer();
         case "metricsdescription":
         case "metricsDescription": return target.getMetricsDescription();
+        case "tags": return target.getTags();
         case "value": return target.getValue();
         default: return null;
         }
     }
+
+    @Override
+    public Object getCollectionValueType(Object target, String name, boolean 
ignoreCase) {
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "tags": return java.lang.String.class;
+        default: return null;
+        }
+    }
 }
 
diff --git 
a/components/camel-micrometer/src/generated/java/org/apache/camel/component/micrometer/MicrometerEndpointUriFactory.java
 
b/components/camel-micrometer/src/generated/java/org/apache/camel/component/micrometer/MicrometerEndpointUriFactory.java
index 8f923e55997..9e3a8a2773a 100644
--- 
a/components/camel-micrometer/src/generated/java/org/apache/camel/component/micrometer/MicrometerEndpointUriFactory.java
+++ 
b/components/camel-micrometer/src/generated/java/org/apache/camel/component/micrometer/MicrometerEndpointUriFactory.java
@@ -35,7 +35,9 @@ public class MicrometerEndpointUriFactory extends 
org.apache.camel.support.compo
         props.add("value");
         PROPERTY_NAMES = Collections.unmodifiableSet(props);
         SECRET_PROPERTY_NAMES = Collections.emptySet();
-        MULTI_VALUE_PREFIXES = Collections.emptySet();
+        Set<String> prefixes = new HashSet<>(1);
+        prefixes.add("tags.");
+        MULTI_VALUE_PREFIXES = Collections.unmodifiableSet(prefixes);
     }
 
     @Override
@@ -52,7 +54,6 @@ public class MicrometerEndpointUriFactory extends 
org.apache.camel.support.compo
 
         uri = buildPathParameter(syntax, uri, "metricsType", null, true, copy);
         uri = buildPathParameter(syntax, uri, "metricsName", null, true, copy);
-        uri = buildPathParameter(syntax, uri, "tags", null, false, copy);
         uri = buildQueryParameters(uri, copy, encode);
         return uri;
     }
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 bd9fcb5142f..3a9479ad622 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
@@ -40,11 +40,11 @@
   "properties": {
     "metricsType": { "index": 0, "kind": "path", "displayName": "Metrics 
Type", "group": "producer", "label": "", "required": true, "type": "object", 
"javaType": "io.micrometer.core.instrument.Meter.Type", "enum": [ "counter", 
"summary", "timer" ], "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Type of metrics" },
     "metricsName": { "index": 1, "kind": "path", "displayName": "Metrics 
Name", "group": "producer", "label": "", "required": true, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "Name of metrics" },
-    "tags": { "index": 2, "kind": "path", "displayName": "Tags", "group": 
"producer", "label": "", "required": false, "type": "object", "javaType": 
"java.lang.Iterable<io.micrometer.core.instrument.Tag>", "deprecated": false, 
"autowired": false, "secret": false, "description": "Tags of metrics" },
-    "action": { "index": 3, "kind": "parameter", "displayName": "Action", 
"group": "producer", "label": "", "required": false, "type": "string", 
"javaType": "java.lang.String", "enum": [ "start", "stop" ], "deprecated": 
false, "autowired": false, "secret": false, "description": "Action expression 
when using timer type" },
-    "decrement": { "index": 4, "kind": "parameter", "displayName": 
"Decrement", "group": "producer", "label": "", "required": false, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, "autowired": 
false, "secret": false, "description": "Decrement value expression when using 
counter type" },
-    "increment": { "index": 5, "kind": "parameter", "displayName": 
"Increment", "group": "producer", "label": "", "required": false, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, "autowired": 
false, "secret": false, "description": "Increment value expression when using 
counter type" },
-    "metricsDescription": { "index": 6, "kind": "parameter", "displayName": 
"Metrics Description", "group": "producer", "label": "", "required": false, 
"type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "description": "Description of metrics" },
+    "action": { "index": 2, "kind": "parameter", "displayName": "Action", 
"group": "producer", "label": "", "required": false, "type": "string", 
"javaType": "java.lang.String", "enum": [ "start", "stop" ], "deprecated": 
false, "autowired": false, "secret": false, "description": "Action expression 
when using timer type" },
+    "decrement": { "index": 3, "kind": "parameter", "displayName": 
"Decrement", "group": "producer", "label": "", "required": false, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, "autowired": 
false, "secret": false, "description": "Decrement value expression when using 
counter type" },
+    "increment": { "index": 4, "kind": "parameter", "displayName": 
"Increment", "group": "producer", "label": "", "required": false, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, "autowired": 
false, "secret": false, "description": "Increment value expression when using 
counter type" },
+    "metricsDescription": { "index": 5, "kind": "parameter", "displayName": 
"Metrics Description", "group": "producer", "label": "", "required": false, 
"type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "description": "Description of metrics" },
+    "tags": { "index": 6, "kind": "parameter", "displayName": "Tags", "group": 
"producer", "label": "", "required": false, "type": "object", "javaType": 
"java.util.Map<java.lang.String, java.lang.String>", "prefix": "tags.", 
"multiValue": true, "deprecated": false, "autowired": false, "secret": false, 
"description": "Tags of metrics" },
     "value": { "index": 7, "kind": "parameter", "displayName": "Value", 
"group": "producer", "label": "", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "autowired": false, 
"secret": false, "description": "Value expression when using histogram type" },
     "lazyStartProducer": { "index": 8, "kind": "parameter", "displayName": 
"Lazy Start Producer", "group": "producer (advanced)", "label": 
"producer,advanced", "required": false, "type": "boolean", "javaType": 
"boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "Whether the producer should be started 
lazy (on the first message). By starting lazy you can use this to allow 
CamelContext and routes to startup in situations where a produc [...]
   }
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 60b79df4a39..c89b6b7234d 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
@@ -39,10 +39,18 @@ public abstract class AbstractMicrometerProducer<T extends 
Meter> extends Defaul
 
     private static final String HEADER_PATTERN = HEADER_PREFIX + "*";
 
+    private Iterable<Tag> tags;
+
     protected AbstractMicrometerProducer(MicrometerEndpoint endpoint) {
         super(endpoint);
     }
 
+    @Override
+    protected void doBuild() throws Exception {
+        super.doBuild();
+        this.tags = getEndpoint().createTags();
+    }
+
     @Override
     public MicrometerEndpoint getEndpoint() {
         return (MicrometerEndpoint) super.getEndpoint();
@@ -55,9 +63,8 @@ public abstract class AbstractMicrometerProducer<T extends 
Meter> extends Defaul
         String finalMetricsName = getStringHeader(in, HEADER_METRIC_NAME, 
defaultMetricsName);
         String defaultMetricsDescription = simple(exchange, 
getEndpoint().getMetricsDescription(), String.class);
         String finalMetricsDescription = getStringHeader(in, 
HEADER_METRIC_DESCRIPTION, defaultMetricsDescription);
-        Iterable<Tag> defaultTags = getEndpoint().getTags();
         Iterable<Tag> headerTags = getTagHeader(in, HEADER_METRIC_TAGS, 
Tags.empty());
-        Iterable<Tag> finalTags = Tags.concat(defaultTags, headerTags).stream()
+        Iterable<Tag> finalTags = Tags.concat(tags, headerTags).stream()
                 .map(tag -> Tag.of(
                         simple(exchange, tag.getKey(), String.class),
                         simple(exchange, tag.getValue(), String.class)))
diff --git 
a/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/MicrometerComponent.java
 
b/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/MicrometerComponent.java
index a1388867b36..ff0659ae128 100644
--- 
a/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/MicrometerComponent.java
+++ 
b/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/MicrometerComponent.java
@@ -16,13 +16,11 @@
  */
 package org.apache.camel.component.micrometer;
 
+import java.util.HashMap;
 import java.util.Map;
-import java.util.stream.Stream;
 
 import io.micrometer.core.instrument.Meter;
 import io.micrometer.core.instrument.MeterRegistry;
-import io.micrometer.core.instrument.Tag;
-import io.micrometer.core.instrument.Tags;
 import org.apache.camel.Endpoint;
 import org.apache.camel.spi.Metadata;
 import org.apache.camel.spi.Registry;
@@ -62,14 +60,38 @@ public class MicrometerComponent extends DefaultComponent {
     protected Endpoint createEndpoint(String uri, String remaining, 
Map<String, Object> parameters) throws Exception {
         String metricsName = getMetricsName(remaining);
         Meter.Type metricsType = getMetricsType(remaining);
-        Iterable<Tag> tags = getMetricsTag(parameters);
 
-        LOG.debug("Metrics type: {}; name: {}; tags: {}", metricsType, 
metricsName, tags);
-        Endpoint endpoint = new MicrometerEndpoint(uri, this, metricsRegistry, 
metricsType, metricsName, tags);
+        // backwards compatible
+        Map<String, String> map = getTags(parameters);
+        if (map != null && !map.isEmpty()) {
+            LOG.warn(
+                    "Deprecated tags=key1=value&key2=value2 parameter in use. 
Migrate to use multi-valued tags.key1=value1&tags.key2=value2 syntax");
+        }
+
+        LOG.debug("Metrics type: {}; name: {}", metricsType, metricsName);
+        MicrometerEndpoint endpoint = new MicrometerEndpoint(uri, this, 
metricsRegistry, metricsType, metricsName);
+        if (map != null) {
+            endpoint.setTags(map);
+        }
         setProperties(endpoint, parameters);
         return endpoint;
     }
 
+    Map<String, String> getTags(Map<String, Object> parameters) {
+        String tagsString = getAndRemoveParameter(parameters, "tags", 
String.class, "");
+        if (tagsString != null && !tagsString.isEmpty()) {
+            Map<String, String> answer = new HashMap<>();
+            for (String tag : tagsString.split("\\s*,\\s*")) {
+                String[] e = tag.split("\\s*=\\s*");
+                if (e.length == 2) {
+                    answer.put(e[0], e[1]);
+                }
+            }
+            return answer;
+        }
+        return null;
+    }
+
     String getMetricsName(String remaining) {
         String name = StringHelper.after(remaining, ":");
         return name == null ? remaining : name;
@@ -82,17 +104,6 @@ public class MicrometerComponent extends DefaultComponent {
                 : MicrometerUtils.getByName(type);
     }
 
-    Iterable<Tag> getMetricsTag(Map<String, Object> parameters) {
-        String tagsString = getAndRemoveParameter(parameters, "tags", 
String.class, "");
-        if (tagsString != null && !tagsString.isEmpty()) {
-            String[] tagStrings = tagsString.split("\\s*,\\s*");
-            return Stream.of(tagStrings)
-                    .map(s -> Tags.of(s.split("\\s*=\\s*")))
-                    .reduce(Tags.empty(), Tags::and);
-        }
-        return Tags.empty();
-    }
-
     public MeterRegistry getMetricsRegistry() {
         return metricsRegistry;
     }
diff --git 
a/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/MicrometerEndpoint.java
 
b/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/MicrometerEndpoint.java
index 59bffdde62d..fa6011805ec 100644
--- 
a/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/MicrometerEndpoint.java
+++ 
b/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/MicrometerEndpoint.java
@@ -16,6 +16,10 @@
  */
 package org.apache.camel.component.micrometer;
 
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
 import io.micrometer.core.instrument.Meter;
 import io.micrometer.core.instrument.MeterRegistry;
 import io.micrometer.core.instrument.Tag;
@@ -49,8 +53,8 @@ public class MicrometerEndpoint extends DefaultEndpoint {
     protected final String metricsName;
     @UriParam(description = "Description of metrics")
     protected String metricsDescription;
-    @UriPath(description = "Tags of metrics")
-    protected final Iterable<Tag> tags;
+    @UriParam(description = "Tags of metrics", multiValue = true, prefix = 
"tags.")
+    protected Map<String, String> tags;
     @UriParam(description = "Action expression when using timer type", enums = 
"start,stop")
     private String action;
     @UriParam(description = "Value expression when using histogram type")
@@ -61,12 +65,11 @@ public class MicrometerEndpoint extends DefaultEndpoint {
     private String decrement;
 
     public MicrometerEndpoint(String uri, Component component, MeterRegistry 
registry, Meter.Type metricsType,
-                              String metricsName, Iterable<Tag> tags) {
+                              String metricsName) {
         super(uri, component);
         this.registry = registry;
         this.metricsType = metricsType;
         this.metricsName = metricsName;
-        this.tags = tags;
     }
 
     @Override
@@ -92,6 +95,17 @@ public class MicrometerEndpoint extends DefaultEndpoint {
         }
     }
 
+    Iterable<Tag> createTags() {
+        if (tags != null && !tags.isEmpty()) {
+            List<Tag> answer = new ArrayList<>();
+            tags.forEach((k, v) -> {
+                answer.add(Tag.of(k, v));
+            });
+            return answer;
+        }
+        return null;
+    }
+
     public MeterRegistry getRegistry() {
         return registry;
     }
@@ -100,10 +114,6 @@ public class MicrometerEndpoint extends DefaultEndpoint {
         return metricsName;
     }
 
-    public Iterable<Tag> getTags() {
-        return tags;
-    }
-
     public Meter.Type getMetricsType() {
         return metricsType;
     }
@@ -116,6 +126,14 @@ public class MicrometerEndpoint extends DefaultEndpoint {
         this.metricsDescription = metricsDescription;
     }
 
+    public Map<String, String> getTags() {
+        return tags;
+    }
+
+    public void setTags(Map<String, String> tags) {
+        this.tags = tags;
+    }
+
     public String getAction() {
         return action;
     }
diff --git 
a/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/CounterEndpointTest.java
 
b/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/CounterEndpointTest.java
index 89689f6ad90..a8529730f19 100644
--- 
a/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/CounterEndpointTest.java
+++ 
b/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/CounterEndpointTest.java
@@ -18,7 +18,6 @@ package org.apache.camel.component.micrometer;
 
 import io.micrometer.core.instrument.Meter;
 import io.micrometer.core.instrument.MeterRegistry;
-import io.micrometer.core.instrument.Tags;
 import org.apache.camel.Producer;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
@@ -50,7 +49,7 @@ public class CounterEndpointTest {
 
     @BeforeEach
     public void setUp() {
-        endpoint = new MicrometerEndpoint(null, null, registry, 
Meter.Type.COUNTER, METRICS_NAME, Tags.empty());
+        endpoint = new MicrometerEndpoint(null, null, registry, 
Meter.Type.COUNTER, METRICS_NAME);
         inOrder = Mockito.inOrder(registry);
     }
 
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 578a9f9aefb..2e332a3721d 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
@@ -83,7 +83,7 @@ public class CounterRouteTest extends CamelSpringTestSupport {
                         .to("mock:out");
 
                 from("direct:in-4")
-                        
.to("micrometer:counter:D?increment=${body.length}&tags=a=${body.length}")
+                        
.to("micrometer:counter:D?increment=${body.length}&tags.a=${body.length}")
                         .to("mock:out");
             }
         };
diff --git 
a/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/DistributionSummaryEndpointTest.java
 
b/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/DistributionSummaryEndpointTest.java
index 184bd978479..b6669cb024c 100644
--- 
a/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/DistributionSummaryEndpointTest.java
+++ 
b/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/DistributionSummaryEndpointTest.java
@@ -18,7 +18,6 @@ package org.apache.camel.component.micrometer;
 
 import io.micrometer.core.instrument.Meter;
 import io.micrometer.core.instrument.MeterRegistry;
-import io.micrometer.core.instrument.Tags;
 import org.apache.camel.Producer;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
@@ -50,7 +49,7 @@ public class DistributionSummaryEndpointTest {
 
     @BeforeEach
     public void setUp() {
-        endpoint = new MicrometerEndpoint(null, null, registry, 
Meter.Type.DISTRIBUTION_SUMMARY, METRICS_NAME, Tags.empty());
+        endpoint = new MicrometerEndpoint(null, null, registry, 
Meter.Type.DISTRIBUTION_SUMMARY, METRICS_NAME);
         inOrder = Mockito.inOrder(registry);
     }
 
diff --git 
a/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/MicrometerComponentTest.java
 
b/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/MicrometerComponentTest.java
index e26f78d0621..244d321034e 100644
--- 
a/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/MicrometerComponentTest.java
+++ 
b/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/MicrometerComponentTest.java
@@ -20,7 +20,6 @@ import java.util.Collections;
 
 import io.micrometer.core.instrument.Meter;
 import io.micrometer.core.instrument.MeterRegistry;
-import io.micrometer.core.instrument.Tags;
 import io.micrometer.core.instrument.composite.CompositeMeterRegistry;
 import io.micrometer.core.instrument.simple.SimpleMeterRegistry;
 import org.apache.camel.CamelContext;
@@ -75,7 +74,7 @@ public class MicrometerComponentTest {
 
     @Test
     public void testCreateNewEndpointForCounter() {
-        Endpoint endpoint = new MicrometerEndpoint(null, null, metricRegistry, 
Meter.Type.COUNTER, "a name", Tags.empty());
+        Endpoint endpoint = new MicrometerEndpoint(null, null, metricRegistry, 
Meter.Type.COUNTER, "a name");
         assertThat(endpoint, is(notNullValue()));
         assertThat(endpoint, is(instanceOf(MicrometerEndpoint.class)));
     }
@@ -83,14 +82,14 @@ public class MicrometerComponentTest {
     @Test
     public void testCreateNewEndpointForHistogram() {
         Endpoint endpoint
-                = new MicrometerEndpoint(null, null, metricRegistry, 
Meter.Type.DISTRIBUTION_SUMMARY, "a name", Tags.empty());
+                = new MicrometerEndpoint(null, null, metricRegistry, 
Meter.Type.DISTRIBUTION_SUMMARY, "a name");
         assertThat(endpoint, is(notNullValue()));
         assertThat(endpoint, is(instanceOf(MicrometerEndpoint.class)));
     }
 
     @Test
     public void testCreateNewEndpointForTimer() {
-        Endpoint endpoint = new MicrometerEndpoint(null, null, metricRegistry, 
Meter.Type.TIMER, "a name", Tags.empty());
+        Endpoint endpoint = new MicrometerEndpoint(null, null, metricRegistry, 
Meter.Type.TIMER, "a name");
         assertThat(endpoint, is(notNullValue()));
         assertThat(endpoint, is(instanceOf(MicrometerEndpoint.class)));
     }
diff --git 
a/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/MicrometerEndpointTest.java
 
b/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/MicrometerEndpointTest.java
index 06ef6e8ec72..c1fec5beac4 100644
--- 
a/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/MicrometerEndpointTest.java
+++ 
b/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/MicrometerEndpointTest.java
@@ -18,7 +18,6 @@ package org.apache.camel.component.micrometer;
 
 import io.micrometer.core.instrument.Meter;
 import io.micrometer.core.instrument.MeterRegistry;
-import io.micrometer.core.instrument.Tags;
 import org.apache.camel.Exchange;
 import org.apache.camel.Message;
 import org.apache.camel.Processor;
@@ -58,7 +57,7 @@ public class MicrometerEndpointTest {
 
     @BeforeEach
     public void setUp() {
-        endpoint = new MicrometerEndpoint(null, null, registry, 
Meter.Type.COUNTER, METRICS_NAME, Tags.empty()) {
+        endpoint = new MicrometerEndpoint(null, null, registry, 
Meter.Type.COUNTER, METRICS_NAME) {
             @Override
             public Producer createProducer() {
                 return null;
diff --git 
a/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/TimerEndpointTest.java
 
b/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/TimerEndpointTest.java
index 5b87c9877cc..268ad7aa327 100644
--- 
a/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/TimerEndpointTest.java
+++ 
b/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/TimerEndpointTest.java
@@ -18,7 +18,6 @@ package org.apache.camel.component.micrometer;
 
 import io.micrometer.core.instrument.Meter;
 import io.micrometer.core.instrument.MeterRegistry;
-import io.micrometer.core.instrument.Tags;
 import org.apache.camel.Producer;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
@@ -49,7 +48,7 @@ public class TimerEndpointTest {
 
     @BeforeEach
     public void setUp() {
-        endpoint = new MicrometerEndpoint(null, null, registry, 
Meter.Type.TIMER, METRICS_NAME, Tags.empty());
+        endpoint = new MicrometerEndpoint(null, null, registry, 
Meter.Type.TIMER, METRICS_NAME);
         inOrder = Mockito.inOrder(registry);
     }
 
diff --git 
a/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/TimerRouteTest.java
 
b/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/TimerRouteBackwardsCompatibleTagTest.java
similarity index 97%
copy from 
components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/TimerRouteTest.java
copy to 
components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/TimerRouteBackwardsCompatibleTagTest.java
index e4e1b8d6bf8..91a2b4445b2 100644
--- 
a/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/TimerRouteTest.java
+++ 
b/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/TimerRouteBackwardsCompatibleTagTest.java
@@ -41,7 +41,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
 @CamelSpringTest
-public class TimerRouteTest extends CamelSpringTestSupport {
+public class TimerRouteBackwardsCompatibleTagTest extends 
CamelSpringTestSupport {
 
     private static final long DELAY = 20L;
 
@@ -84,6 +84,7 @@ public class TimerRouteTest extends CamelSpringTestSupport {
                 from("direct:in-3")
                         .to("micrometer:timer:C?action=start")
                         .delay(DELAY)
+                        // backwards compatible tags= parameter
                         .to("micrometer:timer:C?action=stop&tags=a=${body}")
                         .to("mock:out");
             }
diff --git 
a/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/TimerRouteTest.java
 
b/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/TimerRouteTest.java
index e4e1b8d6bf8..5450d7afab9 100644
--- 
a/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/TimerRouteTest.java
+++ 
b/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/TimerRouteTest.java
@@ -84,7 +84,7 @@ public class TimerRouteTest extends CamelSpringTestSupport {
                 from("direct:in-3")
                         .to("micrometer:timer:C?action=start")
                         .delay(DELAY)
-                        .to("micrometer:timer:C?action=stop&tags=a=${body}")
+                        .to("micrometer:timer:C?action=stop&tags.a=${body}")
                         .to("mock:out");
             }
         };
diff --git 
a/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_12.adoc 
b/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_12.adoc
index 72c16779261..26294c1f562 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_12.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_12.adoc
@@ -89,3 +89,9 @@ not be able to add the `otherwise` block to the outer Choice.
 
 Add options allowing the addition of an `Authorization` header for Basic or 
Bearer authentication to client and
 asynchronous MDN requests.
+
+=== camel-micrometer
+
+The `tags` parameter has been _fixed_ to be multivalued and tooling friendly. 
So
+instead of configuring `tags=a=1&b=2` then this should be configured as 
`tags.a=1&tags.b=2` and so forth.
+
diff --git 
a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/StaticEndpointBuilders.java
 
b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/StaticEndpointBuilders.java
index 3acc111b0cf..72850be894f 100644
--- 
a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/StaticEndpointBuilders.java
+++ 
b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/StaticEndpointBuilders.java
@@ -10142,9 +10142,6 @@ public class StaticEndpointBuilders {
      * Path parameter: metricsName (required)
      * Name of metrics
      * 
-     * Path parameter: tags
-     * Tags of metrics
-     * 
      * @param path metricsType:metricsName
      * @return the dsl builder
      */
@@ -10169,9 +10166,6 @@ public class StaticEndpointBuilders {
      * Path parameter: metricsName (required)
      * Name of metrics
      * 
-     * Path parameter: tags
-     * Tags of metrics
-     * 
      * @param componentName to use a custom component name for the endpoint
      * instead of the default name
      * @param path metricsType:metricsName
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 49c72f43d9d..44725d4302e 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
@@ -101,6 +101,43 @@ public interface MicrometerEndpointBuilderFactory {
             doSetProperty("metricsDescription", metricsDescription);
             return this;
         }
+        /**
+         * Tags of metrics.
+         * 
+         * The option is a: <code>java.util.Map&lt;java.lang.String,
+         * java.lang.String&gt;</code> type.
+         * The option is multivalued, and you can use the tags(String, Object)
+         * method to add a value (call the method multiple times to set more
+         * values).
+         * 
+         * Group: producer
+         * 
+         * @param key the option key
+         * @param value the option value
+         * @return the dsl builder
+         */
+        default MicrometerEndpointBuilder tags(String key, Object value) {
+            doSetMultiValueProperty("tags", "tags." + key, value);
+            return this;
+        }
+        /**
+         * Tags of metrics.
+         * 
+         * The option is a: <code>java.util.Map&lt;java.lang.String,
+         * java.lang.String&gt;</code> type.
+         * The option is multivalued, and you can use the tags(String, Object)
+         * method to add a value (call the method multiple times to set more
+         * values).
+         * 
+         * Group: producer
+         * 
+         * @param values the values
+         * @return the dsl builder
+         */
+        default MicrometerEndpointBuilder tags(Map values) {
+            doSetMultiValueProperties("tags", "tags.", values);
+            return this;
+        }
         /**
          * Value expression when using histogram type.
          * 
@@ -209,9 +246,6 @@ public interface MicrometerEndpointBuilderFactory {
          * Path parameter: metricsName (required)
          * Name of metrics
          * 
-         * Path parameter: tags
-         * Tags of metrics
-         * 
          * @param path metricsType:metricsName
          * @return the dsl builder
          */
@@ -237,9 +271,6 @@ public interface MicrometerEndpointBuilderFactory {
          * Path parameter: metricsName (required)
          * Name of metrics
          * 
-         * Path parameter: tags
-         * Tags of metrics
-         * 
          * @param componentName to use a custom component name for the endpoint
          * instead of the default name
          * @param path metricsType:metricsName


Reply via email to