Skip to content

Commit

Permalink
Merge pull request #16164 from ebullient/micrometer-cdi
Browse files Browse the repository at this point in the history
Micrometer: Simplify Vertx HTTP binder init; http settings in dev mode
  • Loading branch information
ebullient authored Apr 1, 2021
2 parents 3f48b9c + 0cb939e commit 45dc3fe
Show file tree
Hide file tree
Showing 13 changed files with 201 additions and 195 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,14 @@

import javax.interceptor.Interceptor;

import io.quarkus.arc.deployment.AdditionalBeanBuildItem;
import io.quarkus.arc.deployment.SyntheticBeansRuntimeInitBuildItem;
import io.quarkus.deployment.annotations.BuildStep;
import io.quarkus.deployment.annotations.Consume;
import io.quarkus.deployment.annotations.ExecutionTime;
import io.quarkus.deployment.annotations.Record;
import io.quarkus.micrometer.runtime.MicrometerRecorder;
import io.quarkus.micrometer.runtime.binder.vertx.VertxMeterBinderAdapter;
import io.quarkus.micrometer.runtime.binder.vertx.VertxMeterBinderRecorder;
import io.quarkus.micrometer.runtime.config.MicrometerConfig;
import io.quarkus.micrometer.runtime.config.runtime.VertxConfig;
import io.quarkus.vertx.core.deployment.VertxOptionsConsumerBuildItem;

