diff --git a/extensions/arc/deployment/src/main/java/io/quarkus/arc/deployment/BuildTimeEnabledProcessor.java b/extensions/arc/deployment/src/main/java/io/quarkus/arc/deployment/BuildTimeEnabledProcessor.java index fc6ec38868991..525274d466a5f 100644 --- a/extensions/arc/deployment/src/main/java/io/quarkus/arc/deployment/BuildTimeEnabledProcessor.java +++ b/extensions/arc/deployment/src/main/java/io/quarkus/arc/deployment/BuildTimeEnabledProcessor.java @@ -268,6 +268,8 @@ private void transformBean(AnnotationTarget target, TransformationContext ctx, b if (target.kind() == Kind.CLASS) { // Veto the class transform.add(DotNames.VETOED); + } else if ( isProducer(target) ) { + transform.removeAll(); } else { // Add @Alternative to the producer transform.add(DotNames.ALTERNATIVE); @@ -276,4 +278,7 @@ private void transformBean(AnnotationTarget target, TransformationContext ctx, b } } + private boolean isProducer(AnnotationTarget target) { + return target.kind() == Kind.METHOD && target.asMethod().hasAnnotation(DotNames.PRODUCES); + } } diff --git a/extensions/micrometer/deployment/src/test/java/io/quarkus/micrometer/deployment/export/NoDefaultPrometheusTest.java b/extensions/micrometer/deployment/src/test/java/io/quarkus/micrometer/deployment/export/NoDefaultPrometheusTest.java new file mode 100644 index 0000000000000..5a6dc9e4ae647 --- /dev/null +++ b/extensions/micrometer/deployment/src/test/java/io/quarkus/micrometer/deployment/export/NoDefaultPrometheusTest.java @@ -0,0 +1,55 @@ +package io.quarkus.micrometer.deployment.export; + +import java.util.Set; + +import javax.inject.Inject; + +import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.jboss.shrinkwrap.api.spec.JavaArchive; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +import io.micrometer.core.instrument.MeterRegistry; +import io.micrometer.core.instrument.composite.CompositeMeterRegistry; +import io.micrometer.prometheus.PrometheusMeterRegistry; +import io.quarkus.micrometer.test.Util; +import io.quarkus.test.QuarkusUnitTest; + +public class NoDefaultPrometheusTest { + @RegisterExtension + static final QuarkusUnitTest config = new QuarkusUnitTest() + .setFlatClassPath(true) + .withConfigurationResource("test-logging.properties") + .overrideConfigKey("quarkus.micrometer.binder-enabled-default", "false") + .overrideConfigKey("quarkus.micrometer.export.prometheus.enabled", "true") + .overrideConfigKey("quarkus.micrometer.export.prometheus.default-registry", "false") + .overrideConfigKey("quarkus.micrometer.registry-enabled-default", "false") + .setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class) + .addClasses(Util.class, + PrometheusRegistryProcessor.REGISTRY_CLASS, + SecondPrometheusProvider.class)); + + @Inject + MeterRegistry registry; + + @Inject + PrometheusMeterRegistry promRegistry; + + @Test + public void testMeterRegistryPresent() { + // Prometheus is enabled (only registry) + Assertions.assertNotNull(registry, "A registry should be configured"); + Set subRegistries = ((CompositeMeterRegistry) registry).getRegistries(); + + PrometheusMeterRegistry subPromRegistry = (PrometheusMeterRegistry) subRegistries.iterator().next(); + Assertions.assertEquals(PrometheusMeterRegistry.class, subPromRegistry.getClass(), "Should be PrometheusMeterRegistry"); + Assertions.assertEquals(subPromRegistry, promRegistry, + "The only MeterRegistry should be the same bean as the PrometheusMeterRegistry, found " + subRegistries); + + String result = promRegistry.scrape(); + Assertions.assertTrue(result.contains("customKey=\"customValue\""), + "Scrape result should contain common tags from the custom registry configuration. Found\n" + result); + + } +} diff --git a/extensions/micrometer/deployment/src/test/java/io/quarkus/micrometer/deployment/export/PrometheusEnabledTest.java b/extensions/micrometer/deployment/src/test/java/io/quarkus/micrometer/deployment/export/PrometheusEnabledTest.java index 4244d1bf64df9..b68ecda624264 100644 --- a/extensions/micrometer/deployment/src/test/java/io/quarkus/micrometer/deployment/export/PrometheusEnabledTest.java +++ b/extensions/micrometer/deployment/src/test/java/io/quarkus/micrometer/deployment/export/PrometheusEnabledTest.java @@ -23,8 +23,7 @@ public class PrometheusEnabledTest { .overrideConfigKey("quarkus.micrometer.binder-enabled-default", "false") .overrideConfigKey("quarkus.micrometer.export.prometheus.enabled", "true") .overrideConfigKey("quarkus.micrometer.registry-enabled-default", "false") - .setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class) - .addClass(PrometheusRegistryProcessor.REGISTRY_CLASS)); + .setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class)); @Inject MeterRegistry registry; diff --git a/extensions/micrometer/deployment/src/test/java/io/quarkus/micrometer/deployment/export/SecondPrometheusProvider.java b/extensions/micrometer/deployment/src/test/java/io/quarkus/micrometer/deployment/export/SecondPrometheusProvider.java index 1c546fb664d5f..a48f8323f3d7d 100644 --- a/extensions/micrometer/deployment/src/test/java/io/quarkus/micrometer/deployment/export/SecondPrometheusProvider.java +++ b/extensions/micrometer/deployment/src/test/java/io/quarkus/micrometer/deployment/export/SecondPrometheusProvider.java @@ -13,6 +13,9 @@ public class SecondPrometheusProvider { @Produces @Singleton public PrometheusMeterRegistry registry(CollectorRegistry collectorRegistry, Clock clock) { - return new PrometheusMeterRegistry(PrometheusConfig.DEFAULT, collectorRegistry, clock); + PrometheusMeterRegistry customRegistry = new PrometheusMeterRegistry(PrometheusConfig.DEFAULT, collectorRegistry, + clock); + customRegistry.config().commonTags("customKey", "customValue"); + return customRegistry; } } diff --git a/extensions/micrometer/runtime/src/main/java/io/quarkus/micrometer/runtime/MicrometerRecorder.java b/extensions/micrometer/runtime/src/main/java/io/quarkus/micrometer/runtime/MicrometerRecorder.java index 99072113bd5d9..fa61d99a6e3d7 100644 --- a/extensions/micrometer/runtime/src/main/java/io/quarkus/micrometer/runtime/MicrometerRecorder.java +++ b/extensions/micrometer/runtime/src/main/java/io/quarkus/micrometer/runtime/MicrometerRecorder.java @@ -95,7 +95,7 @@ public void configureRegistries(MicrometerConfig config, .getReference(i, MeterRegistry.class, beanManager.createCreationalContext(i)); // Add & configure non-root registries - if (registry != Metrics.globalRegistry) { + if (registry != Metrics.globalRegistry && registry != null) { applyMeterFilters(registry, globalFilters); applyMeterFilters(registry, classMeterFilters.get(registry.getClass())); log.debugf("Adding configured registry %s", registry.getClass(), registry); diff --git a/extensions/micrometer/runtime/src/main/java/io/quarkus/micrometer/runtime/config/PrometheusConfigGroup.java b/extensions/micrometer/runtime/src/main/java/io/quarkus/micrometer/runtime/config/PrometheusConfigGroup.java index c8fccd1b65b8c..11a23dd6107c3 100644 --- a/extensions/micrometer/runtime/src/main/java/io/quarkus/micrometer/runtime/config/PrometheusConfigGroup.java +++ b/extensions/micrometer/runtime/src/main/java/io/quarkus/micrometer/runtime/config/PrometheusConfigGroup.java @@ -25,6 +25,14 @@ public class PrometheusConfigGroup implements MicrometerConfig.CapabilityEnabled @ConfigItem(defaultValue = "metrics") public String path; + /** + * By default, this extension will create a Prometheus MeterRegistry instance. + *

+ * Use this attribute to veto the creation of the default Prometheus MeterRegistry. + */ + @ConfigItem(defaultValue = "true") + public boolean defaultRegistry; + @Override public Optional getEnabled() { return enabled; @@ -35,6 +43,7 @@ public String toString() { return this.getClass().getSimpleName() + "{path='" + path + ",enabled=" + enabled + + ",defaultRegistry=" + defaultRegistry + '}'; } } diff --git a/extensions/micrometer/runtime/src/main/java/io/quarkus/micrometer/runtime/export/PrometheusMeterRegistryProvider.java b/extensions/micrometer/runtime/src/main/java/io/quarkus/micrometer/runtime/export/PrometheusMeterRegistryProvider.java index 0994245804f75..dd02f52b5ac37 100644 --- a/extensions/micrometer/runtime/src/main/java/io/quarkus/micrometer/runtime/export/PrometheusMeterRegistryProvider.java +++ b/extensions/micrometer/runtime/src/main/java/io/quarkus/micrometer/runtime/export/PrometheusMeterRegistryProvider.java @@ -17,6 +17,7 @@ import io.prometheus.client.CollectorRegistry; import io.quarkus.arc.AlternativePriority; import io.quarkus.arc.DefaultBean; +import io.quarkus.arc.properties.UnlessBuildProperty; @Singleton public class PrometheusMeterRegistryProvider { @@ -58,6 +59,7 @@ public CollectorRegistry collectorRegistry() { @Produces @Singleton + @UnlessBuildProperty(name = "quarkus.micrometer.export.prometheus.default-registry", stringValue = "false", enableIfMissing = true) @AlternativePriority(Interceptor.Priority.APPLICATION + 100) public PrometheusMeterRegistry registry(PrometheusConfig config, CollectorRegistry collectorRegistry, Clock clock) { return new PrometheusMeterRegistry(config, collectorRegistry, clock);