You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2022/11/18 15:15:08 UTC

[camel] branch main updated: camel-micrometer - Register micrometer registry in compomnent lifecycle instead of per exchange that leads to race condition. Fix camel-jbang get micrometer.

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 8325855061a camel-micrometer - Register micrometer registry in compomnent lifecycle instead of per exchange that leads to race condition. Fix camel-jbang get micrometer.
8325855061a is described below

commit 8325855061abf50e3d7e55dd14c8fb785d890ee2
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Fri Nov 18 16:14:42 2022 +0100

    camel-micrometer - Register micrometer registry in compomnent lifecycle instead of per exchange that leads to race condition. Fix camel-jbang get micrometer.
---
 .../component/micrometer/MicrometerComponent.java  |  7 +++++-
 .../component/micrometer/MicrometerConsole.java    | 18 +++++++++++----
 .../micrometer/MicrometerComponentTest.java        | 27 ----------------------
 ...oprofile-metrics.joor => camel-micrometer.joor} | 14 +++++------
 .../auto-configure/camel-microprofile-metrics.joor |  2 +-
 5 files changed, 27 insertions(+), 41 deletions(-)

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 553721e509d..a1388867b36 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
@@ -49,12 +49,17 @@ public class MicrometerComponent extends DefaultComponent {
     }
 
     @Override
-    protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters) throws Exception {
+    protected void doInit() throws Exception {
+        super.doInit();
         if (metricsRegistry == null) {
             Registry camelRegistry = getCamelContext().getRegistry();
             metricsRegistry
                     = MicrometerUtils.getOrCreateMeterRegistry(camelRegistry, MicrometerConstants.METRICS_REGISTRY_NAME);
         }
+    }
+
+    @Override
+    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);
diff --git a/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/MicrometerConsole.java b/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/MicrometerConsole.java
index d67a8bf8613..6d67a20cecc 100644
--- a/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/MicrometerConsole.java
+++ b/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/MicrometerConsole.java
@@ -134,8 +134,8 @@ public class MicrometerConsole extends AbstractDevConsole {
 
         MeterRegistry mr = lookupMeterRegistry();
         int i = 0;
+        List<JsonObject> list = new ArrayList<>();
         for (Meter m : mr.getMeters()) {
-            final List<JsonObject> list = new ArrayList<>();
             if (m instanceof Counter) {
                 Counter c = (Counter) m;
                 if (i == 0) {
@@ -160,9 +160,10 @@ public class MicrometerConsole extends AbstractDevConsole {
                 list.add(jo);
             }
         }
+        list.sort(this::sortByName);
         i = 0;
+        list = new ArrayList<>();
         for (Meter m : mr.getMeters()) {
-            final List<JsonObject> list = new ArrayList<>();
             if (m instanceof Gauge) {
                 Gauge g = (Gauge) m;
                 if (i == 0) {
@@ -179,10 +180,11 @@ public class MicrometerConsole extends AbstractDevConsole {
                 list.add(jo);
             }
         }
+        list.sort(this::sortByName);
         i = 0;
+        list = new ArrayList<>();
         for (Meter m : mr.getMeters()) {
             if (m instanceof Timer) {
-                final List<JsonObject> list = new ArrayList<>();
                 Timer t = (Timer) m;
                 if (i == 0) {
                     root.put("timers", list);
@@ -201,10 +203,11 @@ public class MicrometerConsole extends AbstractDevConsole {
                 list.add(jo);
             }
         }
+        list.sort(this::sortByName);
         i = 0;
+        list = new ArrayList<>();
         for (Meter m : mr.getMeters()) {
             if (m instanceof LongTaskTimer) {
-                final List<JsonObject> list = new ArrayList<>();
                 LongTaskTimer t = (LongTaskTimer) m;
                 if (i == 0) {
                     root.put("longTaskTimers", list);
@@ -223,10 +226,11 @@ public class MicrometerConsole extends AbstractDevConsole {
                 list.add(jo);
             }
         }
+        list.sort(this::sortByName);
         i = 0;
+        list = new ArrayList<>();
         for (Meter m : mr.getMeters()) {
             if (m instanceof DistributionSummary) {
-                final List<JsonObject> list = new ArrayList<>();
                 DistributionSummary d = (DistributionSummary) m;
                 if (i == 0) {
                     root.put("distribution", list);
@@ -267,4 +271,8 @@ public class MicrometerConsole extends AbstractDevConsole {
                 MicrometerConstants.METRICS_REGISTRY_NAME);
     }
 
+    private int sortByName(JsonObject o1, JsonObject o2) {
+        return o1.getString("name").compareToIgnoreCase(o2.getString("name"));
+    }
+
 }
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 142004e9dfd..db3a7f5003c 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
@@ -17,8 +17,6 @@
 package org.apache.camel.component.micrometer;
 
 import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
 
 import io.micrometer.core.instrument.Meter;
 import io.micrometer.core.instrument.MeterRegistry;
@@ -69,31 +67,6 @@ public class MicrometerComponentTest {
         inOrder = Mockito.inOrder(camelContext, camelRegistry, metricRegistry, typeConverter);
     }
 
-    @Test
-    public void testCreateEndpoint() throws Exception {
-        component.setCamelContext(camelContext);
-        when(camelContext.getRegistry()).thenReturn(camelRegistry);
-        when(camelContext.getTypeConverter()).thenReturn(typeConverter);
-        when(typeConverter.convertTo(String.class, "key=value")).thenReturn("key=value");
-        when(camelRegistry.lookupByNameAndType(MicrometerConstants.METRICS_REGISTRY_NAME, MeterRegistry.class))
-                .thenReturn(metricRegistry);
-
-        Map<String, Object> params = new HashMap<>();
-        params.put("tags", "key=value");
-        Endpoint result = component.createEndpoint("micrometer:counter:counter", "counter:counter", params);
-        assertThat(result, is(notNullValue()));
-        assertThat(result, is(instanceOf(MicrometerEndpoint.class)));
-        MicrometerEndpoint me = (MicrometerEndpoint) result;
-        assertThat(me.getMetricsName(), is("counter"));
-        assertThat(me.getRegistry(), is(metricRegistry));
-        inOrder.verify(camelContext, times(1)).getRegistry();
-        inOrder.verify(camelRegistry, times(1)).lookupByNameAndType(MicrometerConstants.METRICS_REGISTRY_NAME,
-                MeterRegistry.class);
-        inOrder.verify(camelContext, times(1)).getTypeConverter();
-        inOrder.verify(typeConverter, times(1)).convertTo(String.class, "key=value");
-        inOrder.verifyNoMoreInteractions();
-    }
-
     @Test
     public void testCreateNewEndpointForCounter() {
         Endpoint endpoint = new MicrometerEndpoint(null, null, metricRegistry, Meter.Type.COUNTER, "a name", Tags.empty());
diff --git a/dsl/camel-kamelet-main/src/main/resources/auto-configure/camel-microprofile-metrics.joor b/dsl/camel-kamelet-main/src/main/resources/auto-configure/camel-micrometer.joor
similarity index 68%
copy from dsl/camel-kamelet-main/src/main/resources/auto-configure/camel-microprofile-metrics.joor
copy to dsl/camel-kamelet-main/src/main/resources/auto-configure/camel-micrometer.joor
index 0927fde9e1b..5df2b7438b4 100644
--- a/dsl/camel-kamelet-main/src/main/resources/auto-configure/camel-microprofile-metrics.joor
+++ b/dsl/camel-kamelet-main/src/main/resources/auto-configure/camel-micrometer.joor
@@ -16,20 +16,20 @@
  */
 var answer = "";
 var registry = context.getRegistry();
-var mr = registry.lookupByNameAndType("metricRegistry", org.eclipse.microprofile.metrics.MetricRegistry.class);
+var mr = registry.lookupByNameAndType("metricsRegistry", io.micrometer.core.instrument.MeterRegistry.class);
 if (mr == null) {
     // automatic create metrics registry
-    answer = "Auto-configuring camel-microprofile-metrics: Creating default MetricRegistry";
-    mr = new io.smallrye.metrics.MetricRegistries().getApplicationRegistry();
-    registry.bind("metricRegistry", mr);
+    answer = "Auto-configuring camel-micrometer: Creating default MeterRegistry";
+    mr = new io.micrometer.core.instrument.simple.SimpleMeterRegistry();
+    registry.bind("metricsRegistry", mr);
     // also setup metrics as route policy factory to capture route level details
-    var rpf = new org.apache.camel.component.microprofile.metrics.route.policy.MicroProfileMetricsRoutePolicyFactory();
-    rpf.setMetricRegistry(mr);
+    var rpf = new org.apache.camel.component.micrometer.routepolicy.MicrometerRoutePolicyFactory();
+    rpf.setMeterRegistry(mr);
     context.addRoutePolicyFactory(rpf);
     // and setup dev console
     var dcr = context.getExtension(org.apache.camel.console.DevConsoleRegistry.class);
     if (dcr != null) {
-        dcr.resolveById("microprofile-metrics");
+        dcr.register(new org.apache.camel.component.micrometer.MicrometerConsole());
     }
 }
 return answer;
\ No newline at end of file
diff --git a/dsl/camel-kamelet-main/src/main/resources/auto-configure/camel-microprofile-metrics.joor b/dsl/camel-kamelet-main/src/main/resources/auto-configure/camel-microprofile-metrics.joor
index 0927fde9e1b..a24d5c04a3f 100644
--- a/dsl/camel-kamelet-main/src/main/resources/auto-configure/camel-microprofile-metrics.joor
+++ b/dsl/camel-kamelet-main/src/main/resources/auto-configure/camel-microprofile-metrics.joor
@@ -29,7 +29,7 @@ if (mr == null) {
     // and setup dev console
     var dcr = context.getExtension(org.apache.camel.console.DevConsoleRegistry.class);
     if (dcr != null) {
-        dcr.resolveById("microprofile-metrics");
+        dcr.register(new org.apache.camel.component.microprofile.metrics.MicroProfileConsole());
     }
 }
 return answer;
\ No newline at end of file