Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Micrometer: Simplify Vertx HTTP binder init; http settings in dev mode #16164

Merged
merged 1 commit into from
Apr 1, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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