/**
Expand All @@ -35,25 +32,16 @@ public boolean getAsBoolean() {
}
}

@BuildStep(onlyIf = VertxBinderEnabled.class)
AdditionalBeanBuildItem createVertxAdapters() {
// Add Vertx meter adapters
return AdditionalBeanBuildItem.builder()
.addBeanClass(VertxMeterBinderAdapter.class)
.setUnremovable().build();
}

@BuildStep(onlyIf = VertxBinderEnabled.class)
@Record(value = ExecutionTime.STATIC_INIT)
VertxOptionsConsumerBuildItem build(VertxMeterBinderRecorder recorder) {
return new VertxOptionsConsumerBuildItem(recorder.configureMetricsAdapter(), Interceptor.Priority.LIBRARY_AFTER);
return new VertxOptionsConsumerBuildItem(recorder.setVertxMetricsOptions(), Interceptor.Priority.LIBRARY_AFTER);
}

@BuildStep(onlyIf = VertxBinderEnabled.class)
@Record(value = ExecutionTime.RUNTIME_INIT)
@Consume(SyntheticBeansRuntimeInitBuildItem.class)
void setVertxConfig(VertxMeterBinderRecorder recorder,
VertxConfig config) {
recorder.setVertxConfig(config);
void setVertxConfig(VertxMeterBinderRecorder recorder) {
recorder.configureBinderAdapter();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package io.quarkus.micrometer.deployment.binder;

import static io.restassured.RestAssured.when;

import org.hamcrest.Matchers;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.asset.StringAsset;
import org.jboss.shrinkwrap.api.spec.JavaArchive;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;

import io.quarkus.micrometer.test.HelloResource;
import io.quarkus.test.QuarkusDevModeTest;

public class HttpDevModeConfigTest {
@RegisterExtension
static final QuarkusDevModeTest test = new QuarkusDevModeTest()
.setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class)
.addClass(HelloResource.class)
.add(new StringAsset("quarkus.micrometer.binder-enabled-default=false\n" +
"quarkus.micrometer.binder.http-client.enabled=true\n" +
"quarkus.micrometer.binder.http-server.enabled=true\n" +
"quarkus.micrometer.binder.http-server.ignore-patterns=/http\n" +
"quarkus.micrometer.binder.vertx.enabled=true\n"), "application.properties"));

@Test
public void testHttpConfigInDevMode() throws Exception {

when().get("/hello/one").then().statusCode(200);
when().get("/hello/two").then().statusCode(200);
when().get("/hello/three").then().statusCode(200);
when().get("/q/metrics").then().statusCode(200)
.body(Matchers.containsString("/hello/{message}"));

test.modifyResourceFile("application.properties",
s -> s.replace("quarkus.micrometer.binder.http-server.ignore-patterns=/http",
"quarkus.micrometer.binder.http-server.match-patterns=/hello/.*=/goodbye/{message}"));

when().get("/hello/one").then().statusCode(200);
when().get("/hello/two").then().statusCode(200);
when().get("/hello/three").then().statusCode(200);
when().get("/q/metrics").then().statusCode(200)
.body(Matchers.containsString("/goodbye/{message}"));
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,6 @@

import static io.restassured.RestAssured.when;

import java.net.URL;

import javax.enterprise.inject.Instance;
import javax.inject.Inject;

import org.jboss.shrinkwrap.api.ShrinkWrap;
Expand All @@ -15,12 +12,8 @@

import io.micrometer.core.instrument.MeterRegistry;
import io.quarkus.micrometer.runtime.binder.HttpBinderConfiguration;
import io.quarkus.micrometer.runtime.binder.vertx.VertxMeterBinderAdapter;
import io.quarkus.micrometer.test.PingPongResource;
import io.quarkus.test.QuarkusUnitTest;
import io.quarkus.test.common.http.TestHTTPResource;
import io.vertx.core.http.HttpServerOptions;
import io.vertx.core.net.SocketAddress;

public class VertxWithHttpDisabledTest {
@RegisterExtension
Expand All @@ -32,12 +25,6 @@ public class VertxWithHttpDisabledTest {
.setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class)
.addClasses(PingPongResource.class, PingPongResource.PingPongRestClient.class));

@TestHTTPResource
URL url;

@Inject
Instance<VertxMeterBinderAdapter> vertxMeterBinderAdapterInstance;

@Inject
HttpBinderConfiguration httpBinderConfiguration;

Expand All @@ -49,31 +36,7 @@ public void testVertxMetricsWithoutHttp() throws Exception {
Assertions.assertFalse(httpBinderConfiguration.isClientEnabled());
Assertions.assertFalse(httpBinderConfiguration.isServerEnabled());

// Vertx Binder should exist
Assertions.assertTrue(vertxMeterBinderAdapterInstance.isResolvable());
VertxMeterBinderAdapter adapter = vertxMeterBinderAdapterInstance.get();

// HttpServerMetrics should not be created (null returned) because
// Http server metrics are disabled
Assertions.assertNull(adapter.createHttpServerMetrics(new HttpServerOptions(), new SocketAddress() {
@Override
public String host() {
return "a.b.c";
}

@Override
public int port() {
return 0;
}

@Override
public String path() {
return null;
}
}));

// If you invoke requests, no http server or client meters should be registered

when().get("/ping/one").then().statusCode(200);
when().get("/ping/two").then().statusCode(200);
when().get("/ping/three").then().statusCode(200);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,9 @@

import static io.restassured.RestAssured.when;

import java.net.URL;
import java.util.Map;
import java.util.regex.Pattern;

import javax.enterprise.inject.Instance;
import javax.inject.Inject;

import org.jboss.shrinkwrap.api.ShrinkWrap;
Expand All @@ -17,13 +15,8 @@

import io.micrometer.core.instrument.MeterRegistry;
import io.quarkus.micrometer.runtime.binder.HttpBinderConfiguration;
import io.quarkus.micrometer.runtime.binder.vertx.VertxMeterBinderAdapter;
import io.quarkus.micrometer.test.PingPongResource;
import io.quarkus.test.QuarkusUnitTest;
import io.quarkus.test.common.http.TestHTTPResource;
import io.vertx.core.http.HttpServerOptions;
import io.vertx.core.net.SocketAddress;
import io.vertx.core.spi.metrics.HttpServerMetrics;

public class VertxWithHttpEnabledTest {
@RegisterExtension
Expand All @@ -40,47 +33,17 @@ public class VertxWithHttpEnabledTest {
.setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class)
.addClasses(PingPongResource.class, PingPongResource.PingPongRestClient.class));

@TestHTTPResource
URL url;

@Inject
Instance<VertxMeterBinderAdapter> vertxMeterBinderAdapterInstance;

@Inject
HttpBinderConfiguration httpBinderConfiguration;

@Inject
MeterRegistry registry;

@Test
public void testMetricFactoryCreatedMetrics() throws Exception {
public void testVertxMetricsWithHttp() throws Exception {
Assertions.assertTrue(httpBinderConfiguration.isClientEnabled());
Assertions.assertTrue(httpBinderConfiguration.isServerEnabled());

// Vertx Binder should exist
Assertions.assertTrue(vertxMeterBinderAdapterInstance.isResolvable());
VertxMeterBinderAdapter adapter = vertxMeterBinderAdapterInstance.get();

HttpServerMetrics metrics = adapter.createHttpServerMetrics(new HttpServerOptions(), new SocketAddress() {
@Override
public String host() {
return "a.b.c";
}

@Override
public int port() {
return 0;
}

@Override
public String path() {
return null;
}
});

Assertions.assertNotNull(metrics);
Assertions.assertTrue(httpBinderConfiguration.isServerEnabled());

// prefer http-server.ignore-patterns
Assertions.assertEquals(1, httpBinderConfiguration.getServerIgnorePatterns().size());
Pattern p = httpBinderConfiguration.getServerIgnorePatterns().get(0);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package io.quarkus.micrometer.test;

import javax.inject.Singleton;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;

@Path("/hello")
@Singleton
public class HelloResource {
@GET
@Path("{message}")
public String hello(@PathParam("message") String message) {
return "hello " + message;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import org.graalvm.nativeimage.ImageInfo;
import org.jboss.logging.Logger;

import io.micrometer.core.instrument.Meter;
import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.Metrics;
import io.micrometer.core.instrument.binder.MeterBinder;
Expand All @@ -33,11 +34,11 @@
import io.quarkus.arc.Arc;
import io.quarkus.micrometer.runtime.binder.HttpBinderConfiguration;
import io.quarkus.micrometer.runtime.binder.JVMInfoBinder;
import io.quarkus.micrometer.runtime.binder.vertx.VertxMeterBinderAdapter;
import io.quarkus.micrometer.runtime.config.MicrometerConfig;
import io.quarkus.micrometer.runtime.config.runtime.HttpClientConfig;
import io.quarkus.micrometer.runtime.config.runtime.HttpServerConfig;
import io.quarkus.micrometer.runtime.config.runtime.VertxConfig;
import io.quarkus.runtime.LaunchMode;
import io.quarkus.runtime.RuntimeValue;
import io.quarkus.runtime.ShutdownContext;
import io.quarkus.runtime.annotations.Recorder;
Expand All @@ -51,7 +52,6 @@ public class MicrometerRecorder {

/* STATIC_INIT */
public RuntimeValue<MeterRegistry> createRootRegistry(MicrometerConfig config) {
VertxMeterBinderAdapter.setMeterRegistry(Metrics.globalRegistry);
factory = new MicrometerMetricsFactory(config, Metrics.globalRegistry);
return new RuntimeValue<>(Metrics.globalRegistry);
}
Expand All @@ -62,14 +62,14 @@ public void configureRegistries(MicrometerConfig config,
ShutdownContext context) {
BeanManager beanManager = Arc.container().beanManager();

List<MeterRegistry> allRegistries = new ArrayList<>();
Map<Class<? extends MeterRegistry>, List<MeterFilter>> classMeterFilters = new HashMap<>(registryClasses.size());

// Find global/common registry configuration
List<MeterFilter> globalFilters = new ArrayList<>();
Instance<MeterFilter> globalFilterInstance = beanManager.createInstance()
.select(MeterFilter.class, Default.Literal.INSTANCE);
populateListWithMeterFilters(globalFilterInstance, globalFilters);
log.debugf("Discovered global MeterFilters : %s", globalFilters);

// Find MeterFilters for specific registry classes, i.e.:
// @MeterFilterConstraint(applyTo = DatadogMeterRegistry.class) Instance<MeterFilter> filters
Expand All @@ -80,6 +80,7 @@ public void configureRegistries(MicrometerConfig config,
List<MeterFilter> classFilters = classMeterFilters.computeIfAbsent(typeClass, k -> new ArrayList<>());

populateListWithMeterFilters(classFilterInstance, classFilters);
log.debugf("Discovered MeterFilters for %s: %s", typeClass, classFilters);
}

// Find and configure MeterRegistry beans (includes runtime config)
Expand All @@ -99,7 +100,6 @@ public void configureRegistries(MicrometerConfig config,
applyMeterFilters(registry, classMeterFilters.get(registry.getClass()));
log.debugf("Adding configured registry %s", registry.getClass(), registry);
Metrics.globalRegistry.add(registry);
allRegistries.add(registry);
}
}

