diff --git a/extensions/mongodb-client/deployment/pom.xml b/extensions/mongodb-client/deployment/pom.xml
index 8bd99d1840900..e97646dc79fd8 100644
--- a/extensions/mongodb-client/deployment/pom.xml
+++ b/extensions/mongodb-client/deployment/pom.xml
@@ -63,7 +63,12 @@
io.quarkus
- quarkus-smallrye-metrics-deployment
+ quarkus-micrometer-deployment
+ true
+
+
+ io.quarkus
+ quarkus-micrometer-registry-prometheus-deployment
test
diff --git a/extensions/mongodb-client/deployment/src/main/java/io/quarkus/mongodb/deployment/MongoClientProcessor.java b/extensions/mongodb-client/deployment/src/main/java/io/quarkus/mongodb/deployment/MongoClientProcessor.java
index 128f205661287..2dd946cf874e2 100644
--- a/extensions/mongodb-client/deployment/src/main/java/io/quarkus/mongodb/deployment/MongoClientProcessor.java
+++ b/extensions/mongodb-client/deployment/src/main/java/io/quarkus/mongodb/deployment/MongoClientProcessor.java
@@ -64,6 +64,7 @@
import io.quarkus.deployment.builditem.nativeimage.ServiceProviderBuildItem;
import io.quarkus.deployment.metrics.MetricsCapabilityBuildItem;
import io.quarkus.mongodb.MongoClientName;
+import io.quarkus.mongodb.metrics.MicrometerCommandListener;
import io.quarkus.mongodb.reactive.ReactiveMongoClient;
import io.quarkus.mongodb.runtime.MongoClientBeanUtil;
import io.quarkus.mongodb.runtime.MongoClientCustomizer;
@@ -134,7 +135,7 @@ AdditionalIndexedClassesBuildItem includeMongoCommandMetricListener(
boolean withMicrometer = metricsCapability.map(cap -> cap.metricsSupported(MetricsFactory.MICROMETER))
.orElse(false);
if (withMicrometer) {
- return new AdditionalIndexedClassesBuildItem(MongoClientRecorder.getMicrometerCommandListenerClassName());
+ return new AdditionalIndexedClassesBuildItem(MicrometerCommandListener.class.getName());
}
return new AdditionalIndexedClassesBuildItem();
}
diff --git a/extensions/mongodb-client/deployment/src/test/java/io/quarkus/mongodb/MongoLazyTest.java b/extensions/mongodb-client/deployment/src/test/java/io/quarkus/mongodb/MongoLazyTest.java
index c8c1d01716668..10c1cae82bf3a 100644
--- a/extensions/mongodb-client/deployment/src/test/java/io/quarkus/mongodb/MongoLazyTest.java
+++ b/extensions/mongodb-client/deployment/src/test/java/io/quarkus/mongodb/MongoLazyTest.java
@@ -4,58 +4,47 @@
import jakarta.inject.Inject;
-import org.eclipse.microprofile.metrics.Metric;
-import org.eclipse.microprofile.metrics.MetricID;
-import org.eclipse.microprofile.metrics.MetricRegistry;
-import org.eclipse.microprofile.metrics.Tag;
-import org.eclipse.microprofile.metrics.annotation.RegistryType;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
import com.mongodb.client.MongoClient;
+import io.micrometer.core.instrument.Meter;
+import io.micrometer.core.instrument.MeterRegistry;
import io.quarkus.arc.Arc;
-import io.quarkus.mongodb.metrics.ConnectionPoolGauge;
import io.quarkus.mongodb.reactive.ReactiveMongoClient;
import io.quarkus.test.QuarkusUnitTest;
/** Variation of {@link io.quarkus.mongodb.MongoMetricsTest} to verify lazy client initialization. */
-public class MongoLazyTest extends MongoTestBase {
+class MongoLazyTest extends MongoTestBase {
@Inject
- @RegistryType(type = MetricRegistry.Type.VENDOR)
- MetricRegistry registry;
+ MeterRegistry meterRegistry;
@RegisterExtension
static final QuarkusUnitTest config = new QuarkusUnitTest()
- .withApplicationRoot((jar) -> jar.addClasses(MongoTestBase.class))
+ .withApplicationRoot(jar -> jar.addClasses(MongoTestBase.class))
.withConfigurationResource("application-metrics-mongo.properties");
@Test
void testLazyClientCreation() {
// Clients are created lazily, this metric should not be present yet
- assertThat(getGaugeValueOrNull("mongodb.connection-pool.size", getTags())).isNull();
- assertThat(getGaugeValueOrNull("mongodb.connection-pool.checked-out-count", getTags())).isNull();
+ assertThat(getMetric("mongodb.driver.pool.size")).isNull();
+ assertThat(getMetric("mongodb.driver.pool.checkedout")).isNull();
+ assertThat(getMetric("mongodb.driver.commands")).isNull();
// doing this here instead of in another method in order to avoid messing with the initialization stats
assertThat(Arc.container().instance(MongoClient.class).get()).isNull();
assertThat(Arc.container().instance(ReactiveMongoClient.class).get()).isNull();
}
- private Long getGaugeValueOrNull(String metricName, Tag[] tags) {
- MetricID metricID = new MetricID(metricName, tags);
- Metric metric = registry.getMetrics().get(metricID);
-
- if (metric == null) {
- return null;
- }
- return ((ConnectionPoolGauge) metric).getValue();
+ private Double getMetric(String name) {
+ Meter metric = meterRegistry.getMeters()
+ .stream()
+ .filter(mtr -> mtr.getId().getName().contains(name))
+ .findFirst()
+ .orElse(null);
+ return metric == null ? null : metric.measure().iterator().next().getValue();
}
- private Tag[] getTags() {
- return new Tag[] {
- new Tag("host", "127.0.0.1"),
- new Tag("port", "27018"),
- };
- }
}
diff --git a/extensions/mongodb-client/deployment/src/test/java/io/quarkus/mongodb/MongoMetricsTest.java b/extensions/mongodb-client/deployment/src/test/java/io/quarkus/mongodb/MongoMetricsTest.java
index dab2253817afe..cc54cb1b61d8a 100644
--- a/extensions/mongodb-client/deployment/src/test/java/io/quarkus/mongodb/MongoMetricsTest.java
+++ b/extensions/mongodb-client/deployment/src/test/java/io/quarkus/mongodb/MongoMetricsTest.java
@@ -1,38 +1,32 @@
package io.quarkus.mongodb;
import static org.assertj.core.api.Assertions.assertThat;
-import static org.junit.jupiter.api.Assertions.assertEquals;
import jakarta.inject.Inject;
-import org.eclipse.microprofile.metrics.Metric;
-import org.eclipse.microprofile.metrics.MetricID;
-import org.eclipse.microprofile.metrics.MetricRegistry;
-import org.eclipse.microprofile.metrics.Tag;
-import org.eclipse.microprofile.metrics.annotation.RegistryType;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
import com.mongodb.client.MongoClient;
+import io.micrometer.core.instrument.Meter;
+import io.micrometer.core.instrument.MeterRegistry;
import io.quarkus.arc.Arc;
-import io.quarkus.mongodb.metrics.ConnectionPoolGauge;
import io.quarkus.mongodb.reactive.ReactiveMongoClient;
import io.quarkus.test.QuarkusUnitTest;
-public class MongoMetricsTest extends MongoTestBase {
+class MongoMetricsTest extends MongoTestBase {
@Inject
MongoClient client;
@Inject
- @RegistryType(type = MetricRegistry.Type.VENDOR)
- MetricRegistry registry;
+ MeterRegistry meterRegistry;
@RegisterExtension
static final QuarkusUnitTest config = new QuarkusUnitTest()
- .withApplicationRoot((jar) -> jar.addClasses(MongoTestBase.class))
+ .withApplicationRoot(jar -> jar.addClasses(MongoTestBase.class))
.withConfigurationResource("application-metrics-mongo.properties");
@AfterEach
@@ -45,38 +39,32 @@ void cleanup() {
@Test
void testMetricsInitialization() {
// Clients are created lazily, this metric should not be present yet
- assertThat(getGaugeValueOrNull("mongodb.connection-pool.size", getTags())).isNull();
- assertThat(getGaugeValueOrNull("mongodb.connection-pool.checked-out-count", getTags())).isNull();
+ assertThat(getMetric("mongodb.driver.pool.size")).isNull();
+ assertThat(getMetric("mongodb.driver.pool.checkedout")).isNull();
// Just need to execute something so that a connection is opened
String name = client.listDatabaseNames().first();
- assertEquals(1L, getGaugeValueOrNull("mongodb.connection-pool.size", getTags()));
- assertEquals(0L, getGaugeValueOrNull("mongodb.connection-pool.checked-out-count", getTags()));
+ assertThat(getMetric("mongodb.driver.pool.size")).isOne();
+ assertThat(getMetric("mongodb.driver.commands")).isOne();
+ assertThat(getMetric("mongodb.driver.pool.checkedout")).isZero();
client.close();
- assertEquals(0L, getGaugeValueOrNull("mongodb.connection-pool.size", getTags()));
- assertEquals(0L, getGaugeValueOrNull("mongodb.connection-pool.checked-out-count", getTags()));
+ assertThat(getMetric("mongodb.driver.pool.size")).isNull();
+ assertThat(getMetric("mongodb.driver.pool.checkedout")).isNull();
// doing this here instead of in another method in order to avoid messing with the initialization stats
assertThat(Arc.container().instance(MongoClient.class).get()).isNotNull();
assertThat(Arc.container().instance(ReactiveMongoClient.class).get()).isNull();
}
- private Long getGaugeValueOrNull(String metricName, Tag[] tags) {
- MetricID metricID = new MetricID(metricName, tags);
- Metric metric = registry.getMetrics().get(metricID);
-
- if (metric == null) {
- return null;
- }
- return ((ConnectionPoolGauge) metric).getValue();
+ private Double getMetric(String metricName) {
+ Meter metric = meterRegistry.getMeters()
+ .stream()
+ .filter(mtr -> mtr.getId().getName().contains(metricName))
+ .findFirst()
+ .orElse(null);
+ return metric == null ? null : metric.measure().iterator().next().getValue();
}
- private Tag[] getTags() {
- return new Tag[] {
- new Tag("host", "127.0.0.1"),
- new Tag("port", "27018"),
- };
- }
}
diff --git a/extensions/mongodb-client/deployment/src/test/java/io/quarkus/mongodb/deployment/MongoClientProcessorTest.java b/extensions/mongodb-client/deployment/src/test/java/io/quarkus/mongodb/deployment/MongoClientProcessorTest.java
new file mode 100644
index 0000000000000..86dae2cdda77f
--- /dev/null
+++ b/extensions/mongodb-client/deployment/src/test/java/io/quarkus/mongodb/deployment/MongoClientProcessorTest.java
@@ -0,0 +1,51 @@
+package io.quarkus.mongodb.deployment;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.util.Optional;
+
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.CsvSource;
+
+import io.quarkus.deployment.builditem.AdditionalIndexedClassesBuildItem;
+import io.quarkus.deployment.metrics.MetricsCapabilityBuildItem;
+import io.quarkus.runtime.metrics.MetricsFactory;
+
+class MongoClientProcessorTest {
+ private final MongoClientProcessor buildStep = new MongoClientProcessor();
+
+ @ParameterizedTest
+ @CsvSource({
+ "true, true, true", // Metrics enabled and Micrometer supported
+ "true, false, false", // Metrics enabled but Micrometer not supported
+ "false, true, false", // Metrics disabled and Micrometer supported
+ "false, false, false" // Metrics disabled and Micrometer not supported
+ })
+ void testIncludeMongoCommandMetricListener(boolean metricsEnabled, boolean micrometerSupported, boolean expectedResult) {
+ MongoClientBuildTimeConfig config = config(metricsEnabled);
+ Optional capability = capability(metricsEnabled, micrometerSupported);
+
+ AdditionalIndexedClassesBuildItem result = buildStep.includeMongoCommandMetricListener(config, capability);
+
+ if (expectedResult) {
+ assertThat(result.getClassesToIndex())
+ .containsExactly("io.quarkus.mongodb.metrics.MicrometerCommandListener");
+ } else {
+ assertThat(result.getClassesToIndex()).isEmpty();
+ }
+ }
+
+ private static Optional capability(boolean metricsEnabled, boolean micrometerSupported) {
+ MetricsCapabilityBuildItem capability = metricsEnabled
+ ? new MetricsCapabilityBuildItem(factory -> MetricsFactory.MICROMETER.equals(factory) && micrometerSupported)
+ : null;
+ return Optional.ofNullable(capability);
+ }
+
+ private static MongoClientBuildTimeConfig config(boolean metricsEnabled) {
+ MongoClientBuildTimeConfig buildTimeConfig = new MongoClientBuildTimeConfig();
+ buildTimeConfig.metricsEnabled = metricsEnabled;
+ return buildTimeConfig;
+ }
+
+}
diff --git a/extensions/mongodb-client/runtime/src/main/java/io/quarkus/mongodb/runtime/MongoClientRecorder.java b/extensions/mongodb-client/runtime/src/main/java/io/quarkus/mongodb/runtime/MongoClientRecorder.java
index 79cc3f97e10f2..01fa1bf4caebd 100644
--- a/extensions/mongodb-client/runtime/src/main/java/io/quarkus/mongodb/runtime/MongoClientRecorder.java
+++ b/extensions/mongodb-client/runtime/src/main/java/io/quarkus/mongodb/runtime/MongoClientRecorder.java
@@ -14,7 +14,6 @@
import com.mongodb.event.ConnectionPoolListener;
import io.quarkus.arc.Arc;
-import io.quarkus.mongodb.metrics.MicrometerCommandListener;
import io.quarkus.mongodb.metrics.MicrometerConnectionPoolListener;
import io.quarkus.mongodb.metrics.MongoMetricsConnectionPoolListener;
import io.quarkus.mongodb.reactive.ReactiveMongoClient;
@@ -100,10 +99,6 @@ public ConnectionPoolListener get() {
};
}
- public static String getMicrometerCommandListenerClassName() {
- return MicrometerCommandListener.class.getName();
- }
-
public Supplier createMPMetricsConnectionPoolListener() {
return new Supplier() {
@Override