Skip to content

Commit 367e9e7

Browse files
committed
Make autoTimeRequests an independent property
In MetricsProperties, made the autoTimeRequests related properties to an independent property. Also, - convert double[] to List<Double> in properties - update the version in deprecation javadoc
1 parent fe8b9dd commit 367e9e7

File tree

10 files changed

+111
-94
lines changed

10 files changed

+111
-94
lines changed

spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/MetricsProperties.java

Lines changed: 54 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@
1616

1717
package org.springframework.boot.actuate.autoconfigure.metrics;
1818

19+
import java.util.ArrayList;
1920
import java.util.LinkedHashMap;
21+
import java.util.List;
2022
import java.util.Map;
2123

2224
import org.springframework.boot.context.properties.ConfigurationProperties;
@@ -125,27 +127,7 @@ public void setMaxUriTags(int maxUriTags) {
125127

126128
public static class Server {
127129

128-
/**
129-
* Whether requests handled by Spring MVC, WebFlux or Jersey should be
130-
* automatically timed. If the number of time series emitted grows too large
131-
* on account of request mapping timings, disable this and use 'Timed' on a
132-
* per request mapping basis as needed.
133-
*/
134-
private boolean autoTimeRequests = true;
135-
136-
/**
137-
* Default percentiles when "autoTimeRequests=true" and @Timed annotation is
138-
* not presented on the corresponding request handler. Any @Timed annotation
139-
* presented will have precedence.
140-
*/
141-
private double[] autoTimeRequestsDefaultPercentiles;
142-
143-
/**
144-
* Default histogram when "autoTimeRequests=true" and @Timed annotation is not
145-
* presented on the corresponding request handler. Any @Timed annotation
146-
* presented will have precedence.
147-
*/
148-
private boolean autoTimeRequestsDefaultHistogram;
130+
private final AutoTimeRequests autoTimeRequests = new AutoTimeRequests();
149131

150132
/**
151133
* Name of the metric for received requests.
@@ -159,32 +141,10 @@ public static class Server {
159141
*/
160142
private int maxUriTags = 100;
161143

162-
public boolean isAutoTimeRequests() {
144+
public AutoTimeRequests getAutoTimeRequests() {
163145
return this.autoTimeRequests;
164146
}
165147

166-
public void setAutoTimeRequests(boolean autoTimeRequests) {
167-
this.autoTimeRequests = autoTimeRequests;
168-
}
169-
170-
public double[] getAutoTimeRequestsDefaultPercentiles() {
171-
return this.autoTimeRequestsDefaultPercentiles;
172-
}
173-
174-
public void setAutoTimeRequestsDefaultPercentiles(
175-
double[] autoTimeRequestsDefaultPercentiles) {
176-
this.autoTimeRequestsDefaultPercentiles = autoTimeRequestsDefaultPercentiles;
177-
}
178-
179-
public boolean isAutoTimeRequestsDefaultHistogram() {
180-
return this.autoTimeRequestsDefaultHistogram;
181-
}
182-
183-
public void setAutoTimeRequestsDefaultHistogram(
184-
boolean autoTimeRequestsDefaultHistogram) {
185-
this.autoTimeRequestsDefaultHistogram = autoTimeRequestsDefaultHistogram;
186-
}
187-
188148
public String getRequestsMetricName() {
189149
return this.requestsMetricName;
190150
}
@@ -201,6 +161,56 @@ public void setMaxUriTags(int maxUriTags) {
201161
this.maxUriTags = maxUriTags;
202162
}
203163

164+
public static class AutoTimeRequests {
165+
166+
/**
167+
* Whether requests handled by Spring MVC, WebFlux or Jersey should be
168+
* automatically timed. If the number of time series emitted grows too
169+
* large on account of request mapping timings, disable this and use
170+
* 'Timed' on a per request mapping basis as needed.
171+
*/
172+
private boolean enabled = true;
173+
174+
/**
175+
* Default percentiles when @Timed annotation is not presented on the
176+
* corresponding request handler. Any @Timed annotation presented will
177+
* have precedence.
178+
*/
179+
private List<Double> percentiles = new ArrayList<>();
180+
181+
/**
182+
* Default histogram when @Timed annotation is not presented on the
183+
* corresponding request handler. Any @Timed annotation presented will
184+
* have precedence.
185+
*/
186+
private boolean histogram;
187+
188+
public boolean isEnabled() {
189+
return this.enabled;
190+
}
191+
192+
public void setEnabled(boolean enabled) {
193+
this.enabled = enabled;
194+
}
195+
196+
public List<Double> getPercentiles() {
197+
return this.percentiles;
198+
}
199+
200+
public void setPercentiles(List<Double> percentiles) {
201+
this.percentiles = percentiles;
202+
}
203+
204+
public boolean isHistogram() {
205+
return this.histogram;
206+
}
207+
208+
public void setHistogram(boolean histogram) {
209+
this.histogram = histogram;
210+
}
211+
212+
}
213+
204214
}
205215

206216
}

spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/jersey/JerseyServerMetricsAutoConfiguration.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,8 @@ public ResourceConfigCustomizer jerseyServerMetricsResourceConfigCustomizer(
8080
Server server = this.properties.getWeb().getServer();
8181
return (config) -> config.register(new MetricsApplicationEventListener(
8282
meterRegistry, tagsProvider, server.getRequestsMetricName(),
83-
server.isAutoTimeRequests(), new AnnotationUtilsAnnotationFinder()));
83+
server.getAutoTimeRequests().isEnabled(),
84+
new AnnotationUtilsAnnotationFinder()));
8485
}
8586

