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
commit 91c68bd69788efc5ad0f660619fbcdb20d193799 Author: Claus Ibsen <[email protected]> AuthorDate: Wed Oct 26 13:17:53 2022 +0200 CAMEL-18650: camel-micrometer - Add dev console. Reuse created MetricRegistry if none exists. --- components/camel-micrometer/pom.xml | 10 +- .../org/apache/camel/dev-console/micrometer | 2 + .../component/micrometer/MicrometerConsole.java | 188 +++++++++++++++++++++ .../component/micrometer/MicrometerEndpoint.java | 2 +- .../component/micrometer/MicrometerUtils.java | 12 +- .../micrometer/MicrometerComponentTest.java | 13 -- .../messagehistory/ManagedMessageHistoryTest.java | 1 - 7 files changed, 206 insertions(+), 22 deletions(-) diff --git a/components/camel-micrometer/pom.xml b/components/camel-micrometer/pom.xml index 4f9642a51bd..938c73f76df 100644 --- a/components/camel-micrometer/pom.xml +++ b/components/camel-micrometer/pom.xml @@ -38,9 +38,10 @@ <artifactId>camel-support</artifactId> </dependency> <dependency> - <groupId>com.fasterxml.jackson.core</groupId> - <artifactId>jackson-databind</artifactId> + <groupId>org.apache.camel</groupId> + <artifactId>camel-console</artifactId> </dependency> + <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-core</artifactId> @@ -53,6 +54,11 @@ <optional>true</optional> </dependency> + <dependency> + <groupId>com.fasterxml.jackson.core</groupId> + <artifactId>jackson-databind</artifactId> + </dependency> + <!-- testing --> <dependency> <groupId>org.apache.camel</groupId> diff --git a/components/camel-micrometer/src/generated/resources/META-INF/services/org/apache/camel/dev-console/micrometer b/components/camel-micrometer/src/generated/resources/META-INF/services/org/apache/camel/dev-console/micrometer new file mode 100644 index 00000000000..6d80ff62594 --- /dev/null +++ b/components/camel-micrometer/src/generated/resources/META-INF/services/org/apache/camel/dev-console/micrometer @@ -0,0 +1,2 @@ +# Generated by camel build tools - do NOT edit this file! +class=org.apache.camel.component.micrometer.MicrometerConsole 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 new file mode 100644 index 00000000000..021b7073c74 --- /dev/null +++ b/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/MicrometerConsole.java @@ -0,0 +1,188 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.micrometer; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +import io.micrometer.core.instrument.Counter; +import io.micrometer.core.instrument.DistributionSummary; +import io.micrometer.core.instrument.Gauge; +import io.micrometer.core.instrument.LongTaskTimer; +import io.micrometer.core.instrument.Meter; +import io.micrometer.core.instrument.MeterRegistry; +import org.apache.camel.impl.console.AbstractDevConsole; +import org.apache.camel.spi.annotations.DevConsole; +import org.apache.camel.util.json.JsonObject; + +@DevConsole("micrometer") +public class MicrometerConsole extends AbstractDevConsole { + + public MicrometerConsole() { + super("camel", "micrometer", "Micrometer", "Display runtime metrics"); + } + + @Override + protected String doCallText(Map<String, Object> options) { + StringBuilder sb = new StringBuilder(); + + MeterRegistry mr = lookupMeterRegistry(); + int i = 0; + for (Meter m : mr.getMeters()) { + if (m instanceof Counter) { + Counter c = (Counter) m; + if (i == 0) { + sb.append("Counters:\n"); + } + i++; + String name = c.getId().getName(); + double cnt = c.count(); + sb.append(String.format(" %s: %s\n", name, cnt)); + } + } + i = 0; + for (Meter m : mr.getMeters()) { + if (m instanceof Gauge) { + Gauge g = (Gauge) m; + if (i == 0) { + sb.append("\nGauges:\n"); + } + i++; + String name = g.getId().getName(); + double cnt = g.value(); + sb.append(String.format(" %s: %s\n", name, cnt)); + } + } + i = 0; + for (Meter m : mr.getMeters()) { + if (m instanceof LongTaskTimer) { + LongTaskTimer t = (LongTaskTimer) m; + if (i == 0) { + sb.append("\nLongTaskTimer:\n"); + } + i++; + String name = t.getId().getName(); + int tasks = t.activeTasks(); + double mean = t.mean(TimeUnit.MILLISECONDS); + double max = t.max(TimeUnit.MILLISECONDS); + double duration = t.duration(TimeUnit.MILLISECONDS); + sb.append(String.format(" %s: %d (duration: %f mean: %f max: %f)\n", name, tasks, duration, mean, max)); + } + } + i = 0; + for (Meter m : mr.getMeters()) { + if (m instanceof DistributionSummary) { + DistributionSummary d = (DistributionSummary) m; + if (i == 0) { + sb.append("\nDistributionSummary:\n"); + } + i++; + String name = d.getId().getName(); + long count = d.count(); + double mean = d.mean(); + double max = d.max(); + double total = d.totalAmount(); + sb.append(String.format(" %s: %d (total: %f mean: %f max: %f)\n", name, count, total, mean, max)); + } + } + + return sb.toString(); + } + + @Override + protected JsonObject doCallJson(Map<String, Object> options) { + JsonObject root = new JsonObject(); + + MeterRegistry mr = lookupMeterRegistry(); + int i = 0; + for (Meter m : mr.getMeters()) { + final List<JsonObject> list = new ArrayList<>(); + if (m instanceof Counter) { + Counter c = (Counter) m; + if (i == 0) { + root.put("counters", list); + } + i++; + JsonObject jo = new JsonObject(); + jo.put("name", c.getId().getName()); + jo.put("count", c.count()); + list.add(jo); + } + } + i = 0; + for (Meter m : mr.getMeters()) { + final List<JsonObject> list = new ArrayList<>(); + if (m instanceof Gauge) { + Gauge g = (Gauge) m; + if (i == 0) { + root.put("gauges", list); + } + i++; + JsonObject jo = new JsonObject(); + jo.put("name", g.getId().getName()); + jo.put("value", g.value()); + list.add(jo); + } + } + i = 0; + for (Meter m : mr.getMeters()) { + if (m instanceof LongTaskTimer) { + final List<JsonObject> list = new ArrayList<>(); + LongTaskTimer t = (LongTaskTimer) m; + if (i == 0) { + root.put("timers", list); + } + i++; + JsonObject jo = new JsonObject(); + jo.put("name", t.getId().getName()); + jo.put("activeTasks", t.activeTasks()); + jo.put("mean", t.mean(TimeUnit.MILLISECONDS)); + jo.put("max", t.max(TimeUnit.MILLISECONDS)); + jo.put("duration", t.duration(TimeUnit.MILLISECONDS)); + list.add(jo); + } + } + i = 0; + 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); + } + i++; + JsonObject jo = new JsonObject(); + jo.put("name", d.getId().getName()); + jo.put("count", d.count()); + jo.put("mean", d.mean()); + jo.put("max", d.max()); + jo.put("totalAmount", d.totalAmount()); + list.add(jo); + } + } + + return root; + } + + private MeterRegistry lookupMeterRegistry() { + return MicrometerUtils.getOrCreateMeterRegistry(getCamelContext().getRegistry(), + MicrometerConstants.METRICS_REGISTRY_NAME); + } + +} 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 f459a2cfe13..a2ca49af90f 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 @@ -41,7 +41,7 @@ public class MicrometerEndpoint extends DefaultEndpoint { protected MeterRegistry registry; - @UriPath(description = "Type of metrics", enums = "counter, distribution_summary, timer") + @UriPath(description = "Type of metrics", enums = "counter,distribution_summary,timer") @Metadata(required = true) protected final Meter.Type metricsType; @UriPath(description = "Name of metrics") diff --git a/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/MicrometerUtils.java b/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/MicrometerUtils.java index 4639a440f7d..3236043a697 100644 --- a/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/MicrometerUtils.java +++ b/components/camel-micrometer/src/main/java/org/apache/camel/component/micrometer/MicrometerUtils.java @@ -56,13 +56,15 @@ public abstract class MicrometerUtils { } } - public static MeterRegistry getOrCreateMeterRegistry(Registry camelRegistry, String registryName) { - LOG.debug("Looking up MeterRegistry from Camel Registry for name \"{}\"", registryName); - MeterRegistry result = getMeterRegistryFromCamelRegistry(camelRegistry, registryName); + public static MeterRegistry getOrCreateMeterRegistry(Registry camelRegistry, String name) { + MeterRegistry result = getMeterRegistryFromCamelRegistry(camelRegistry, name); if (result == null) { - LOG.debug("MeterRegistry not found from Camel Registry for name \"{}\"", registryName); - LOG.info("Creating new default MeterRegistry"); + LOG.debug("Creating new MeterRegistry: {}", name); result = createMeterRegistry(); + // enlist in registry so it can be reused + camelRegistry.bind(name, result); + } else { + LOG.debug("Using existing MeterRegistry: {}", name); } return result; } 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 1698b2de9d6..142004e9dfd 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 @@ -39,7 +39,6 @@ import org.mockito.junit.jupiter.MockitoExtension; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.instanceOf; import static org.hamcrest.Matchers.is; -import static org.hamcrest.Matchers.not; import static org.hamcrest.Matchers.notNullValue; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.Mockito.times; @@ -156,18 +155,6 @@ public class MicrometerComponentTest { inOrder.verifyNoMoreInteractions(); } - @Test - public void testGetOrCreateMetricRegistryNotFoundInCamelRegistry() { - when(camelRegistry.lookupByNameAndType("name", MeterRegistry.class)).thenReturn(null); - when(camelRegistry.findByType(MeterRegistry.class)).thenReturn(Collections.emptySet()); - MeterRegistry result = MicrometerUtils.getOrCreateMeterRegistry(camelRegistry, "name"); - assertThat(result, is(notNullValue())); - assertThat(result, is(not(metricRegistry))); - inOrder.verify(camelRegistry, times(1)).lookupByNameAndType("name", MeterRegistry.class); - inOrder.verify(camelRegistry, times(1)).findByType(MeterRegistry.class); - inOrder.verifyNoMoreInteractions(); - } - @Test public void testGetMetricRegistryFromCamelRegistry() { when(camelRegistry.lookupByNameAndType("name", MeterRegistry.class)).thenReturn(metricRegistry); diff --git a/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/messagehistory/ManagedMessageHistoryTest.java b/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/messagehistory/ManagedMessageHistoryTest.java index 548530e862f..ce1e0bd1993 100644 --- a/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/messagehistory/ManagedMessageHistoryTest.java +++ b/components/camel-micrometer/src/test/java/org/apache/camel/component/micrometer/messagehistory/ManagedMessageHistoryTest.java @@ -99,7 +99,6 @@ public class ManagedMessageHistoryTest extends CamelTestSupport { // there should be 3 mbeans Set<ObjectName> set = getMBeanServer().queryNames(new ObjectName("org.apache.camel.micrometer:type=timers,name=*"), null); - System.out.println(set); assertEquals(3, set.size()); ObjectName fooMBean = set.stream().filter(on -> on.getCanonicalName().contains("foo")).findFirst()
