diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/MetricsProperties.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/MetricsProperties.java index bf0c9f0e6f7..ec9a83758a5 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/MetricsProperties.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/MetricsProperties.java @@ -16,13 +16,13 @@ package org.springframework.boot.actuate.autoconfigure.metrics; -import java.util.ArrayList; import java.util.LinkedHashMap; -import java.util.List; import java.util.Map; +import org.springframework.boot.actuate.metrics.Autotime; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.DeprecatedConfigurationProperty; +import org.springframework.boot.context.properties.NestedConfigurationProperty; /** * {@link ConfigurationProperties @ConfigurationProperties} for configuring @@ -107,8 +107,12 @@ public class MetricsProperties { */ private int maxUriTags = 100; + public ClientRequest getRequest() { + return this.request; + } + /** - * Get name of the metric for received requests. + * Return the name of the metric for client requests. * @return request metric name * @deprecated since 2.2.0 in favor of {@link ClientRequest#getMetricName()} */ @@ -119,7 +123,7 @@ public class MetricsProperties { } /** - * Set name of the metric for received requests. + * Set the name of the metric for client requests. * @param requestsMetricName request metric name * @deprecated since 2.2.0 in favor of * {@link ClientRequest#setMetricName(String)} @@ -128,10 +132,6 @@ public class MetricsProperties { this.request.setMetricName(requestsMetricName); } - public ClientRequest getRequest() { - return this.request; - } - public int getMaxUriTags() { return this.maxUriTags; } @@ -148,11 +148,12 @@ public class MetricsProperties { private String metricName = "http.client.requests"; /** - * Automatically time requests. + * Auto-timed request settings. */ - private final AutoTime autoTime = new AutoTime(); + @NestedConfigurationProperty + private final Autotime autoTime = new Autotime(); - public AutoTime getAutoTime() { + public Autotime getAutotime() { return this.autoTime; } @@ -179,8 +180,12 @@ public class MetricsProperties { */ private int maxUriTags = 100; + public ServerRequest getRequest() { + return this.request; + } + /** - * Get name of the metric for received requests. + * Return name of the metric for server requests. * @return request metric name * @deprecated since 2.2.0 in favor of {@link ServerRequest#getMetricName()} */ @@ -191,7 +196,7 @@ public class MetricsProperties { } /** - * Set name of the metric for received requests. + * Set the name of the metric for server requests. * @param requestsMetricName request metric name * @deprecated since 2.2.0 in favor of * {@link ServerRequest#setMetricName(String)} @@ -200,10 +205,6 @@ public class MetricsProperties { this.request.setMetricName(requestsMetricName); } - public ServerRequest getRequest() { - return this.request; - } - public int getMaxUriTags() { return this.maxUriTags; } @@ -220,12 +221,13 @@ public class MetricsProperties { private String metricName = "http.server.requests"; /** - * Automatically time requests. + * Auto-timed request settings. */ - private final AutoTime autoTime = new AutoTime(); + @NestedConfigurationProperty + private final Autotime autotime = new Autotime(); - public AutoTime getAutoTime() { - return this.autoTime; + public Autotime getAutotime() { + return this.autotime; } public String getMetricName() { @@ -240,56 +242,6 @@ public class MetricsProperties { } - public static class AutoTime { - - /** - * Whether requests handled by Spring MVC, WebFlux or Jersey should be - * automatically timed. If the number of time series emitted grows too large - * on account of request mapping timings, disable this and use 'Timed' on a - * per request mapping basis as needed. - */ - private boolean enabled = true; - - /** - * Default percentiles when @Timed annotation is not presented on the - * corresponding request handler. Any @Timed annotation presented will have - * precedence. - */ - private List defaultPercentiles = new ArrayList<>(); - - /** - * Default histogram when @Timed annotation is not presented on the - * corresponding request handler. Any @Timed annotation presented will have - * precedence. - */ - private boolean defaultHistogram; - - public boolean isEnabled() { - return this.enabled; - } - - public void setEnabled(boolean enabled) { - this.enabled = enabled; - } - - public List getDefaultPercentiles() { - return this.defaultPercentiles; - } - - public void setDefaultPercentiles(List defaultPercentiles) { - this.defaultPercentiles = defaultPercentiles; - } - - public boolean isDefaultHistogram() { - return this.defaultHistogram; - } - - public void setDefaultHistogram(boolean defaultHistogram) { - this.defaultHistogram = defaultHistogram; - } - - } - } public static class Distribution { diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/jersey/JerseyServerMetricsAutoConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/jersey/JerseyServerMetricsAutoConfiguration.java index d5d6d923ec4..d657e0a5d09 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/jersey/JerseyServerMetricsAutoConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/jersey/JerseyServerMetricsAutoConfiguration.java @@ -80,7 +80,7 @@ public class JerseyServerMetricsAutoConfiguration { Server server = this.properties.getWeb().getServer(); return (config) -> config.register(new MetricsApplicationEventListener( meterRegistry, tagsProvider, server.getRequest().getMetricName(), - server.getRequest().getAutoTime().isEnabled(), + server.getRequest().getAutotime().isEnabled(), new AnnotationUtilsAnnotationFinder())); } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/web/client/RestTemplateMetricsConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/web/client/RestTemplateMetricsConfiguration.java index 7326b90743d..037fe32b8f3 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/web/client/RestTemplateMetricsConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/web/client/RestTemplateMetricsConfiguration.java @@ -19,8 +19,7 @@ package org.springframework.boot.actuate.autoconfigure.metrics.web.client; import io.micrometer.core.instrument.MeterRegistry; import org.springframework.boot.actuate.autoconfigure.metrics.MetricsProperties; -import org.springframework.boot.actuate.autoconfigure.metrics.MetricsProperties.Web.AutoTime; -import org.springframework.boot.actuate.autoconfigure.metrics.MetricsProperties.Web.Client; +import org.springframework.boot.actuate.autoconfigure.metrics.MetricsProperties.Web.Client.ClientRequest; import org.springframework.boot.actuate.metrics.web.client.DefaultRestTemplateExchangeTagsProvider; import org.springframework.boot.actuate.metrics.web.client.MetricsRestTemplateCustomizer; import org.springframework.boot.actuate.metrics.web.client.RestTemplateExchangeTagsProvider; @@ -55,13 +54,10 @@ class RestTemplateMetricsConfiguration { MeterRegistry meterRegistry, RestTemplateExchangeTagsProvider restTemplateExchangeTagsProvider, MetricsProperties properties) { - - Client client = properties.getWeb().getClient(); - AutoTime autoTime = client.getRequest().getAutoTime(); + ClientRequest request = properties.getWeb().getClient().getRequest(); return new MetricsRestTemplateCustomizer(meterRegistry, - restTemplateExchangeTagsProvider, client.getRequest().getMetricName(), - autoTime.isEnabled(), autoTime.getDefaultPercentiles(), - autoTime.isDefaultHistogram()); + restTemplateExchangeTagsProvider, request.getMetricName(), + request.getAutotime()); } } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/web/client/WebClientMetricsConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/web/client/WebClientMetricsConfiguration.java index 5a88d721665..689772f0e0b 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/web/client/WebClientMetricsConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/web/client/WebClientMetricsConfiguration.java @@ -19,6 +19,7 @@ package org.springframework.boot.actuate.autoconfigure.metrics.web.client; import io.micrometer.core.instrument.MeterRegistry; import org.springframework.boot.actuate.autoconfigure.metrics.MetricsProperties; +import org.springframework.boot.actuate.autoconfigure.metrics.MetricsProperties.Web.Client.ClientRequest; import org.springframework.boot.actuate.metrics.web.reactive.client.DefaultWebClientExchangeTagsProvider; import org.springframework.boot.actuate.metrics.web.reactive.client.MetricsWebClientCustomizer; import org.springframework.boot.actuate.metrics.web.reactive.client.WebClientExchangeTagsProvider; @@ -48,8 +49,9 @@ class WebClientMetricsConfiguration { public MetricsWebClientCustomizer metricsWebClientCustomizer( MeterRegistry meterRegistry, WebClientExchangeTagsProvider tagsProvider, MetricsProperties properties) { + ClientRequest request = properties.getWeb().getClient().getRequest(); return new MetricsWebClientCustomizer(meterRegistry, tagsProvider, - properties.getWeb().getClient().getRequest().getMetricName()); + request.getMetricName(), request.getAutotime()); } } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/web/reactive/WebFluxMetricsAutoConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/web/reactive/WebFluxMetricsAutoConfiguration.java index 1d03e871227..fc9327ee325 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/web/reactive/WebFluxMetricsAutoConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/web/reactive/WebFluxMetricsAutoConfiguration.java @@ -21,8 +21,7 @@ import io.micrometer.core.instrument.config.MeterFilter; import org.springframework.boot.actuate.autoconfigure.metrics.MetricsAutoConfiguration; import org.springframework.boot.actuate.autoconfigure.metrics.MetricsProperties; -import org.springframework.boot.actuate.autoconfigure.metrics.MetricsProperties.Web.AutoTime; -import org.springframework.boot.actuate.autoconfigure.metrics.MetricsProperties.Web.Server; +import org.springframework.boot.actuate.autoconfigure.metrics.MetricsProperties.Web.Server.ServerRequest; import org.springframework.boot.actuate.autoconfigure.metrics.OnlyOnceLoggingDenyMeterFilter; import org.springframework.boot.actuate.autoconfigure.metrics.export.simple.SimpleMetricsExportAutoConfiguration; import org.springframework.boot.actuate.metrics.web.reactive.server.DefaultWebFluxTagsProvider; @@ -67,11 +66,9 @@ public class WebFluxMetricsAutoConfiguration { @Bean public MetricsWebFilter webfluxMetrics(MeterRegistry registry, WebFluxTagsProvider tagConfigurer) { - Server serverProperties = this.properties.getWeb().getServer(); - AutoTime autotime = serverProperties.getRequest().getAutoTime(); - return new MetricsWebFilter(registry, tagConfigurer, - serverProperties.getRequest().getMetricName(), autotime.isEnabled(), - autotime.getDefaultPercentiles(), autotime.isDefaultHistogram()); + ServerRequest request = this.properties.getWeb().getServer().getRequest(); + return new MetricsWebFilter(registry, tagConfigurer, request.getMetricName(), + request.getAutotime()); } @Bean diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/web/servlet/WebMvcMetricsAutoConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/web/servlet/WebMvcMetricsAutoConfiguration.java index 4463fac6155..7f20381eadd 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/web/servlet/WebMvcMetricsAutoConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/web/servlet/WebMvcMetricsAutoConfiguration.java @@ -23,8 +23,7 @@ import io.micrometer.core.instrument.config.MeterFilter; import org.springframework.boot.actuate.autoconfigure.metrics.MetricsAutoConfiguration; import org.springframework.boot.actuate.autoconfigure.metrics.MetricsProperties; -import org.springframework.boot.actuate.autoconfigure.metrics.MetricsProperties.Web.AutoTime; -import org.springframework.boot.actuate.autoconfigure.metrics.MetricsProperties.Web.Server; +import org.springframework.boot.actuate.autoconfigure.metrics.MetricsProperties.Web.Server.ServerRequest; import org.springframework.boot.actuate.autoconfigure.metrics.OnlyOnceLoggingDenyMeterFilter; import org.springframework.boot.actuate.autoconfigure.metrics.export.simple.SimpleMetricsExportAutoConfiguration; import org.springframework.boot.actuate.metrics.web.servlet.DefaultWebMvcTagsProvider; @@ -79,11 +78,9 @@ public class WebMvcMetricsAutoConfiguration { @Bean public FilterRegistrationBean webMvcMetricsFilter( MeterRegistry registry, WebMvcTagsProvider tagsProvider) { - Server serverProperties = this.properties.getWeb().getServer(); - AutoTime autotime = serverProperties.getRequest().getAutoTime(); + ServerRequest request = this.properties.getWeb().getServer().getRequest(); WebMvcMetricsFilter filter = new WebMvcMetricsFilter(registry, tagsProvider, - serverProperties.getRequest().getMetricName(), autotime.isEnabled(), - autotime.getDefaultPercentiles(), autotime.isDefaultHistogram()); + request.getMetricName(), request.getAutotime()); FilterRegistrationBean registration = new FilterRegistrationBean<>( filter); registration.setOrder(Ordered.HIGHEST_PRECEDENCE + 1); diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/resources/META-INF/additional-spring-configuration-metadata.json index f853bd532c9..08a7529ec5a 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/resources/META-INF/additional-spring-configuration-metadata.json +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -253,6 +253,34 @@ "level": "error" } }, + { + "name": "management.metrics.web.client.request.autotime.enabled", + "description": "Whether to automatically time web client requests.", + "defaultValue": true + }, + { + "name": "management.metrics.web.client.request.autotime.percentiles", + "description": "Computed non-aggregable percentiles to publish." + }, + { + "name": "management.metrics.web.client.request.autotime.percentiles-histogram", + "description": "Whether percentile histograms should be published.", + "defaultValue": false + }, + { + "name": "management.metrics.web.server.request.autotime.enabled", + "description": "Whether to automatically time web server requests.", + "defaultValue": true + }, + { + "name": "management.metrics.web.server.request.autotime.percentiles", + "description": "Computed non-aggregable percentiles to publish." + }, + { + "name": "management.metrics.web.server.request.autotime.percentiles-histogram", + "description": "Whether percentile histograms should be published.", + "defaultValue": false + }, { "name": "management.server.ssl.ciphers", "description": "Supported SSL ciphers." diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/web/client/RestTemplateMetricsConfigurationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/web/client/RestTemplateMetricsConfigurationTests.java index 40a5f02e676..ec61d507c74 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/web/client/RestTemplateMetricsConfigurationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/web/client/RestTemplateMetricsConfigurationTests.java @@ -17,6 +17,8 @@ package org.springframework.boot.actuate.autoconfigure.metrics.web.client; import io.micrometer.core.instrument.MeterRegistry; +import io.micrometer.core.instrument.Timer; +import io.micrometer.core.instrument.distribution.HistogramSnapshot; import org.junit.Rule; import org.junit.Test; @@ -100,6 +102,24 @@ public class RestTemplateMetricsConfigurationTests { }); } + @Test + public void autoTimeRequestsCanBeConfigured() { + this.contextRunner.withPropertyValues( + "management.metrics.web.client.request.autotime.enabled=true", + "management.metrics.web.client.request.autotime.percentiles=0.5,0.7", + "management.metrics.web.client.request.autotime.percentiles-histogram=true") + .run((context) -> { + MeterRegistry registry = getInitializedMeterRegistry(context); + Timer timer = registry.get("http.client.requests").timer(); + HistogramSnapshot snapshot = timer.takeSnapshot(); + assertThat(snapshot.percentileValues()).hasSize(2); + assertThat(snapshot.percentileValues()[0].percentile()) + .isEqualTo(0.5); + assertThat(snapshot.percentileValues()[1].percentile()) + .isEqualTo(0.7); + }); + } + @Test public void backsOffWhenRestTemplateBuilderIsMissing() { new ApplicationContextRunner().with(MetricsRun.simple()) diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/web/client/WebClientMetricsConfigurationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/web/client/WebClientMetricsConfigurationTests.java index ce92cedb7f2..8a7b1d858d3 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/web/client/WebClientMetricsConfigurationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/web/client/WebClientMetricsConfigurationTests.java @@ -19,6 +19,8 @@ package org.springframework.boot.actuate.autoconfigure.metrics.web.client; import java.time.Duration; import io.micrometer.core.instrument.MeterRegistry; +import io.micrometer.core.instrument.Timer; +import io.micrometer.core.instrument.distribution.HistogramSnapshot; import org.junit.Rule; import org.junit.Test; import reactor.core.publisher.Mono; @@ -101,6 +103,24 @@ public class WebClientMetricsConfigurationTests { }); } + @Test + public void autoTimeRequestsCanBeConfigured() { + this.contextRunner.withPropertyValues( + "management.metrics.web.client.request.autotime.enabled=true", + "management.metrics.web.client.request.autotime.percentiles=0.5,0.7", + "management.metrics.web.client.request.autotime.percentiles-histogram=true") + .run((context) -> { + MeterRegistry registry = getInitializedMeterRegistry(context); + Timer timer = registry.get("http.client.requests").timer(); + HistogramSnapshot snapshot = timer.takeSnapshot(); + assertThat(snapshot.percentileValues()).hasSize(2); + assertThat(snapshot.percentileValues()[0].percentile()) + .isEqualTo(0.5); + assertThat(snapshot.percentileValues()[1].percentile()) + .isEqualTo(0.7); + }); + } + private MeterRegistry getInitializedMeterRegistry( AssertableApplicationContext context) { WebClient webClient = mockWebClient(context.getBean(WebClient.Builder.class)); diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/web/reactive/WebFluxMetricsAutoConfigurationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/web/reactive/WebFluxMetricsAutoConfigurationTests.java index 6b15f1a95b7..d51fde76933 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/web/reactive/WebFluxMetricsAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/web/reactive/WebFluxMetricsAutoConfigurationTests.java @@ -102,7 +102,7 @@ public class WebFluxMetricsAutoConfigurationTests { .withConfiguration(AutoConfigurations.of(WebFluxAutoConfiguration.class)) .withUserConfiguration(TestController.class) .withPropertyValues( - "management.metrics.web.server.request.auto-time.enabled=false") + "management.metrics.web.server.request.autotime.enabled=false") .run((context) -> { MeterRegistry registry = getInitializedMeterRegistry(context); assertThat(registry.find("http.server.requests").meter()).isNull(); diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/web/servlet/WebMvcMetricsAutoConfigurationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/web/servlet/WebMvcMetricsAutoConfigurationTests.java index 898c499da73..1481fab1f70 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/web/servlet/WebMvcMetricsAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/web/servlet/WebMvcMetricsAutoConfigurationTests.java @@ -141,14 +141,14 @@ public class WebMvcMetricsAutoConfigurationTests { } @Test - public void autoTimeRequestsDefaultValues() { + public void autoTimeRequestsCanBeConfigured() { this.contextRunner.withUserConfiguration(TestController.class) .withConfiguration(AutoConfigurations.of(MetricsAutoConfiguration.class, WebMvcAutoConfiguration.class)) .withPropertyValues( - "management.metrics.web.server.request.auto-time.enabled=true", - "management.metrics.web.server.request.auto-time.default-percentiles=0.5,0.7", - "management.metrics.web.server.request.auto-time.default-histogram=true") + "management.metrics.web.server.request.autotime.enabled=true", + "management.metrics.web.server.request.autotime.percentiles=0.5,0.7", + "management.metrics.web.server.request.autotime.percentiles-histogram=true") .run((context) -> { MeterRegistry registry = getInitializedMeterRegistry(context); Timer timer = registry.get("http.server.requests").timer(); diff --git a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/Autotime.java b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/Autotime.java new file mode 100644 index 00000000000..e02950a2ed0 --- /dev/null +++ b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/Autotime.java @@ -0,0 +1,89 @@ +/* + * Copyright 2012-2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.actuate.metrics; + +import java.util.List; + +/** + * Settings for requests that are automatically timed. + * + * @author Tadaya Tsuyukubo + * @author Stephane Nicoll + * @since 2.2.0 + */ +public final class Autotime { + + private boolean enabled = true; + + private boolean percentilesHistogram; + + private double[] percentiles; + + /** + * Create an instance that automatically time requests with no percentiles. + */ + public Autotime() { + } + + /** + * Create an instance with the specified settings. + * @param enabled whether requests should be automatically timed + * @param percentilesHistogram whether percentile histograms should be published + * @param percentiles computed non-aggregable percentiles to publish (can be + * {@code null}) + */ + public Autotime(boolean enabled, boolean percentilesHistogram, + List percentiles) { + this.enabled = enabled; + this.percentilesHistogram = percentilesHistogram; + this.percentiles = (percentiles != null) + ? percentiles.stream().mapToDouble(Double::doubleValue).toArray() : null; + } + + /** + * Create an instance that disable auto-timed requests. + * @return an instance that disable auto-timed requests + */ + public static Autotime disabled() { + return new Autotime(false, false, null); + } + + public boolean isEnabled() { + return this.enabled; + } + + public void setEnabled(boolean enabled) { + this.enabled = enabled; + } + + public boolean isPercentilesHistogram() { + return this.percentilesHistogram; + } + + public void setPercentilesHistogram(boolean percentilesHistogram) { + this.percentilesHistogram = percentilesHistogram; + } + + public double[] getPercentiles() { + return this.percentiles; + } + + public void setPercentiles(double[] percentiles) { + this.percentiles = percentiles; + } + +} diff --git a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/web/client/MetricsClientHttpRequestInterceptor.java b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/web/client/MetricsClientHttpRequestInterceptor.java index 63c2a4d5535..d7469aca95c 100644 --- a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/web/client/MetricsClientHttpRequestInterceptor.java +++ b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/web/client/MetricsClientHttpRequestInterceptor.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 the original author or authors. + * Copyright 2012-2019 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,13 +18,13 @@ package org.springframework.boot.actuate.metrics.web.client; import java.io.IOException; import java.net.URI; -import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; import io.micrometer.core.instrument.MeterRegistry; import io.micrometer.core.instrument.Timer; +import org.springframework.boot.actuate.metrics.Autotime; import org.springframework.core.NamedThreadLocal; import org.springframework.http.HttpRequest; import org.springframework.http.client.ClientHttpRequestExecution; @@ -51,11 +51,7 @@ class MetricsClientHttpRequestInterceptor implements ClientHttpRequestIntercepto private final String metricName; - private final boolean autoTimeRequests; - - private final double[] percentiles; - - private final boolean histogram; + private final Autotime autotime; /** * Create a new {@code MetricsClientHttpRequestInterceptor}. @@ -63,11 +59,11 @@ class MetricsClientHttpRequestInterceptor implements ClientHttpRequestIntercepto * @param tagProvider provider for metrics tags * @param metricName name of the metric to record * @deprecated since 2.2.0 in favor of - * {@link #MetricsClientHttpRequestInterceptor(MeterRegistry, RestTemplateExchangeTagsProvider, String, boolean, List, boolean)} + * {@link #MetricsClientHttpRequestInterceptor(MeterRegistry, RestTemplateExchangeTagsProvider, String, Autotime)} */ MetricsClientHttpRequestInterceptor(MeterRegistry meterRegistry, RestTemplateExchangeTagsProvider tagProvider, String metricName) { - this(meterRegistry, tagProvider, metricName, true, null, false); + this(meterRegistry, tagProvider, metricName, new Autotime()); } /** @@ -75,25 +71,16 @@ class MetricsClientHttpRequestInterceptor implements ClientHttpRequestIntercepto * @param meterRegistry the registry to which metrics are recorded * @param tagProvider provider for metrics tags * @param metricName name of the metric to record - * @param autoTimeRequests if requests should be automatically timed - * @param percentileList percentiles for auto time requests - * @param histogram histogram or not for auto time requests + * @param autotime auto timed request settings * @since 2.2.0 */ MetricsClientHttpRequestInterceptor(MeterRegistry meterRegistry, RestTemplateExchangeTagsProvider tagProvider, String metricName, - boolean autoTimeRequests, List percentileList, boolean histogram) { - - double[] percentiles = (percentileList != null) - ? percentileList.stream().mapToDouble(Double::doubleValue).toArray() - : null; - + Autotime autotime) { this.tagProvider = tagProvider; this.meterRegistry = meterRegistry; this.metricName = metricName; - this.autoTimeRequests = autoTimeRequests; - this.percentiles = percentiles; - this.histogram = histogram; + this.autotime = (autotime != null) ? autotime : Autotime.disabled(); } @Override @@ -106,7 +93,7 @@ class MetricsClientHttpRequestInterceptor implements ClientHttpRequestIntercepto return response; } finally { - if (this.autoTimeRequests) { + if (this.autotime.isEnabled()) { getTimeBuilder(request, response).register(this.meterRegistry) .record(System.nanoTime() - startTime, TimeUnit.NANOSECONDS); } @@ -134,8 +121,9 @@ class MetricsClientHttpRequestInterceptor implements ClientHttpRequestIntercepto private Timer.Builder getTimeBuilder(HttpRequest request, ClientHttpResponse response) { - return Timer.builder(this.metricName).publishPercentiles(this.percentiles) - .publishPercentileHistogram(this.histogram) + return Timer.builder(this.metricName) + .publishPercentiles(this.autotime.getPercentiles()) + .publishPercentileHistogram(this.autotime.isPercentilesHistogram()) .tags(this.tagProvider.getTags(urlTemplate.get(), request, response)) .description("Timer of RestTemplate operation"); } diff --git a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/web/client/MetricsRestTemplateCustomizer.java b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/web/client/MetricsRestTemplateCustomizer.java index ac3892db2f6..9efce605a53 100644 --- a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/web/client/MetricsRestTemplateCustomizer.java +++ b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/web/client/MetricsRestTemplateCustomizer.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 the original author or authors. + * Copyright 2012-2019 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,6 +21,7 @@ import java.util.List; import io.micrometer.core.instrument.MeterRegistry; +import org.springframework.boot.actuate.metrics.Autotime; import org.springframework.boot.web.client.RestTemplateCustomizer; import org.springframework.http.client.ClientHttpRequestInterceptor; import org.springframework.web.client.RestTemplate; @@ -46,32 +47,29 @@ public class MetricsRestTemplateCustomizer implements RestTemplateCustomizer { * @param tagProvider the tag provider * @param metricName the name of the recorded metric * @deprecated since 2.2.0 in favor of - * {@link #MetricsRestTemplateCustomizer(MeterRegistry, RestTemplateExchangeTagsProvider, String, boolean, List, boolean)} + * {@link #MetricsRestTemplateCustomizer(MeterRegistry, RestTemplateExchangeTagsProvider, String, Autotime)} */ public MetricsRestTemplateCustomizer(MeterRegistry meterRegistry, RestTemplateExchangeTagsProvider tagProvider, String metricName) { - this.interceptor = new MetricsClientHttpRequestInterceptor(meterRegistry, - tagProvider, metricName); + this(meterRegistry, tagProvider, metricName, new Autotime()); } /** * Creates a new {@code MetricsRestTemplateInterceptor}. When {@code autoTimeRequests} * is set to {@code true}, the interceptor records metrics using the given * {@code meterRegistry} with tags provided by the given {@code tagProvider} and with - * {@code percentileList} and {@code histogram} configurations. + * {@link Autotime auto-timed request configuration}. * @param meterRegistry the meter registry * @param tagProvider the tag provider * @param metricName the name of the recorded metric - * @param autoTimeRequests if requests should be automatically timed - * @param percentileList percentiles for auto time requests - * @param histogram histogram or not for auto time requests + * @param autotime auto-timed request settings * @since 2.2.0 */ public MetricsRestTemplateCustomizer(MeterRegistry meterRegistry, RestTemplateExchangeTagsProvider tagProvider, String metricName, - boolean autoTimeRequests, List percentileList, boolean histogram) { + Autotime autotime) { this.interceptor = new MetricsClientHttpRequestInterceptor(meterRegistry, - tagProvider, metricName, autoTimeRequests, percentileList, histogram); + tagProvider, metricName, autotime); } @Override diff --git a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/web/reactive/client/MetricsWebClientCustomizer.java b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/web/reactive/client/MetricsWebClientCustomizer.java index 78d60852c8b..1f1984e4722 100644 --- a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/web/reactive/client/MetricsWebClientCustomizer.java +++ b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/web/reactive/client/MetricsWebClientCustomizer.java @@ -18,6 +18,7 @@ package org.springframework.boot.actuate.metrics.web.reactive.client; import io.micrometer.core.instrument.MeterRegistry; +import org.springframework.boot.actuate.metrics.Autotime; import org.springframework.boot.web.reactive.function.client.WebClientCustomizer; import org.springframework.web.reactive.function.client.WebClient; @@ -39,11 +40,30 @@ public class MetricsWebClientCustomizer implements WebClientCustomizer { * @param meterRegistry the meter registry * @param tagProvider the tag provider * @param metricName the name of the recorded metric + * @deprecated since 2.2.0 in favor of + * {@link #MetricsWebClientCustomizer(MeterRegistry, WebClientExchangeTagsProvider, String, Autotime)} */ + @Deprecated public MetricsWebClientCustomizer(MeterRegistry meterRegistry, WebClientExchangeTagsProvider tagProvider, String metricName) { + this(meterRegistry, tagProvider, metricName, new Autotime()); + } + + /** + * Create a new {@code MetricsWebClientFilterFunction} that will record metrics using + * the given {@code meterRegistry} with tags provided by the given + * {@code tagProvider}. + * @param meterRegistry the meter registry + * @param tagProvider the tag provider + * @param metricName the name of the recorded metric + * @param autotime auto-timed request settings + * @since 2.2.0 + */ + public MetricsWebClientCustomizer(MeterRegistry meterRegistry, + WebClientExchangeTagsProvider tagProvider, String metricName, + Autotime autotime) { this.filterFunction = new MetricsWebClientFilterFunction(meterRegistry, - tagProvider, metricName); + tagProvider, metricName, autotime); } @Override diff --git a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/web/reactive/client/MetricsWebClientFilterFunction.java b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/web/reactive/client/MetricsWebClientFilterFunction.java index 0fc99967f82..0943fe7f331 100644 --- a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/web/reactive/client/MetricsWebClientFilterFunction.java +++ b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/web/reactive/client/MetricsWebClientFilterFunction.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 the original author or authors. + * Copyright 2012-2019 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,7 +16,6 @@ package org.springframework.boot.actuate.metrics.web.reactive.client; -import java.util.List; import java.util.concurrent.TimeUnit; import io.micrometer.core.instrument.MeterRegistry; @@ -24,6 +23,7 @@ import io.micrometer.core.instrument.Tag; import io.micrometer.core.instrument.Timer; import reactor.core.publisher.Mono; +import org.springframework.boot.actuate.metrics.Autotime; import org.springframework.web.reactive.function.client.ClientRequest; import org.springframework.web.reactive.function.client.ClientResponse; import org.springframework.web.reactive.function.client.ExchangeFilterFunction; @@ -48,11 +48,7 @@ public class MetricsWebClientFilterFunction implements ExchangeFilterFunction { private final String metricName; - private final boolean autoTimeRequests; - - private final double[] percentiles; - - private final boolean histogram; + private final Autotime autotime; /** * Create a new {@code MetricsWebClientFilterFunction}. @@ -60,11 +56,12 @@ public class MetricsWebClientFilterFunction implements ExchangeFilterFunction { * @param tagProvider provider for metrics tags * @param metricName name of the metric to record * @deprecated since 2.2.0 in favor of - * {@link #MetricsWebClientFilterFunction(MeterRegistry, WebClientExchangeTagsProvider, String, boolean, List, boolean)} + * {@link #MetricsWebClientFilterFunction(MeterRegistry, WebClientExchangeTagsProvider, String, Autotime)} */ + @Deprecated public MetricsWebClientFilterFunction(MeterRegistry meterRegistry, WebClientExchangeTagsProvider tagProvider, String metricName) { - this(meterRegistry, tagProvider, metricName, true, null, false); + this(meterRegistry, tagProvider, metricName, new Autotime()); } /** @@ -72,40 +69,33 @@ public class MetricsWebClientFilterFunction implements ExchangeFilterFunction { * @param meterRegistry the registry to which metrics are recorded * @param tagProvider provider for metrics tags * @param metricName name of the metric to record - * @param autoTimeRequests if requests should be automatically timed - * @param percentileList percentiles for auto time requests - * @param histogram histogram or not for auto time requests + * @param autotime auto-timed request settings * @since 2.2.0 */ public MetricsWebClientFilterFunction(MeterRegistry meterRegistry, WebClientExchangeTagsProvider tagProvider, String metricName, - boolean autoTimeRequests, List percentileList, boolean histogram) { - - double[] percentiles = (percentileList != null) - ? percentileList.stream().mapToDouble(Double::doubleValue).toArray() - : null; - + Autotime autotime) { this.meterRegistry = meterRegistry; this.tagProvider = tagProvider; this.metricName = metricName; - this.autoTimeRequests = autoTimeRequests; - this.percentiles = percentiles; - this.histogram = histogram; + this.autotime = (autotime != null) ? autotime : Autotime.disabled(); } @Override public Mono filter(ClientRequest clientRequest, ExchangeFunction exchangeFunction) { return exchangeFunction.exchange(clientRequest).doOnEach((signal) -> { - if (!signal.isOnComplete() && this.autoTimeRequests) { + if (!signal.isOnComplete() && this.autotime.isEnabled()) { Long startTime = signal.getContext().get(METRICS_WEBCLIENT_START_TIME); ClientResponse clientResponse = signal.get(); Throwable throwable = signal.getThrowable(); Iterable tags = this.tagProvider.tags(clientRequest, clientResponse, throwable); - Timer.builder(this.metricName).publishPercentiles(this.percentiles) - .publishPercentileHistogram(this.histogram).tags(tags) - .description("Timer of WebClient operation") + Timer.builder(this.metricName) + .publishPercentiles(this.autotime.getPercentiles()) + .publishPercentileHistogram( + this.autotime.isPercentilesHistogram()) + .tags(tags).description("Timer of WebClient operation") .register(this.meterRegistry) .record(System.nanoTime() - startTime, TimeUnit.NANOSECONDS); } diff --git a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/web/reactive/server/MetricsWebFilter.java b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/web/reactive/server/MetricsWebFilter.java index 6659a93025f..16861b014de 100644 --- a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/web/reactive/server/MetricsWebFilter.java +++ b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/web/reactive/server/MetricsWebFilter.java @@ -16,7 +16,6 @@ package org.springframework.boot.actuate.metrics.web.reactive.server; -import java.util.List; import java.util.concurrent.TimeUnit; import io.micrometer.core.instrument.MeterRegistry; @@ -25,6 +24,7 @@ import io.micrometer.core.instrument.Timer; import org.reactivestreams.Publisher; import reactor.core.publisher.Mono; +import org.springframework.boot.actuate.metrics.Autotime; import org.springframework.core.Ordered; import org.springframework.core.annotation.Order; import org.springframework.http.server.reactive.ServerHttpResponse; @@ -48,11 +48,7 @@ public class MetricsWebFilter implements WebFilter { private final String metricName; - private final boolean autoTimeRequests; - - private final double[] percentiles; - - private final boolean histogram; + private final Autotime autotime; /** * Create a new {@code MetricsWebFilter}. @@ -61,12 +57,13 @@ public class MetricsWebFilter implements WebFilter { * @param metricName name of the metric to record * @param autoTimeRequests if requests should be automatically timed * @deprecated since 2.2.0 in favor of - * {@link #MetricsWebFilter(MeterRegistry, WebFluxTagsProvider, String, boolean, List, boolean)} + * {@link #MetricsWebFilter(MeterRegistry, WebFluxTagsProvider, String, Autotime)} */ @Deprecated public MetricsWebFilter(MeterRegistry registry, WebFluxTagsProvider tagsProvider, String metricName, boolean autoTimeRequests) { - this(registry, tagsProvider, metricName, autoTimeRequests, null, false); + this(registry, tagsProvider, metricName, + new Autotime(autoTimeRequests, false, null)); } /** @@ -74,30 +71,20 @@ public class MetricsWebFilter implements WebFilter { * @param registry the registry to which metrics are recorded * @param tagsProvider provider for metrics tags * @param metricName name of the metric to record - * @param autoTimeRequests if requests should be automatically timed - * @param percentileList percentiles for auto time requests - * @param histogram histogram or not for auto time requests + * @param autotime auto timed request settings * @since 2.2.0 */ public MetricsWebFilter(MeterRegistry registry, WebFluxTagsProvider tagsProvider, - String metricName, boolean autoTimeRequests, List percentileList, - boolean histogram) { - - double[] percentiles = (percentileList != null) - ? percentileList.stream().mapToDouble(Double::doubleValue).toArray() - : null; - + String metricName, Autotime autotime) { this.registry = registry; this.tagsProvider = tagsProvider; this.metricName = metricName; - this.autoTimeRequests = autoTimeRequests; - this.percentiles = percentiles; - this.histogram = histogram; + this.autotime = (autotime != null) ? autotime : Autotime.disabled(); } @Override public Mono filter(ServerWebExchange exchange, WebFilterChain chain) { - if (this.autoTimeRequests) { + if (this.autotime.isEnabled()) { return chain.filter(exchange).compose((call) -> filter(exchange, call)); } return chain.filter(exchange); @@ -122,8 +109,10 @@ public class MetricsWebFilter implements WebFilter { private void record(ServerWebExchange exchange, long start, Throwable cause) { Iterable tags = this.tagsProvider.httpRequestTags(exchange, cause); - Timer.builder(this.metricName).tags(tags).publishPercentiles(this.percentiles) - .publishPercentileHistogram(this.histogram).register(this.registry) + Timer.builder(this.metricName).tags(tags) + .publishPercentiles(this.autotime.getPercentiles()) + .publishPercentileHistogram(this.autotime.isPercentilesHistogram()) + .register(this.registry) .record(System.nanoTime() - start, TimeUnit.NANOSECONDS); } diff --git a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/web/servlet/WebMvcMetricsFilter.java b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/web/servlet/WebMvcMetricsFilter.java index 05913ef0f4d..c210c779749 100644 --- a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/web/servlet/WebMvcMetricsFilter.java +++ b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/web/servlet/WebMvcMetricsFilter.java @@ -19,7 +19,6 @@ package org.springframework.boot.actuate.metrics.web.servlet; import java.io.IOException; import java.lang.reflect.AnnotatedElement; import java.util.Collections; -import java.util.List; import java.util.Set; import java.util.function.Supplier; @@ -35,6 +34,7 @@ import io.micrometer.core.instrument.Timer; import io.micrometer.core.instrument.Timer.Builder; import io.micrometer.core.instrument.Timer.Sample; +import org.springframework.boot.actuate.metrics.Autotime; import org.springframework.core.annotation.MergedAnnotationCollectors; import org.springframework.core.annotation.MergedAnnotations; import org.springframework.http.HttpStatus; @@ -60,11 +60,7 @@ public class WebMvcMetricsFilter extends OncePerRequestFilter { private final String metricName; - private final boolean autoTimeRequests; - - private final double[] autoTimeRequestsPercentiles; - - private final boolean autoTimeRequestsHistogram; + private final Autotime autotime; /** * Create a new {@link WebMvcMetricsFilter} instance. @@ -73,13 +69,14 @@ public class WebMvcMetricsFilter extends OncePerRequestFilter { * @param metricName the metric name * @param autoTimeRequests if requests should be automatically timed * @since 2.0.7 - * @deprecated since 2.1.4 in favor of - * {@link #WebMvcMetricsFilter(MeterRegistry, WebMvcTagsProvider, String, boolean, List, boolean)} + * @deprecated since 2.2.0 in favor of + * {@link #WebMvcMetricsFilter(MeterRegistry, WebMvcTagsProvider, String, Autotime)} */ @Deprecated public WebMvcMetricsFilter(MeterRegistry registry, WebMvcTagsProvider tagsProvider, String metricName, boolean autoTimeRequests) { - this(registry, tagsProvider, metricName, autoTimeRequests, null, false); + this(registry, tagsProvider, metricName, + new Autotime(autoTimeRequests, false, null)); } /** @@ -87,26 +84,15 @@ public class WebMvcMetricsFilter extends OncePerRequestFilter { * @param registry the meter registry * @param tagsProvider the tags provider * @param metricName the metric name - * @param autoTimeRequests if requests should be automatically timed - * @param autoTimeRequestsPercentiles default percentiles if requests are auto timed - * @param autoTimeRequestsHistogram default histogram flag if requests are auto timed + * @param autotime auto timed request settings * @since 2.2.0 */ public WebMvcMetricsFilter(MeterRegistry registry, WebMvcTagsProvider tagsProvider, - String metricName, boolean autoTimeRequests, - List autoTimeRequestsPercentiles, boolean autoTimeRequestsHistogram) { - - double[] percentiles = (autoTimeRequestsPercentiles != null) - ? autoTimeRequestsPercentiles.stream().mapToDouble(Double::doubleValue) - .toArray() - : null; - + String metricName, Autotime autotime) { this.registry = registry; this.tagsProvider = tagsProvider; this.metricName = metricName; - this.autoTimeRequests = autoTimeRequests; - this.autoTimeRequestsPercentiles = percentiles; - this.autoTimeRequestsHistogram = autoTimeRequestsHistogram; + this.autotime = autotime; } @Override @@ -187,10 +173,12 @@ public class WebMvcMetricsFilter extends OncePerRequestFilter { Supplier> tags = () -> this.tagsProvider.getTags(request, response, handlerObject, exception); if (annotations.isEmpty()) { - if (this.autoTimeRequests) { - stop(timerSample, tags, Timer.builder(this.metricName) - .publishPercentiles(this.autoTimeRequestsPercentiles) - .publishPercentileHistogram(this.autoTimeRequestsHistogram)); + if (this.autotime.isEnabled()) { + stop(timerSample, tags, + Timer.builder(this.metricName) + .publishPercentiles(this.autotime.getPercentiles()) + .publishPercentileHistogram( + this.autotime.isPercentilesHistogram())); } } else { diff --git a/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/web/client/MetricsRestTemplateCustomizerTests.java b/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/web/client/MetricsRestTemplateCustomizerTests.java index 1c7c01fc933..89369bf8eb7 100644 --- a/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/web/client/MetricsRestTemplateCustomizerTests.java +++ b/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/web/client/MetricsRestTemplateCustomizerTests.java @@ -27,6 +27,7 @@ import io.micrometer.core.instrument.simple.SimpleMeterRegistry; import org.junit.Before; import org.junit.Test; +import org.springframework.boot.actuate.metrics.Autotime; import org.springframework.http.HttpMethod; import org.springframework.http.MediaType; import org.springframework.test.web.client.MockRestServiceServer; @@ -59,7 +60,7 @@ public class MetricsRestTemplateCustomizerTests { this.mockServer = MockRestServiceServer.createServer(this.restTemplate); this.customizer = new MetricsRestTemplateCustomizer(this.registry, new DefaultRestTemplateExchangeTagsProvider(), "http.client.requests", - true, null, false); + new Autotime()); this.customizer.customize(this.restTemplate); } diff --git a/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/web/reactive/client/MetricsWebClientCustomizerTests.java b/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/web/reactive/client/MetricsWebClientCustomizerTests.java index 63ba7bb154a..8f82938b222 100644 --- a/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/web/reactive/client/MetricsWebClientCustomizerTests.java +++ b/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/web/reactive/client/MetricsWebClientCustomizerTests.java @@ -40,7 +40,7 @@ public class MetricsWebClientCustomizerTests { @Before public void setup() { this.customizer = new MetricsWebClientCustomizer(mock(MeterRegistry.class), - mock(WebClientExchangeTagsProvider.class), "test"); + mock(WebClientExchangeTagsProvider.class), "test", null); this.clientBuilder = WebClient.builder(); } diff --git a/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/web/reactive/client/MetricsWebClientFilterFunctionTests.java b/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/web/reactive/client/MetricsWebClientFilterFunctionTests.java index 41475b12b0d..9c24fd2c3ab 100644 --- a/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/web/reactive/client/MetricsWebClientFilterFunctionTests.java +++ b/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/web/reactive/client/MetricsWebClientFilterFunctionTests.java @@ -30,6 +30,7 @@ import org.junit.Before; import org.junit.Test; import reactor.core.publisher.Mono; +import org.springframework.boot.actuate.metrics.Autotime; import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; import org.springframework.web.reactive.function.client.ClientRequest; @@ -63,7 +64,8 @@ public class MetricsWebClientFilterFunctionTests { public void setup() { this.registry = new SimpleMeterRegistry(SimpleConfig.DEFAULT, new MockClock()); this.filterFunction = new MetricsWebClientFilterFunction(this.registry, - new DefaultWebClientExchangeTagsProvider(), "http.client.requests"); + new DefaultWebClientExchangeTagsProvider(), "http.client.requests", + new Autotime()); this.response = mock(ClientResponse.class); this.exchange = (r) -> Mono.just(this.response); } diff --git a/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/web/reactive/server/MetricsWebFilterTests.java b/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/web/reactive/server/MetricsWebFilterTests.java index fc09bce730f..dcae4bafcde 100644 --- a/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/web/reactive/server/MetricsWebFilterTests.java +++ b/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/web/reactive/server/MetricsWebFilterTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 the original author or authors. + * Copyright 2012-2019 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -25,6 +25,7 @@ import org.junit.Before; import org.junit.Test; import reactor.core.publisher.Mono; +import org.springframework.boot.actuate.metrics.Autotime; import org.springframework.mock.http.server.reactive.MockServerHttpRequest; import org.springframework.mock.web.server.MockServerWebExchange; import org.springframework.web.reactive.HandlerMapping; @@ -50,8 +51,7 @@ public class MetricsWebFilterTests { MockClock clock = new MockClock(); this.registry = new SimpleMeterRegistry(SimpleConfig.DEFAULT, clock); this.webFilter = new MetricsWebFilter(this.registry, - new DefaultWebFluxTagsProvider(), REQUEST_METRICS_NAME, true, null, - false); + new DefaultWebFluxTagsProvider(), REQUEST_METRICS_NAME, new Autotime()); } @Test diff --git a/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/web/servlet/WebMvcMetricsFilterAutoTimedTests.java b/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/web/servlet/WebMvcMetricsFilterAutoTimedTests.java index df84c90372f..03b5290f86b 100644 --- a/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/web/servlet/WebMvcMetricsFilterAutoTimedTests.java +++ b/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/web/servlet/WebMvcMetricsFilterAutoTimedTests.java @@ -30,6 +30,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.actuate.metrics.Autotime; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; @@ -106,7 +107,8 @@ public class WebMvcMetricsFilterAutoTimedTests { public WebMvcMetricsFilter webMetricsFilter(WebApplicationContext context, MeterRegistry registry) { return new WebMvcMetricsFilter(registry, new DefaultWebMvcTagsProvider(), - "http.server.requests", true, Arrays.asList(0.5, 0.95), true); + "http.server.requests", + new Autotime(true, true, Arrays.asList(0.5, 0.95))); } } diff --git a/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/web/servlet/WebMvcMetricsFilterTests.java b/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/web/servlet/WebMvcMetricsFilterTests.java index 641af163101..f7ef2e1346a 100644 --- a/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/web/servlet/WebMvcMetricsFilterTests.java +++ b/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/web/servlet/WebMvcMetricsFilterTests.java @@ -56,6 +56,7 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.actuate.metrics.Autotime; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; @@ -372,7 +373,7 @@ public class WebMvcMetricsFilterTests { WebMvcMetricsFilter webMetricsFilter(MeterRegistry registry, WebApplicationContext ctx) { return new WebMvcMetricsFilter(registry, new DefaultWebMvcTagsProvider(), - "http.server.requests", true, null, false); + "http.server.requests", new Autotime()); } } diff --git a/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/web/servlet/WebMvcMetricsIntegrationTests.java b/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/web/servlet/WebMvcMetricsIntegrationTests.java index a30abc38eff..06ae5ccb3ba 100644 --- a/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/web/servlet/WebMvcMetricsIntegrationTests.java +++ b/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/web/servlet/WebMvcMetricsIntegrationTests.java @@ -27,6 +27,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.actuate.metrics.Autotime; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpStatus; @@ -111,7 +112,7 @@ public class WebMvcMetricsIntegrationTests { public WebMvcMetricsFilter webMetricsFilter(MeterRegistry registry, WebApplicationContext ctx) { return new WebMvcMetricsFilter(registry, new DefaultWebMvcTagsProvider(), - "http.server.requests", true, null, false); + "http.server.requests", new Autotime()); } @Configuration(proxyBeanMethods = false) diff --git a/spring-boot-project/spring-boot-docs/src/main/asciidoc/production-ready-features.adoc b/spring-boot-project/spring-boot-docs/src/main/asciidoc/production-ready-features.adoc index 89734a0f200..3b310afbf8e 100644 --- a/spring-boot-project/spring-boot-docs/src/main/asciidoc/production-ready-features.adoc +++ b/spring-boot-project/spring-boot-docs/src/main/asciidoc/production-ready-features.adoc @@ -1801,9 +1801,9 @@ application's absolute start time [[production-ready-metrics-spring-mvc]] ==== Spring MVC Metrics Auto-configuration enables the instrumentation of requests handled by Spring MVC. When -`management.metrics.web.server.request.auto-time.enabled` is `true`, this instrumentation occurs -for all requests. Alternatively, when set to `false`, you can enable instrumentation by -adding `@Timed` to a request-handling method: +`management.metrics.web.server.request.autotime.enabled` is `true`, this instrumentation +occurs for all requests. Alternatively, when set to `false`, you can enable +instrumentation by adding `@Timed` to a request-handling method: [source,java,indent=0] ---- @@ -1896,8 +1896,8 @@ To customize the tags, provide a `@Bean` that implements `WebFluxTagsProvider`. [[production-ready-metrics-jersey-server]] ==== Jersey Server Metrics Auto-configuration enables the instrumentation of requests handled by the Jersey JAX-RS -implementation. When `management.metrics.web.server.request.auto-time.enabled` is `true`, this -instrumentation occurs for all requests. Alternatively, when set to `false`, you can +implementation. When `management.metrics.web.server.request.autotime.enabled` is `true`, +this instrumentation occurs for all requests. Alternatively, when set to `false`, you can enable instrumentation by adding `@Timed` to a request-handling method: [source,java,indent=0]