8687
@Bean

spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/web/reactive/WebFluxMetricsAutoConfiguration.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.springframework.boot.actuate.autoconfigure.metrics.MetricsAutoConfiguration;
2323
import org.springframework.boot.actuate.autoconfigure.metrics.MetricsProperties;
2424
import org.springframework.boot.actuate.autoconfigure.metrics.MetricsProperties.Web.Server;
25+
import org.springframework.boot.actuate.autoconfigure.metrics.MetricsProperties.Web.Server.AutoTimeRequests;
2526
import org.springframework.boot.actuate.autoconfigure.metrics.OnlyOnceLoggingDenyMeterFilter;
2627
import org.springframework.boot.actuate.autoconfigure.metrics.export.simple.SimpleMetricsExportAutoConfiguration;
2728
import org.springframework.boot.actuate.metrics.web.reactive.server.DefaultWebFluxTagsProvider;
@@ -67,11 +68,10 @@ public DefaultWebFluxTagsProvider webfluxTagConfigurer() {
6768
public MetricsWebFilter webfluxMetrics(MeterRegistry registry,
6869
WebFluxTagsProvider tagConfigurer) {
6970
Server serverProperties = this.properties.getWeb().getServer();
71+
AutoTimeRequests autoTimeRequests = serverProperties.getAutoTimeRequests();
7072
return new MetricsWebFilter(registry, tagConfigurer,
71-
serverProperties.getRequestsMetricName(),
72-
serverProperties.isAutoTimeRequests(),
73-
serverProperties.getAutoTimeRequestsDefaultPercentiles(),
74-
serverProperties.isAutoTimeRequestsDefaultHistogram());
73+
serverProperties.getRequestsMetricName(), autoTimeRequests.isEnabled(),
74+
autoTimeRequests.getPercentiles(), autoTimeRequests.isHistogram());
7575
}
7676

7777
@Bean

spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/web/servlet/WebMvcMetricsAutoConfiguration.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.springframework.boot.actuate.autoconfigure.metrics.MetricsAutoConfiguration;
2525
import org.springframework.boot.actuate.autoconfigure.metrics.MetricsProperties;
2626
import org.springframework.boot.actuate.autoconfigure.metrics.MetricsProperties.Web.Server;
27+
import org.springframework.boot.actuate.autoconfigure.metrics.MetricsProperties.Web.Server.AutoTimeRequests;
2728
import org.springframework.boot.actuate.autoconfigure.metrics.OnlyOnceLoggingDenyMeterFilter;
2829
import org.springframework.boot.actuate.autoconfigure.metrics.export.simple.SimpleMetricsExportAutoConfiguration;
2930
import org.springframework.boot.actuate.metrics.web.servlet.DefaultWebMvcTagsProvider;
@@ -79,11 +80,10 @@ public DefaultWebMvcTagsProvider webMvcTagsProvider() {
7980
public FilterRegistrationBean<WebMvcMetricsFilter> webMvcMetricsFilter(
8081
MeterRegistry registry, WebMvcTagsProvider tagsProvider) {
8182
Server serverProperties = this.properties.getWeb().getServer();
83+
AutoTimeRequests autoTimeRequests = serverProperties.getAutoTimeRequests();
8284
WebMvcMetricsFilter filter = new WebMvcMetricsFilter(registry, tagsProvider,
83-
serverProperties.getRequestsMetricName(),
84-
serverProperties.isAutoTimeRequests(),
85-
serverProperties.getAutoTimeRequestsDefaultPercentiles(),
86-
serverProperties.isAutoTimeRequestsDefaultHistogram());
85+
serverProperties.getRequestsMetricName(), autoTimeRequests.isEnabled(),
86+
autoTimeRequests.getPercentiles(), autoTimeRequests.isHistogram());
8787
FilterRegistrationBean<WebMvcMetricsFilter> registration = new FilterRegistrationBean<>(
8888
filter);
8989
registration.setOrder(Ordered.HIGHEST_PRECEDENCE + 1);

spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/web/reactive/WebFluxMetricsAutoConfigurationTests.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ public void metricsAreNotRecordedIfAutoTimeRequestsIsDisabled() {
102102
.withConfiguration(AutoConfigurations.of(WebFluxAutoConfiguration.class))
103103
.withUserConfiguration(TestController.class)
104104
.withPropertyValues(
105-
"management.metrics.web.server.auto-time-requests=false")
105+
"management.metrics.web.server.auto-time-requests.enabled=false")
106106
.run((context) -> {
107107
MeterRegistry registry = getInitializedMeterRegistry(context);
108108
assertThat(registry.find("http.server.requests").meter()).isNull();

spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/web/servlet/WebMvcMetricsAutoConfigurationTests.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,8 +145,9 @@ public void autoTimeRequestsDefaultValues() {
145145
.withConfiguration(AutoConfigurations.of(MetricsAutoConfiguration.class,
146146
WebMvcAutoConfiguration.class))
147147
.withPropertyValues(
148-
"management.metrics.web.server.autoTimeRequestsDefaultPercentiles=0.5,0.7",
149-
"management.metrics.web.server.autoTimeRequestsDefaultHistogram=true")
148+
"management.metrics.web.server.auto-time-requests.enabled=true",
149+
"management.metrics.web.server.auto-time-requests.percentiles=0.5,0.7",
150+
"management.metrics.web.server.auto-time-requests.histogram=true")
150151
.run((context) -> {
151152
MeterRegistry registry = getInitializedMeterRegistry(context);
152153
Timer timer = registry.get("http.server.requests").timer();

spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/web/reactive/server/MetricsWebFilter.java

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package org.springframework.boot.actuate.metrics.web.reactive.server;
1818

19+
import java.util.List;
1920
import java.util.concurrent.TimeUnit;
2021

2122
import io.micrometer.core.instrument.MeterRegistry;
@@ -49,18 +50,18 @@ public class MetricsWebFilter implements WebFilter {
4950

5051
private final boolean autoTimeRequests;
5152

52-
private final double[] autoTimeRequestsDefaultPercentiles;
53+
private final double[] percentiles;
5354

54-
private final boolean autoTimeRequestsDefaultHistogram;
55+
private final boolean histogram;
5556

5657
/**
5758
* Create a new {@code MetricsWebFilter}.
5859
* @param registry the registry to which metrics are recorded
5960
* @param tagsProvider provider for metrics tags
6061
* @param metricName name of the metric to record
6162
* @param autoTimeRequests if requests should be automatically timed
62-
* @deprecated since 2.1.4 in favor of
63-
* {@link #MetricsWebFilter(MeterRegistry, WebFluxTagsProvider, String, boolean, double[], boolean)}
63+
* @deprecated since 2.2.0 in favor of
64+
* {@link #MetricsWebFilter(MeterRegistry, WebFluxTagsProvider, String, boolean, List, boolean)}
6465
*/
6566
@Deprecated
6667
public MetricsWebFilter(MeterRegistry registry, WebFluxTagsProvider tagsProvider,
@@ -74,21 +75,24 @@ public MetricsWebFilter(MeterRegistry registry, WebFluxTagsProvider tagsProvider
7475
* @param tagsProvider provider for metrics tags
7576
* @param metricName name of the metric to record
7677
* @param autoTimeRequests if requests should be automatically timed
77-
* @param autoTimeRequestsDefaultPercentiles default percentiles for auto time
78-
* requests
79-
* @param autoTimeRequestsDefaultHistogram default histogram for auto time requests
80-
* @since 2.1.4
78+
* @param percentileList percentiles for auto time requests
79+
* @param histogram histogram or not for auto time requests
80+
* @since 2.2.0
8181
*/
8282
public MetricsWebFilter(MeterRegistry registry, WebFluxTagsProvider tagsProvider,
83-
String metricName, boolean autoTimeRequests,
84-
double[] autoTimeRequestsDefaultPercentiles,
85-
boolean autoTimeRequestsDefaultHistogram) {
83+
String metricName, boolean autoTimeRequests, List<Double> percentileList,
84+
boolean histogram) {
85+
86+
double[] percentiles = (percentileList != null)
87+
? percentileList.stream().mapToDouble(Double::doubleValue).toArray()
88+
: null;
89+
8690
this.registry = registry;
8791
this.tagsProvider = tagsProvider;
8892
this.metricName = metricName;
8993
this.autoTimeRequests = autoTimeRequests;
90-
this.autoTimeRequestsDefaultPercentiles = autoTimeRequestsDefaultPercentiles;
91-
this.autoTimeRequestsDefaultHistogram = autoTimeRequestsDefaultHistogram;
94+
this.percentiles = percentiles;
95+
this.histogram = histogram;
9296
}
9397

9498
@Override
@@ -118,10 +122,8 @@ private Publisher<Void> filter(ServerWebExchange exchange, Mono<Void> call) {
118122

119123
private void record(ServerWebExchange exchange, long start, Throwable cause) {
120124
Iterable<Tag> tags = this.tagsProvider.httpRequestTags(exchange, cause);
121-
Timer.builder(this.metricName).tags(tags)
122-
.publishPercentiles(this.autoTimeRequestsDefaultPercentiles)
123-
.publishPercentileHistogram(this.autoTimeRequestsDefaultHistogram)
124-
.register(this.registry)
125+
Timer.builder(this.metricName).tags(tags).publishPercentiles(this.percentiles)
126+
.publishPercentileHistogram(this.histogram).register(this.registry)
125127
.record(System.nanoTime() - start, TimeUnit.NANOSECONDS);
126128
}
127129

spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/web/servlet/WebMvcMetricsFilter.java

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import java.io.IOException;
2020
import java.lang.reflect.AnnotatedElement;
2121
import java.util.Collections;
22+
import java.util.List;
2223
import java.util.Set;
2324
import java.util.function.Supplier;
2425

@@ -60,9 +61,9 @@ public class WebMvcMetricsFilter extends OncePerRequestFilter {
6061

6162
private final boolean autoTimeRequests;
6263

63-
private final double[] autoTimeRequestsDefaultPercentiles;
64+
private final double[] autoTimeRequestsPercentiles;
6465

65-
private final boolean autoTimeRequestsDefaultHistogram;
66+
private final boolean autoTimeRequestsHistogram;
6667

6768
/**
6869
* Create a new {@link WebMvcMetricsFilter} instance.
@@ -72,7 +73,7 @@ public class WebMvcMetricsFilter extends OncePerRequestFilter {
7273
* @param autoTimeRequests if requests should be automatically timed
7374
* @since 2.0.7
7475
* @deprecated since 2.1.4 in favor of
75-
* {@link #WebMvcMetricsFilter(MeterRegistry, WebMvcTagsProvider, String, boolean, double[], boolean)}
76+
* {@link #WebMvcMetricsFilter(MeterRegistry, WebMvcTagsProvider, String, boolean, List, boolean)}
7677
*/
7778
@Deprecated
7879
public WebMvcMetricsFilter(MeterRegistry registry, WebMvcTagsProvider tagsProvider,
@@ -86,22 +87,25 @@ public WebMvcMetricsFilter(MeterRegistry registry, WebMvcTagsProvider tagsProvid
8687
* @param tagsProvider the tags provider
8788
* @param metricName the metric name
8889
* @param autoTimeRequests if requests should be automatically timed
89-
* @param autoTimeRequestsDefaultPercentiles default percentiles if requests are auto
90-
* timed
91-
* @param autoTimeRequestsDefaultHistogram default histogram flag if requests are auto
92-
* timed
93-
* @since 2.1.4
90+
* @param autoTimeRequestsPercentiles default percentiles if requests are auto timed
91+
* @param autoTimeRequestsHistogram default histogram flag if requests are auto timed
92+
* @since 2.2.0
9493
*/
9594
public WebMvcMetricsFilter(MeterRegistry registry, WebMvcTagsProvider tagsProvider,
9695
String metricName, boolean autoTimeRequests,
97-
double[] autoTimeRequestsDefaultPercentiles,
98-
boolean autoTimeRequestsDefaultHistogram) {
96+
List<Double> autoTimeRequestsPercentiles, boolean autoTimeRequestsHistogram) {
97+
98+
double[] percentiles = (autoTimeRequestsPercentiles != null)
99+
? autoTimeRequestsPercentiles.stream().mapToDouble(Double::doubleValue)
100+
.toArray()
101+
: null;
102+
99103
this.registry = registry;
100104
this.tagsProvider = tagsProvider;
101105
this.metricName = metricName;
102106
this.autoTimeRequests = autoTimeRequests;
103-
this.autoTimeRequestsDefaultPercentiles = autoTimeRequestsDefaultPercentiles;
104-
this.autoTimeRequestsDefaultHistogram = autoTimeRequestsDefaultHistogram;
107+
this.autoTimeRequestsPercentiles = percentiles;
108+
this.autoTimeRequestsHistogram = autoTimeRequestsHistogram;
105109
}
106110

107111
@Override
@@ -178,12 +182,9 @@ private void record(TimingContext timingContext, HttpServletResponse response,
178182
handlerObject, exception);
179183
if (annotations.isEmpty()) {
180184
if (this.autoTimeRequests) {
181-
stop(timerSample, tags,
182-
Timer.builder(this.metricName)
183-
.publishPercentiles(
184-
this.autoTimeRequestsDefaultPercentiles)
185-
.publishPercentileHistogram(
186-
this.autoTimeRequestsDefaultHistogram));
185+
stop(timerSample, tags, Timer.builder(this.metricName)
186+
.publishPercentiles(this.autoTimeRequestsPercentiles)
187+
.publishPercentileHistogram(this.autoTimeRequestsHistogram));
187188
}
188189
}
189190
else {

spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/web/servlet/WebMvcMetricsFilterAutoTimedTests.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

1717
package org.springframework.boot.actuate.metrics.web.servlet;
1818

19+
import java.util.Arrays;
20+
1921
import io.micrometer.core.instrument.Clock;
2022
import io.micrometer.core.instrument.MeterRegistry;
2123
import io.micrometer.core.instrument.MockClock;
@@ -103,7 +105,7 @@ MeterRegistry meterRegistry(Clock clock) {
103105
public WebMvcMetricsFilter webMetricsFilter(WebApplicationContext context,
104106
MeterRegistry registry) {
105107
return new WebMvcMetricsFilter(registry, new DefaultWebMvcTagsProvider(),
106-
"http.server.requests", true, new double[] { 0.5, 0.95 }, true);
108+
"http.server.requests", true, Arrays.asList(0.5, 0.95), true);
107109
}
108110

109111
}

0 commit comments

Comments
 (0)