Skip to content

Commit

Permalink
@UnlessBuildProperty to suppress default instance
Browse files Browse the repository at this point in the history
Co-authored-by: Martin Kouba <[email protected]>
  • Loading branch information
ebullient and mkouba committed May 31, 2021
1 parent fe4d4ce commit c3a0e35
Show file tree
Hide file tree
Showing 7 changed files with 77 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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);
}
}
Original file line number Diff line number Diff line change
@@ -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<MeterRegistry> 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);

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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.
* <p>
* Use this attribute to veto the creation of the default Prometheus MeterRegistry.
*/
@ConfigItem(defaultValue = "true")
public boolean defaultRegistry;

@Override
public Optional<Boolean> getEnabled() {
return enabled;
Expand All @@ -35,6 +43,7 @@ public String toString() {
return this.getClass().getSimpleName()
+ "{path='" + path
+ ",enabled=" + enabled
+ ",defaultRegistry=" + defaultRegistry
+ '}';
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit c3a0e35

Please sign in to comment.