From 2a72b7c7c3617de89d7d90dd1e04fe3e2df32360 Mon Sep 17 00:00:00 2001 From: Denny Abraham Cheriyan Date: Mon, 13 Feb 2023 17:42:38 -0800 Subject: [PATCH] Add configurable response code meters --- docs/source/manual/configuration.rst | 2 ++ dropwizard-core/pom.xml | 4 +++ .../server/AbstractServerFactory.java | 33 ++++++++++++++++++- .../server/AbstractServerFactoryTest.java | 11 +++++++ .../server/DefaultServerFactoryTest.java | 13 ++++++++ .../src/test/resources/yaml/server.yml | 2 ++ 6 files changed, 64 insertions(+), 1 deletion(-) diff --git a/docs/source/manual/configuration.rst b/docs/source/manual/configuration.rst index 469afc76f6..ec79d1e926 100644 --- a/docs/source/manual/configuration.rst +++ b/docs/source/manual/configuration.rst @@ -36,6 +36,8 @@ maxThreads 1024 minThreads 8 The minimum number of threads to keep alive in the thread pool. Note that each Jetty connector consumes threads from the pool. See :ref:`HTTP connector ` how the thread counts are calculated. maxQueuedRequests 1024 The maximum number of requests to queue before blocking the acceptors. +responseMeteredLevel COARSE The response metered level to decide what response code meters are included +metricPrefix (none) The metricPrefix to use in the metric name for jetty metrics idleThreadTimeout 1 minute The amount of time a worker thread can be idle before being stopped. nofileSoftLimit (none) The number of open file descriptors before a soft error is issued. diff --git a/dropwizard-core/pom.xml b/dropwizard-core/pom.xml index a06102e60a..0bb3818dc6 100644 --- a/dropwizard-core/pom.xml +++ b/dropwizard-core/pom.xml @@ -61,6 +61,10 @@ io.dropwizard.metrics metrics-core + + io.dropwizard.metrics + metrics-annotation + io.dropwizard.metrics metrics-jetty9 diff --git a/dropwizard-core/src/main/java/io/dropwizard/server/AbstractServerFactory.java b/dropwizard-core/src/main/java/io/dropwizard/server/AbstractServerFactory.java index a7d3212875..b03ba23ba9 100644 --- a/dropwizard-core/src/main/java/io/dropwizard/server/AbstractServerFactory.java +++ b/dropwizard-core/src/main/java/io/dropwizard/server/AbstractServerFactory.java @@ -1,6 +1,7 @@ package io.dropwizard.server; import com.codahale.metrics.MetricRegistry; +import com.codahale.metrics.annotation.ResponseMeteredLevel; import com.codahale.metrics.health.HealthCheckRegistry; import com.codahale.metrics.jetty9.InstrumentedHandler; import com.codahale.metrics.jetty9.InstrumentedQueuedThreadPool; @@ -56,6 +57,8 @@ import java.util.concurrent.BlockingQueue; import java.util.stream.Collectors; +import static com.codahale.metrics.annotation.ResponseMeteredLevel.COARSE; + /** * A base class for {@link ServerFactory} implementations. *

@@ -82,6 +85,16 @@ * The {@link ServerPushFilterFactory} configuration. * * + * {@code responseMeteredLevel} + * COARSE + * The response metered level to decide what response code meters are included. + * + * + * {@code metricPrefix} + * + * The metricPrefix to use in the metric name for jetty metrics. + * + * * {@code maxThreads} * 1024 * The maximum number of threads to use for requests. @@ -238,6 +251,13 @@ public abstract class AbstractServerFactory implements ServerFactory { @NotNull private ServerPushFilterFactory serverPush = new ServerPushFilterFactory(); + @Valid + @NotNull + private ResponseMeteredLevel responseMeteredLevel = COARSE; + + @Nullable + private String metricPrefix; + @Min(4) private int maxThreads = 1024; @@ -332,6 +352,17 @@ public void setServerPush(ServerPushFilterFactory serverPush) { this.serverPush = serverPush; } + @JsonProperty("responseMeteredLevel") + public ResponseMeteredLevel getResponseMeteredLevel() { + return responseMeteredLevel; + } + + @JsonProperty("metricPrefix") + @Nullable + public String getMetricPrefix() { + return metricPrefix; + } + @JsonProperty public int getMaxThreads() { return maxThreads; @@ -601,7 +632,7 @@ protected Handler createAppServlet(Server server, } handler.addServlet(new ServletHolder("jersey", jerseyContainer), jersey.getUrlPattern()); } - final InstrumentedHandler instrumented = new InstrumentedHandler(metricRegistry); + final InstrumentedHandler instrumented = new InstrumentedHandler(metricRegistry, metricPrefix, responseMeteredLevel); instrumented.setServer(server); instrumented.setHandler(handler); return instrumented; diff --git a/dropwizard-core/src/test/java/io/dropwizard/server/AbstractServerFactoryTest.java b/dropwizard-core/src/test/java/io/dropwizard/server/AbstractServerFactoryTest.java index dbf1f80233..6f347e6fb2 100644 --- a/dropwizard-core/src/test/java/io/dropwizard/server/AbstractServerFactoryTest.java +++ b/dropwizard-core/src/test/java/io/dropwizard/server/AbstractServerFactoryTest.java @@ -1,5 +1,6 @@ package io.dropwizard.server; +import com.codahale.metrics.annotation.ResponseMeteredLevel; import io.dropwizard.Configuration; import io.dropwizard.jersey.DropwizardResourceConfig; import io.dropwizard.jersey.setup.JerseyContainerHolder; @@ -68,6 +69,16 @@ void usesDefaultPatternWhenNoneSet() { assertThat(jerseyEnvironment.getUrlPattern()).isEqualTo(DEFAULT_PATTERN); } + @Test + void usesDefaultResponseMeteredLevelWhenNotSet() { + assertThat(serverFactory.getResponseMeteredLevel()).isEqualTo(ResponseMeteredLevel.COARSE); + } + + @Test + void usesDefaultMetricPrefixWhenNotSet() { + assertThat(serverFactory.getMetricPrefix()).isNull(); + } + /** * Test implementation of {@link AbstractServerFactory} used to run {@link #createAppServlet}, which triggers the * setting of {@link JerseyEnvironment#setUrlPattern(String)}. diff --git a/dropwizard-core/src/test/java/io/dropwizard/server/DefaultServerFactoryTest.java b/dropwizard-core/src/test/java/io/dropwizard/server/DefaultServerFactoryTest.java index 9b4e34d228..ae30347bb0 100644 --- a/dropwizard-core/src/test/java/io/dropwizard/server/DefaultServerFactoryTest.java +++ b/dropwizard-core/src/test/java/io/dropwizard/server/DefaultServerFactoryTest.java @@ -39,6 +39,7 @@ import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; +import static com.codahale.metrics.annotation.ResponseMeteredLevel.ALL; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -87,6 +88,18 @@ void hasAMinimumNumberOfThreads() { .isEqualTo(89); } + @Test + void hasResponseMeteredLevel() { + assertThat(http.getResponseMeteredLevel()) + .isEqualTo(ALL); + } + + @Test + void hasMetricPrefix() { + assertThat(http.getMetricPrefix()) + .isEqualTo("jetty"); + } + @Test void hasApplicationContextPath() { assertThat(http.getApplicationContextPath()).isEqualTo("/app"); diff --git a/dropwizard-core/src/test/resources/yaml/server.yml b/dropwizard-core/src/test/resources/yaml/server.yml index cb9ed7a0d3..d3b7b58dc7 100644 --- a/dropwizard-core/src/test/resources/yaml/server.yml +++ b/dropwizard-core/src/test/resources/yaml/server.yml @@ -5,6 +5,8 @@ requestLog: currentLogFilename: ./logs/requests.log archivedLogFilenamePattern: ./logs/requests-%d.log.gz archivedFileCount: 5 +responseMeteredLevel: ALL +metricPrefix: jetty gzip: enabled: false serverPush: