You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by al...@apache.org on 2023/08/22 16:41:35 UTC

[camel-quarkus] branch main updated: Micrometer: Message History factory and JMX MicrometerMessageHistory is not covered (#5210)

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

aldettinger pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git


The following commit(s) were added to refs/heads/main by this push:
     new c5d367f457 Micrometer: Message History factory and JMX MicrometerMessageHistory is not covered (#5210)
c5d367f457 is described below

commit c5d367f4578ec7047f34f7a22278d9da020ff885
Author: James Netherton <ja...@users.noreply.github.com>
AuthorDate: Tue Aug 22 17:41:29 2023 +0100

    Micrometer: Message History factory and JMX MicrometerMessageHistory is not covered (#5210)
    
    Fixes #5050
    
    Co-authored-by: JiriOndrusek <on...@gmail.com>
---
 .../pages/reference/extensions/micrometer.adoc     | 15 +++++--
 .../runtime/src/main/doc/limitations.adoc          | 10 ++++-
 .../micrometer/runtime/src/main/doc/usage.adoc     |  2 +-
 integration-tests/micrometer/pom.xml               |  4 ++
 .../micrometer/it/MicrometerProducers.java         |  6 +--
 .../micrometer/it/MicrometerResource.java          | 31 +++++++++++---
 .../component/micrometer/it/MicrometerRoutes.java  |  9 ++--
 .../component/micrometer/it/MicrometerTest.java    | 50 ++++++++++++++++++++--
 .../it/NoMessageHistoryMicrometerTest.java         | 36 ++++++++++++++++
 .../micrometer/it/NoMessageHistoryProfile.java     | 29 +++++++++++++
 10 files changed, 170 insertions(+), 22 deletions(-)

diff --git a/docs/modules/ROOT/pages/reference/extensions/micrometer.adoc b/docs/modules/ROOT/pages/reference/extensions/micrometer.adoc
index 6c220fca2b..70911002fd 100644
--- a/docs/modules/ROOT/pages/reference/extensions/micrometer.adoc
+++ b/docs/modules/ROOT/pages/reference/extensions/micrometer.adoc
@@ -58,22 +58,29 @@ Your application should declare the following dependency or  one of the dependen
 </dependency>
 ----
 
-If no dependency is declared, the Micrometer extension creates a SimpleMeterRegistry instance, suitable mainly for testing.
+If no dependency is declared, the Micrometer extension creates a `SimpleMeterRegistry` instance, suitable mainly for testing.
 
 
 [id="extensions-micrometer-camel-quarkus-limitations"]
 == Camel Quarkus limitations
 
-[id="extensions-micrometer-limitations-exposing-micrometer-statisctics-in-jmx"]
-=== Exposing Micrometer statisctics in JMX
+[id="extensions-micrometer-limitations-exposing-micrometer-statistics-in-jmx"]
+=== Exposing Micrometer statistics in JMX
 
-The `Exposing Micrometer statisctics in JMX` action is not available in native mode as JMX is not supported on GraalVM.
+Exposing Micrometer statistics in JMX is not available in native mode as `quarkus-micrometer-registry-jmx` does not
+have native support at present.
 
 [id="extensions-micrometer-limitations-decrement-header-for-counter-is-ignored-by-prometheus"]
 === Decrement header for Counter is ignored by Prometheus
 
 Prometheus backend ignores negative values during increment of Counter metrics.
 
+[id="extensions-micrometer-limitations-exposing-statistics-in-jmx"]
+=== Exposing statistics in JMX ===
+
+In {project-name}, registering a `JmxMeterRegistry` is simplified. Add a dependency for
+`io.quarkiverse.micrometer.registry:quarkus-micrometer-registry-jmx` and a `JmxMeterRegistry` will automatically
+get created for you.
 
 
 [id="extensions-micrometer-additional-camel-quarkus-configuration"]
diff --git a/extensions/micrometer/runtime/src/main/doc/limitations.adoc b/extensions/micrometer/runtime/src/main/doc/limitations.adoc
index 0b019beb5b..2edf56ebdb 100644
--- a/extensions/micrometer/runtime/src/main/doc/limitations.adoc
+++ b/extensions/micrometer/runtime/src/main/doc/limitations.adoc
@@ -1,8 +1,14 @@
-=== Exposing Micrometer statisctics in JMX
+=== Exposing Micrometer statistics in JMX
 
-The `Exposing Micrometer statisctics in JMX` action is not available in native mode as JMX is not supported on GraalVM.
+Exposing Micrometer statistics in JMX is not available in native mode as `quarkus-micrometer-registry-jmx` does not
+have native support at present.
 
 === Decrement header for Counter is ignored by Prometheus
 
 Prometheus backend ignores negative values during increment of Counter metrics.
 
+=== Exposing statistics in JMX ===
+
+In {project-name}, registering a `JmxMeterRegistry` is simplified. Add a dependency for
+`io.quarkiverse.micrometer.registry:quarkus-micrometer-registry-jmx` and a `JmxMeterRegistry` will automatically
+get created for you.
diff --git a/extensions/micrometer/runtime/src/main/doc/usage.adoc b/extensions/micrometer/runtime/src/main/doc/usage.adoc
index e4d485e32f..4d6a2b4d7a 100644
--- a/extensions/micrometer/runtime/src/main/doc/usage.adoc
+++ b/extensions/micrometer/runtime/src/main/doc/usage.adoc
@@ -10,4 +10,4 @@ Your application should declare the following dependency or  one of the dependen
 </dependency>
 ----
 
-If no dependency is declared, the Micrometer extension creates a SimpleMeterRegistry instance, suitable mainly for testing.
\ No newline at end of file
+If no dependency is declared, the Micrometer extension creates a `SimpleMeterRegistry` instance, suitable mainly for testing.
diff --git a/integration-tests/micrometer/pom.xml b/integration-tests/micrometer/pom.xml
index fb156d5de7..92da57b5a1 100644
--- a/integration-tests/micrometer/pom.xml
+++ b/integration-tests/micrometer/pom.xml
@@ -47,6 +47,10 @@
             <groupId>org.apache.camel.quarkus</groupId>
             <artifactId>camel-quarkus-bean</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.apache.camel.quarkus</groupId>
+            <artifactId>camel-quarkus-management</artifactId>
+        </dependency>
         <dependency>
             <groupId>io.micrometer</groupId>
             <artifactId>micrometer-registry-prometheus</artifactId>
diff --git a/integration-tests/micrometer/src/main/java/org/apache/camel/quarkus/component/micrometer/it/MicrometerProducers.java b/integration-tests/micrometer/src/main/java/org/apache/camel/quarkus/component/micrometer/it/MicrometerProducers.java
index 3d64957055..a4779e71ed 100644
--- a/integration-tests/micrometer/src/main/java/org/apache/camel/quarkus/component/micrometer/it/MicrometerProducers.java
+++ b/integration-tests/micrometer/src/main/java/org/apache/camel/quarkus/component/micrometer/it/MicrometerProducers.java
@@ -16,7 +16,7 @@
  */
 package org.apache.camel.quarkus.component.micrometer.it;
 
-import java.util.Arrays;
+import java.util.List;
 
 import io.micrometer.core.instrument.Clock;
 import io.micrometer.core.instrument.Meter;
@@ -40,7 +40,7 @@ public class MicrometerProducers {
     @Produces
     @Singleton
     @IfBuildProfile("test")
-    public MeterRegistry registry(Clock clock) {
+    public MeterRegistry registry() {
         return new JmxMeterRegistry(CamelJmxConfig.DEFAULT, Clock.SYSTEM, HierarchicalNameMapper.DEFAULT);
     }
 
@@ -48,7 +48,7 @@ public class MicrometerProducers {
     @Singleton
     @MeterFilterConstraint(applyTo = PrometheusMeterRegistry.class)
     public MeterFilter configurePrometheusRegistries() {
-        return MeterFilter.commonTags(Arrays.asList(
+        return MeterFilter.commonTags(List.of(
                 Tag.of("customTag", "prometheus")));
     }
 
diff --git a/integration-tests/micrometer/src/main/java/org/apache/camel/quarkus/component/micrometer/it/MicrometerResource.java b/integration-tests/micrometer/src/main/java/org/apache/camel/quarkus/component/micrometer/it/MicrometerResource.java
index b82a5c0917..fd7906e808 100644
--- a/integration-tests/micrometer/src/main/java/org/apache/camel/quarkus/component/micrometer/it/MicrometerResource.java
+++ b/integration-tests/micrometer/src/main/java/org/apache/camel/quarkus/component/micrometer/it/MicrometerResource.java
@@ -21,7 +21,6 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.NoSuchElementException;
 import java.util.concurrent.TimeUnit;
-import java.util.stream.Collectors;
 
 import io.micrometer.core.instrument.MeterRegistry;
 import io.micrometer.core.instrument.Tag;
@@ -42,6 +41,7 @@ import org.apache.camel.ProducerTemplate;
 import org.apache.camel.component.micrometer.MicrometerComponent;
 import org.apache.camel.component.micrometer.MicrometerConstants;
 import org.apache.camel.component.micrometer.eventnotifier.MicrometerEventNotifierService;
+import org.apache.camel.component.micrometer.messagehistory.MicrometerMessageHistoryService;
 
 @Path("/micrometer")
 public class MicrometerResource {
@@ -139,10 +139,7 @@ public class MicrometerResource {
             producerTemplate.sendBodyAndHeader(path, null, MicrometerConstants.HEADER_COUNTER_INCREMENT, increment);
         } else if (increment < 0) {
             producerTemplate.sendBodyAndHeader(path, null, MicrometerConstants.HEADER_COUNTER_DECREMENT,
-                    0 - increment);
-            List l = meterRegistry.getMeters().stream().filter(m -> m.getId().getName().contains("executor"))
-                    .collect(Collectors.toList());//forEach(System.out::println);
-            System.out.println(l);
+                    -increment);
         } else {
             producerTemplate.sendBody(path, null);
         }
@@ -178,6 +175,17 @@ public class MicrometerResource {
         return Response.ok().entity(json).build();
     }
 
+    @Path("/history")
+    @GET
+    public Response history() {
+        MicrometerMessageHistoryService service = camelContext.hasService(MicrometerMessageHistoryService.class);
+        if (service == null) {
+            return Response.status(500).entity("History is null").build();
+        }
+        String json = service.dumpStatisticsAsJson();
+        return Response.ok().entity(json).build();
+    }
+
     @Path("/annotations/call/{number}")
     @GET
     public Response annotationsCall(@PathParam("number") int number) {
@@ -185,6 +193,19 @@ public class MicrometerResource {
         return Response.ok().build();
     }
 
+    @Path("/getContextManagementName")
+    @GET
+    public Response getContextManagemetName() throws Exception {
+        return Response.ok().entity(camelContext.getManagementName()).build();
+    }
+
+    @Path("/sendJmxHistory")
+    @GET
+    public Response annotationsCall() {
+        producerTemplate.sendBody("direct:jmxHistory", "hello");
+        return Response.ok().build();
+    }
+
     @Path("/gauge/{number}")
     @GET
     public Response gauge(@PathParam("number") int number) {
diff --git a/integration-tests/micrometer/src/main/java/org/apache/camel/quarkus/component/micrometer/it/MicrometerRoutes.java b/integration-tests/micrometer/src/main/java/org/apache/camel/quarkus/component/micrometer/it/MicrometerRoutes.java
index 5e4bba44b4..64d50941e3 100644
--- a/integration-tests/micrometer/src/main/java/org/apache/camel/quarkus/component/micrometer/it/MicrometerRoutes.java
+++ b/integration-tests/micrometer/src/main/java/org/apache/camel/quarkus/component/micrometer/it/MicrometerRoutes.java
@@ -17,8 +17,7 @@
 package org.apache.camel.quarkus.component.micrometer.it;
 
 import org.apache.camel.builder.RouteBuilder;
-
-import static org.apache.camel.component.micrometer.MicrometerConstants.HEADER_HISTOGRAM_VALUE;
+import org.apache.camel.component.micrometer.MicrometerConstants;
 
 public class MicrometerRoutes extends RouteBuilder {
 
@@ -34,7 +33,7 @@ public class MicrometerRoutes extends RouteBuilder {
                 .to("micrometerCustom:counter:camel-quarkus-custom-counter");
 
         from("direct:summary")
-                .setHeader(HEADER_HISTOGRAM_VALUE, simple("${body}"))
+                .setHeader(MicrometerConstants.HEADER_HISTOGRAM_VALUE, simple("${body}"))
                 .to("micrometer:summary:camel-quarkus-summary");
 
         from("direct:timer")
@@ -52,5 +51,9 @@ public class MicrometerRoutes extends RouteBuilder {
                 .otherwise().bean("testMetric", "call2")
                 .end();
 
+        from("direct:jmxHistory")
+                .id("jmxHistory")
+                .log("log: ${body}");
+
     }
 }
diff --git a/integration-tests/micrometer/src/test/java/org/apache/camel/quarkus/component/micrometer/it/MicrometerTest.java b/integration-tests/micrometer/src/test/java/org/apache/camel/quarkus/component/micrometer/it/MicrometerTest.java
index ccc6b4d31b..ac9b1f66e4 100644
--- a/integration-tests/micrometer/src/test/java/org/apache/camel/quarkus/component/micrometer/it/MicrometerTest.java
+++ b/integration-tests/micrometer/src/test/java/org/apache/camel/quarkus/component/micrometer/it/MicrometerTest.java
@@ -78,7 +78,7 @@ class MicrometerTest extends AbstractMicrometerTest {
                 .then()
                 .statusCode(200);
         //component with Quarkus's registry should still see only 1 from the first call
-        assertEquals(1, getMetricValue(Integer.class, "counter", "camel-quarkus-custom-counter", null, 200, null));
+        assertEquals(1, getMetricValue(Integer.class, "counter", "camel-quarkus-custom-counter"));
         //component with custom registry should be on 11 see only 1 from the first call
         assertEquals(11, getMetricValue(Integer.class, "counter", "camel-quarkus-custom-counter", null, 200, "custom"));
     }
@@ -186,14 +186,14 @@ class MicrometerTest extends AbstractMicrometerTest {
 
         assertEquals(result.size(), 2);
         assertTrue(result.containsKey("camel.routes.running"));
-        assertEquals(7.0f, result.get("camel.routes.running"));
+        assertEquals(8.0f, result.get("camel.routes.running"));
         assertTrue(result.containsKey("camel.routes.added"));
-        assertEquals(7.0f, result.get("camel.routes.added"));
+        assertEquals(8.0f, result.get("camel.routes.added"));
     }
 
     @ParameterizedTest
     @ValueSource(strings = { "metrics", "org.apache.camel.micrometer" }) //test uses domains from both default and custom JMX registries
-    @DisabledOnIntegrationTest // JMX is not supported in native mode
+    @DisabledOnIntegrationTest("https://github.com/apache/camel-quarkus/issues/5209")
     public void testJMXQuarkusDomain(String domain) throws Exception {
         MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
 
@@ -207,4 +207,46 @@ class MicrometerTest extends AbstractMicrometerTest {
                 .getValue();
         assertTrue(classes > 1);
     }
+
+    @Test
+    @DisabledOnIntegrationTest("https://github.com/apache/camel-quarkus/issues/5209")
+    public void micrometerHistoryShouldBeAvailableThroughJMX() throws Exception {
+        //send a message to init history for the route with id `jmxHistory`
+        RestAssured.get("/micrometer/sendJmxHistory")
+                .then()
+                .statusCode(200);
+
+        String contextManagementName = RestAssured.get("/micrometer/getContextManagementName")
+                .then()
+                .statusCode(200)
+                .extract().body().asString();
+
+        // get the message history service using JMX
+        String name = String.format("org.apache.camel:context=%s,type=services,name=MicrometerMessageHistoryService",
+                contextManagementName);
+
+        MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
+
+        ObjectName on = ObjectName.getInstance(name);
+
+        //return json result
+        String json = (String) mBeanServer.invoke(on, "dumpStatisticsAsJson", null, null);
+
+        assertTrue(json.contains("jmxHistory"));
+
+    }
+
+    @Test
+    public void micrometerHistoryShouldBeAvailableThroughCamelContext() throws Exception {
+        JsonPath jsonPath = RestAssured.get("/micrometer/history")
+                .then()
+                .statusCode(200)
+                .extract().jsonPath();
+
+        //assert that jason contains some history paths
+        assertNotNull(jsonPath.get("timers"));
+        assertNotNull(jsonPath.get("counters"));
+        assertNotNull(jsonPath.get("gauges"));
+    }
+
 }
diff --git a/integration-tests/micrometer/src/test/java/org/apache/camel/quarkus/component/micrometer/it/NoMessageHistoryMicrometerTest.java b/integration-tests/micrometer/src/test/java/org/apache/camel/quarkus/component/micrometer/it/NoMessageHistoryMicrometerTest.java
new file mode 100644
index 0000000000..123e72c3a9
--- /dev/null
+++ b/integration-tests/micrometer/src/test/java/org/apache/camel/quarkus/component/micrometer/it/NoMessageHistoryMicrometerTest.java
@@ -0,0 +1,36 @@
+/*
+ * 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.quarkus.component.micrometer.it;
+
+import io.quarkus.test.junit.QuarkusTest;
+import io.quarkus.test.junit.TestProfile;
+import io.restassured.RestAssured;
+import org.hamcrest.Matchers;
+import org.junit.jupiter.api.Test;
+
+@QuarkusTest
+@TestProfile(NoMessageHistoryProfile.class)
+class NoMessageHistoryMicrometerTest extends AbstractMicrometerTest {
+
+    @Test
+    public void testNoHistory() {
+        RestAssured.get("/micrometer/history")
+                .then()
+                .statusCode(500)
+                .body(Matchers.is("History is null"));
+    }
+}
diff --git a/integration-tests/micrometer/src/test/java/org/apache/camel/quarkus/component/micrometer/it/NoMessageHistoryProfile.java b/integration-tests/micrometer/src/test/java/org/apache/camel/quarkus/component/micrometer/it/NoMessageHistoryProfile.java
new file mode 100644
index 0000000000..6c9c6e7382
--- /dev/null
+++ b/integration-tests/micrometer/src/test/java/org/apache/camel/quarkus/component/micrometer/it/NoMessageHistoryProfile.java
@@ -0,0 +1,29 @@
+/*
+ * 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.quarkus.component.micrometer.it;
+
+import java.util.Map;
+
+import io.quarkus.test.junit.QuarkusTestProfile;
+
+public class NoMessageHistoryProfile implements QuarkusTestProfile {
+
+    @Override
+    public Map<String, String> getConfigOverrides() {
+        return Map.of("quarkus.camel.metrics.enable-message-history", "false");
+    }
+}