Expand Down Expand Up @@ -132,6 +132,11 @@ public void configureRegistries(MicrometerConfig config,
context.addShutdownTask(new Runnable() {
@Override
public void run() {
if (LaunchMode.current() == LaunchMode.DEVELOPMENT) {
// Drop existing meters (recreated on next use)
Collection<Meter> meters = new ArrayList<>(Metrics.globalRegistry.getMeters());
meters.forEach(m -> Metrics.globalRegistry.remove(m));
}
Collection<MeterRegistry> cleanup = new ArrayList<>(Metrics.globalRegistry.getRegistries());
cleanup.forEach(x -> {
x.close();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,9 @@ public class HttpBinderConfiguration {
List<Pattern> clientIgnorePatterns = Collections.emptyList();
Map<Pattern, String> clientMatchPatterns = Collections.emptyMap();

private HttpBinderConfiguration() {
}

@SuppressWarnings("deprecation")
public HttpBinderConfiguration(boolean httpServerMetrics, boolean httpClientMetrics,
HttpServerConfig serverConfig, HttpClientConfig clientConfig, VertxConfig vertxConfig) {
Expand Down Expand Up @@ -130,4 +133,20 @@ public String getHttpServerWebSocketConnectionsName() {
public String getHttpClientRequestsName() {
return "http.client.requests";
}

public HttpBinderConfiguration unwrap() {
HttpBinderConfiguration result = new HttpBinderConfiguration();
// not dev-mode changeable
result.clientEnabled = this.clientEnabled;
result.serverEnabled = this.serverEnabled;
return result.update(this);
}

public HttpBinderConfiguration update(HttpBinderConfiguration httpConfig) {
this.clientMatchPatterns = httpConfig.clientMatchPatterns;
this.serverMatchPatterns = httpConfig.serverMatchPatterns;
this.clientIgnorePatterns = httpConfig.clientIgnorePatterns;
this.serverIgnorePatterns = httpConfig.serverIgnorePatterns;
return this;
}
}
Loading

0 comments on commit 45dc3fe

Please sign in to comment.