This is an automated email from the ASF dual-hosted git repository.
jamesnetherton 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 a062850c70 Add native Micrometer JMX tests
a062850c70 is described below
commit a062850c7006449d41c197c71071cfd831a4b03c
Author: Ramu <[email protected]>
AuthorDate: Tue Sep 1 16:27:48 2026 +0530
Add native Micrometer JMX tests
Fixes #5209.
---
.../pages/reference/extensions/micrometer.adoc | 6 --
.../runtime/src/main/doc/limitations.adoc | 5 --
.../micrometer/it/MicrometerProducers.java | 2 -
.../micrometer/it/MicrometerResource.java | 72 ++++++++++++++++++++++
.../src/main/resources/application.properties | 4 +-
.../component/micrometer/it/MicrometerTest.java | 62 ++++++++++---------
6 files changed, 108 insertions(+), 43 deletions(-)
diff --git a/docs/modules/ROOT/pages/reference/extensions/micrometer.adoc
b/docs/modules/ROOT/pages/reference/extensions/micrometer.adoc
index ed138dd304..f1aa099f03 100644
--- a/docs/modules/ROOT/pages/reference/extensions/micrometer.adoc
+++ b/docs/modules/ROOT/pages/reference/extensions/micrometer.adoc
@@ -64,12 +64,6 @@ If no dependency is declared, the Micrometer extension
creates a `SimpleMeterReg
[id="extensions-micrometer-camel-quarkus-limitations"]
== Camel Quarkus limitations
-[id="extensions-micrometer-limitations-exposing-micrometer-statistics-in-jmx"]
-=== Exposing Micrometer statistics in JMX
-
-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
diff --git a/extensions/micrometer/runtime/src/main/doc/limitations.adoc
b/extensions/micrometer/runtime/src/main/doc/limitations.adoc
index 2edf56ebdb..25a3e02b97 100644
--- a/extensions/micrometer/runtime/src/main/doc/limitations.adoc
+++ b/extensions/micrometer/runtime/src/main/doc/limitations.adoc
@@ -1,8 +1,3 @@
-=== Exposing Micrometer statistics in JMX
-
-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.
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 a4779e71ed..2d6e75622e 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
@@ -27,7 +27,6 @@ import
io.micrometer.core.instrument.simple.SimpleMeterRegistry;
import io.micrometer.core.instrument.util.HierarchicalNameMapper;
import io.micrometer.jmx.JmxMeterRegistry;
import io.micrometer.prometheus.PrometheusMeterRegistry;
-import io.quarkus.arc.profile.IfBuildProfile;
import io.quarkus.micrometer.runtime.MeterFilterConstraint;
import jakarta.enterprise.inject.Produces;
import jakarta.inject.Named;
@@ -39,7 +38,6 @@ public class MicrometerProducers {
@Produces
@Singleton
- @IfBuildProfile("test")
public MeterRegistry registry() {
return new JmxMeterRegistry(CamelJmxConfig.DEFAULT, Clock.SYSTEM,
HierarchicalNameMapper.DEFAULT);
}
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 50b24d0bb6..70dde2786d 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
@@ -16,14 +16,25 @@
*/
package org.apache.camel.quarkus.component.micrometer.it;
+import java.lang.management.ManagementFactory;
import java.util.ArrayList;
import java.util.HashMap;
+import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.NoSuchElementException;
+import java.util.Set;
import java.util.concurrent.TimeUnit;
+import javax.management.Attribute;
+import javax.management.AttributeList;
+import javax.management.AttributeNotFoundException;
+import javax.management.MBeanServer;
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectInstance;
+import javax.management.ObjectName;
+
import io.micrometer.core.instrument.Gauge;
import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.Tag;
@@ -33,6 +44,7 @@ import io.micrometer.prometheus.PrometheusMeterRegistry;
import jakarta.inject.Inject;
import jakarta.inject.Named;
import jakarta.ws.rs.GET;
+import jakarta.ws.rs.POST;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.PathParam;
import jakarta.ws.rs.Produces;
@@ -247,4 +259,64 @@ public class MicrometerResource {
}
return Response.ok(tags).build();
}
+
+ @GET
+ @Path("/mbeans")
+ @Produces(MediaType.TEXT_PLAIN)
+ public int getMBeanCount(@QueryParam("name") String name) throws Exception
{
+ return getMBeanServer().queryMBeans(new ObjectName(name), null).size();
+ }
+
+ @GET
+ @Path("/attribute")
+ @Produces(MediaType.TEXT_PLAIN)
+ public String getMBeanAttribute(@QueryParam("name") String name,
@QueryParam("attribute") String attribute)
+ throws Exception {
+ ObjectInstance mbean = getMBean(name);
+ if (mbean != null) {
+ return readMBeanAttribute(mbean.getObjectName(), attribute);
+ }
+ return null;
+ }
+
+ @POST
+ @Path("/invoke")
+ @Produces(MediaType.TEXT_PLAIN)
+ public String invokeMBeanOperation(@QueryParam("name") String name,
@QueryParam("operation") String operation)
+ throws Exception {
+ ObjectInstance mbean = getMBean(name);
+ if (mbean != null) {
+ return
String.valueOf(getMBeanServer().invoke(mbean.getObjectName(), operation, new
Object[] {}, new String[] {}));
+ }
+ return null;
+ }
+
+ private String readMBeanAttribute(ObjectName objectName, String attribute)
throws Exception {
+ MBeanServer server = getMBeanServer();
+ try {
+ // Match the original JVM test, which used getAttributes() rather
than getAttribute()
+ AttributeList attributes = server.getAttributes(objectName, new
String[] { attribute });
+ if (!attributes.isEmpty()) {
+ return String.valueOf(((Attribute)
attributes.get(0)).getValue());
+ }
+ return String.valueOf(server.getAttribute(objectName, attribute));
+ } catch (AttributeNotFoundException e) {
+ // Native JMX registers Micrometer MBeans but may not expose
Standard MBean attributes
+ return null;
+ }
+ }
+
+ private ObjectInstance getMBean(String name) throws
MalformedObjectNameException {
+ ObjectName objectName = new ObjectName(name);
+ Set<ObjectInstance> mbeans = getMBeanServer().queryMBeans(objectName,
null);
+ Iterator<ObjectInstance> iterator = mbeans.iterator();
+ if (iterator.hasNext()) {
+ return iterator.next();
+ }
+ return null;
+ }
+
+ private MBeanServer getMBeanServer() {
+ return ManagementFactory.getPlatformMBeanServer();
+ }
}
diff --git
a/integration-tests/micrometer/src/main/resources/application.properties
b/integration-tests/micrometer/src/main/resources/application.properties
index 38a64cd146..41bac2a620 100644
--- a/integration-tests/micrometer/src/main/resources/application.properties
+++ b/integration-tests/micrometer/src/main/resources/application.properties
@@ -19,4 +19,6 @@ camel.context.name = quarkus-camel-micrometer
quarkus.camel.metrics.enable-message-history = true
-quarkus.camel.metrics.enable-instrumented-thread-pool-factory = true
\ No newline at end of file
+quarkus.camel.metrics.enable-instrumented-thread-pool-factory = true
+
+quarkus.native.monitoring = jmxserver
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 e456bc3f7e..9b128be4dd 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
@@ -16,22 +16,15 @@
*/
package org.apache.camel.quarkus.component.micrometer.it;
-import java.lang.management.ManagementFactory;
import java.util.List;
import java.util.Map;
-import java.util.Set;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
-import javax.management.Attribute;
-import javax.management.MBeanServer;
-import javax.management.ObjectInstance;
-import javax.management.ObjectName;
-
-import io.quarkus.test.junit.DisabledOnIntegrationTest;
import io.quarkus.test.junit.QuarkusTest;
import io.restassured.RestAssured;
import io.restassured.path.json.JsonPath;
+import io.restassured.response.Response;
import org.awaitility.Awaitility;
import org.hamcrest.Matchers;
import org.junit.jupiter.api.Test;
@@ -214,24 +207,33 @@ class MicrometerTest extends AbstractMicrometerTest {
@ParameterizedTest
@ValueSource(strings = { "metrics", "org.apache.camel.micrometer" })
//test uses domains from both default and custom JMX registries
-
@DisabledOnIntegrationTest("https://github.com/apache/camel-quarkus/issues/5209")
- public void testJMXQuarkusDomain(String domain) throws Exception {
- MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
-
- ObjectName objectName = new ObjectName(domain +
":name=jvmClassesLoaded,type=gauges");
- Set<ObjectInstance> mbeans = mBeanServer.queryMBeans(objectName, null);
-
- assertEquals(1, mbeans.size());
+ public void testJMXQuarkusDomain(String domain) {
+ String objectName = domain + ":name=jvmClassesLoaded,type=gauges";
- ObjectInstance oi = mbeans.iterator().next();
- Double classes = (Double) ((Attribute)
mBeanServer.getAttributes(oi.getObjectName(), new String[] { "Value" }).get(0))
- .getValue();
- assertTrue(classes > 1);
+ int mbeanCount = Integer.parseInt(RestAssured.given()
+ .queryParam("name", objectName)
+ .get("/micrometer/mbeans")
+ .then()
+ .statusCode(200)
+ .extract()
+ .body()
+ .asString());
+ assertEquals(1, mbeanCount);
+
+ Response response = RestAssured.given()
+ .queryParam("name", objectName)
+ .queryParam("attribute", "Value")
+ .get("/micrometer/attribute");
+ // JVM exposes the gauge Value attribute; native JMX may only register
the MBean
+ int statusCode = response.statusCode();
+ assertTrue(statusCode == 200 || statusCode == 204);
+ if (statusCode == 200) {
+ assertTrue(Double.parseDouble(response.asString()) > 1);
+ }
}
@Test
-
@DisabledOnIntegrationTest("https://github.com/apache/camel-quarkus/issues/5209")
- public void micrometerHistoryShouldBeAvailableThroughJMX() throws
Exception {
+ public void micrometerHistoryShouldBeAvailableThroughJMX() {
//send a message to init history for the route with id `jmxHistory`
RestAssured.get("/micrometer/sendJmxHistory")
.then()
@@ -246,15 +248,17 @@ class MicrometerTest extends AbstractMicrometerTest {
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);
+ String json = RestAssured.given()
+ .queryParam("name", name)
+ .queryParam("operation", "dumpStatisticsAsJson")
+ .post("/micrometer/invoke")
+ .then()
+ .statusCode(200)
+ .extract()
+ .body()
+ .asString();
assertTrue(json.contains("jmxHistory"));
-
}
@Test