Skip to content

Commit 8045bf1

Browse files
committed
Polish "Allow configuration of auto-timed metrics"
Closes gh-15988
1 parent 4df6f5d commit 8045bf1

26 files changed

+305
-224
lines changed

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

Lines changed: 23 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,13 @@
1616

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

19-
import java.util.ArrayList;
2019
import java.util.LinkedHashMap;
21-
import java.util.List;
2220
import java.util.Map;
2321

22+
import org.springframework.boot.actuate.metrics.Autotime;
2423
import org.springframework.boot.context.properties.ConfigurationProperties;
2524
import org.springframework.boot.context.properties.DeprecatedConfigurationProperty;
25+
import org.springframework.boot.context.properties.NestedConfigurationProperty;
2626

2727
/**
2828
* {@link ConfigurationProperties @ConfigurationProperties} for configuring
@@ -107,8 +107,12 @@ public static class Client {
107107
*/
108108
private int maxUriTags = 100;
109109

110+
public ClientRequest getRequest() {
111+
return this.request;
112+
}
113+
110114
/**
111-
* Get name of the metric for received requests.
115+
* Return the name of the metric for client requests.
112116
* @return request metric name
113117
* @deprecated since 2.2.0 in favor of {@link ClientRequest#getMetricName()}
114118
*/
@@ -119,7 +123,7 @@ public String getRequestsMetricName() {
119123
}
120124

121125
/**
122-
* Set name of the metric for received requests.
126+
* Set the name of the metric for client requests.
123127
* @param requestsMetricName request metric name
124128
* @deprecated since 2.2.0 in favor of
125129
* {@link ClientRequest#setMetricName(String)}
@@ -128,10 +132,6 @@ public void setRequestsMetricName(String requestsMetricName) {
128132
this.request.setMetricName(requestsMetricName);
129133
}
130134

131-
public ClientRequest getRequest() {
132-
return this.request;
133-
}
134-
135135
public int getMaxUriTags() {
136136
return this.maxUriTags;
137137
}
@@ -148,11 +148,12 @@ public static class ClientRequest {
148148
private String metricName = "http.client.requests";
149149

150150
/**
151-
* Automatically time requests.
151+
* Auto-timed request settings.
152152
*/
153-
private final AutoTime autoTime = new AutoTime();
153+
@NestedConfigurationProperty
154+
private final Autotime autoTime = new Autotime();
154155

155-
public AutoTime getAutoTime() {
156+
public Autotime getAutotime() {
156157
return this.autoTime;
157158
}
158159

@@ -179,8 +180,12 @@ public static class Server {
179180
*/
180181
private int maxUriTags = 100;
181182

183+
public ServerRequest getRequest() {
184+
return this.request;
185+
}
186+
182187
/**
183-
* Get name of the metric for received requests.
188+
* Return name of the metric for server requests.
184189
* @return request metric name
185190
* @deprecated since 2.2.0 in favor of {@link ServerRequest#getMetricName()}
186191
*/
@@ -191,7 +196,7 @@ public String getRequestsMetricName() {
191196
}
192197

193198
/**
194-
* Set name of the metric for received requests.
199+
* Set the name of the metric for server requests.
195200
* @param requestsMetricName request metric name
196201
* @deprecated since 2.2.0 in favor of
197202
* {@link ServerRequest#setMetricName(String)}
@@ -200,10 +205,6 @@ public void setRequestsMetricName(String requestsMetricName) {
200205
this.request.setMetricName(requestsMetricName);
201206
}
202207

203-
public ServerRequest getRequest() {
204-
return this.request;
205-
}
206-
207208
public int getMaxUriTags() {
208209
return this.maxUriTags;
209210
}
@@ -220,12 +221,13 @@ public static class ServerRequest {
220221
private String metricName = "http.server.requests";
221222

222223
/**
223-
* Automatically time requests.
224+
* Auto-timed request settings.
224225
*/
225-
private final AutoTime autoTime = new AutoTime();
226+
@NestedConfigurationProperty
227+
private final Autotime autotime = new Autotime();
226228

227-
public AutoTime getAutoTime() {
228-
return this.autoTime;
229+
public Autotime getAutotime() {
230+
return this.autotime;
229231
}
230232

231233
public String getMetricName() {
@@ -240,56 +242,6 @@ public void setMetricName(String metricName) {
240242

241243
}
242244

243-
public static class AutoTime {
244-
245-
/**
246-
* Whether requests handled by Spring MVC, WebFlux or Jersey should be
247-
* automatically timed. If the number of time series emitted grows too large
248-
* on account of request mapping timings, disable this and use 'Timed' on a
249-
* per request mapping basis as needed.
250-
*/
251-
private boolean enabled = true;
252-
253-
/**
254-
* Default percentiles when @Timed annotation is not presented on the
255-
* corresponding request handler. Any @Timed annotation presented will have
256-
* precedence.
257-
*/
258-
private List<Double> defaultPercentiles = new ArrayList<>();
259-
260-
/**
261-
* Default histogram when @Timed annotation is not presented on the
262-
* corresponding request handler. Any @Timed annotation presented will have
263-
* precedence.
264-
*/
265-
private boolean defaultHistogram;
266-
267-
public boolean isEnabled() {
268-
return this.enabled;
269-
}
270-
271-
public void setEnabled(boolean enabled) {
272-
this.enabled = enabled;
273-
}
274-
275-
public List<Double> getDefaultPercentiles() {
276-
return this.defaultPercentiles;
277-
}
278-
279-
public void setDefaultPercentiles(List<Double> defaultPercentiles) {
280-
this.defaultPercentiles = defaultPercentiles;
281-
}
282-
283-
public boolean isDefaultHistogram() {
284-
return this.defaultHistogram;
285-
}
286-
287-
public void setDefaultHistogram(boolean defaultHistogram) {
288-
this.defaultHistogram = defaultHistogram;
289-
}
290-
291-
}
292-
293245
}
294246

295247
public static class Distribution {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ public ResourceConfigCustomizer jerseyServerMetricsResourceConfigCustomizer(
8080
Server server = this.properties.getWeb().getServer();
8181
return (config) -> config.register(new MetricsApplicationEventListener(
8282
meterRegistry, tagsProvider, server.getRequest().getMetricName(),
83-
server.getRequest().getAutoTime().isEnabled(),
83+
server.getRequest().getAutotime().isEnabled(),
8484
new AnnotationUtilsAnnotationFinder()));
8585
}
8686

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

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,7 @@
1919
import io.micrometer.core.instrument.MeterRegistry;
2020

2121
import org.springframework.boot.actuate.autoconfigure.metrics.MetricsProperties;
22-
import org.springframework.boot.actuate.autoconfigure.metrics.MetricsProperties.Web.AutoTime;
23-
import org.springframework.boot.actuate.autoconfigure.metrics.MetricsProperties.Web.Client;
22+
import org.springframework.boot.actuate.autoconfigure.metrics.MetricsProperties.Web.Client.ClientRequest;
2423
import org.springframework.boot.actuate.metrics.web.client.DefaultRestTemplateExchangeTagsProvider;
2524
import org.springframework.boot.actuate.metrics.web.client.MetricsRestTemplateCustomizer;
2625
import org.springframework.boot.actuate.metrics.web.client.RestTemplateExchangeTagsProvider;
@@ -55,13 +54,10 @@ public MetricsRestTemplateCustomizer metricsRestTemplateCustomizer(
5554
MeterRegistry meterRegistry,
5655
RestTemplateExchangeTagsProvider restTemplateExchangeTagsProvider,
5756
MetricsProperties properties) {
58-
59-
Client client = properties.getWeb().getClient();
60-
AutoTime autoTime = client.getRequest().getAutoTime();
57+
ClientRequest request = properties.getWeb().getClient().getRequest();
6158
return new MetricsRestTemplateCustomizer(meterRegistry,
62-
restTemplateExchangeTagsProvider, client.getRequest().getMetricName(),
63-
autoTime.isEnabled(), autoTime.getDefaultPercentiles(),
64-
autoTime.isDefaultHistogram());
59+
restTemplateExchangeTagsProvider, request.getMetricName(),
60+
request.getAutotime());
6561
}
6662

6763
}

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import io.micrometer.core.instrument.MeterRegistry;
2020

2121
import org.springframework.boot.actuate.autoconfigure.metrics.MetricsProperties;
22+
import org.springframework.boot.actuate.autoconfigure.metrics.MetricsProperties.Web.Client.ClientRequest;
2223
import org.springframework.boot.actuate.metrics.web.reactive.client.DefaultWebClientExchangeTagsProvider;
2324
import org.springframework.boot.actuate.metrics.web.reactive.client.MetricsWebClientCustomizer;
2425
import org.springframework.boot.actuate.metrics.web.reactive.client.WebClientExchangeTagsProvider;
@@ -48,8 +49,9 @@ public WebClientExchangeTagsProvider defaultWebClientExchangeTagsProvider() {
4849
public MetricsWebClientCustomizer metricsWebClientCustomizer(
4950
MeterRegistry meterRegistry, WebClientExchangeTagsProvider tagsProvider,
5051
MetricsProperties properties) {
52+
ClientRequest request = properties.getWeb().getClient().getRequest();
5153
return new MetricsWebClientCustomizer(meterRegistry, tagsProvider,
52-
properties.getWeb().getClient().getRequest().getMetricName());
54+
request.getMetricName(), request.getAutotime());
5355
}
5456

5557
}

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

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,7 @@
2121

2222
import org.springframework.boot.actuate.autoconfigure.metrics.MetricsAutoConfiguration;
2323
import org.springframework.boot.actuate.autoconfigure.metrics.MetricsProperties;
24-
import org.springframework.boot.actuate.autoconfigure.metrics.MetricsProperties.Web.AutoTime;
25-
import org.springframework.boot.actuate.autoconfigure.metrics.MetricsProperties.Web.Server;
24+
import org.springframework.boot.actuate.autoconfigure.metrics.MetricsProperties.Web.Server.ServerRequest;
2625
import org.springframework.boot.actuate.autoconfigure.metrics.OnlyOnceLoggingDenyMeterFilter;
2726
import org.springframework.boot.actuate.autoconfigure.metrics.export.simple.SimpleMetricsExportAutoConfiguration;
2827
import org.springframework.boot.actuate.metrics.web.reactive.server.DefaultWebFluxTagsProvider;
@@ -67,11 +66,9 @@ public DefaultWebFluxTagsProvider webfluxTagConfigurer() {
6766
@Bean
6867
public MetricsWebFilter webfluxMetrics(MeterRegistry registry,
6968
WebFluxTagsProvider tagConfigurer) {
70-
Server serverProperties = this.properties.getWeb().getServer();
71-
AutoTime autotime = serverProperties.getRequest().getAutoTime();
72-
return new MetricsWebFilter(registry, tagConfigurer,
73-
serverProperties.getRequest().getMetricName(), autotime.isEnabled(),
74-
autotime.getDefaultPercentiles(), autotime.isDefaultHistogram());
69+
ServerRequest request = this.properties.getWeb().getServer().getRequest();
70+
return new MetricsWebFilter(registry, tagConfigurer, request.getMetricName(),
71+
request.getAutotime());
7572
}
7673

7774
@Bean

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

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,7 @@
2323

2424
import org.springframework.boot.actuate.autoconfigure.metrics.MetricsAutoConfiguration;
2525
import org.springframework.boot.actuate.autoconfigure.metrics.MetricsProperties;
26-
import org.springframework.boot.actuate.autoconfigure.metrics.MetricsProperties.Web.AutoTime;
27-
import org.springframework.boot.actuate.autoconfigure.metrics.MetricsProperties.Web.Server;
26+
import org.springframework.boot.actuate.autoconfigure.metrics.MetricsProperties.Web.Server.ServerRequest;
2827
import org.springframework.boot.actuate.autoconfigure.metrics.OnlyOnceLoggingDenyMeterFilter;
2928
import org.springframework.boot.actuate.autoconfigure.metrics.export.simple.SimpleMetricsExportAutoConfiguration;
3029
import org.springframework.boot.actuate.metrics.web.servlet.DefaultWebMvcTagsProvider;
@@ -79,11 +78,9 @@ public DefaultWebMvcTagsProvider webMvcTagsProvider() {
7978
@Bean
8079
public FilterRegistrationBean<WebMvcMetricsFilter> webMvcMetricsFilter(
8180
MeterRegistry registry, WebMvcTagsProvider tagsProvider) {
82-
Server serverProperties = this.properties.getWeb().getServer();
83-
AutoTime autotime = serverProperties.getRequest().getAutoTime();
81+
ServerRequest request = this.properties.getWeb().getServer().getRequest();
8482
WebMvcMetricsFilter filter = new WebMvcMetricsFilter(registry, tagsProvider,
85-
serverProperties.getRequest().getMetricName(), autotime.isEnabled(),
86-
autotime.getDefaultPercentiles(), autotime.isDefaultHistogram());
83+
request.getMetricName(), request.getAutotime());
8784
FilterRegistrationBean<WebMvcMetricsFilter> registration = new FilterRegistrationBean<>(
8885
filter);
8986
registration.setOrder(Ordered.HIGHEST_PRECEDENCE + 1);

spring-boot-project/spring-boot-actuator-autoconfigure/src/main/resources/META-INF/additional-spring-configuration-metadata.json

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,34 @@
253253
"level": "error"
254254
}
255255
},
256+
{
257+
"name": "management.metrics.web.client.request.autotime.enabled",
258+
"description": "Whether to automatically time web client requests.",
259+
"defaultValue": true
260+
},
261+
{
262+
"name": "management.metrics.web.client.request.autotime.percentiles",
263+
"description": "Computed non-aggregable percentiles to publish."
264+
},
265+
{
266+
"name": "management.metrics.web.client.request.autotime.percentiles-histogram",
267+
"description": "Whether percentile histograms should be published.",
268+
"defaultValue": false
269+
},
270+
{
271+
"name": "management.metrics.web.server.request.autotime.enabled",
272+
"description": "Whether to automatically time web server requests.",
273+
"defaultValue": true
274+
},
275+
{
276+
"name": "management.metrics.web.server.request.autotime.percentiles",
277+
"description": "Computed non-aggregable percentiles to publish."
278+
},
279+
{
280+
"name": "management.metrics.web.server.request.autotime.percentiles-histogram",
281+
"description": "Whether percentile histograms should be published.",
282+
"defaultValue": false
283+
},
256284
{
257285
"name": "management.server.ssl.ciphers",
258286
"description": "Supported SSL ciphers."

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

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
package org.springframework.boot.actuate.autoconfigure.metrics.web.client;
1818

1919
import io.micrometer.core.instrument.MeterRegistry;
20+
import io.micrometer.core.instrument.Timer;
21+
import io.micrometer.core.instrument.distribution.HistogramSnapshot;
2022
import org.junit.Rule;
2123
import org.junit.Test;
2224

@@ -100,6 +102,24 @@ public void shouldNotDenyNorLogIfMaxUrisIsNotReached() {
100102
});
101103
}
102104

105+
@Test
106+
public void autoTimeRequestsCanBeConfigured() {
107+
this.contextRunner.withPropertyValues(
108+
"management.metrics.web.client.request.autotime.enabled=true",
109+
"management.metrics.web.client.request.autotime.percentiles=0.5,0.7",
110+
"management.metrics.web.client.request.autotime.percentiles-histogram=true")
111+
.run((context) -> {
112+
MeterRegistry registry = getInitializedMeterRegistry(context);
113+
Timer timer = registry.get("http.client.requests").timer();
114+
HistogramSnapshot snapshot = timer.takeSnapshot();
115+
assertThat(snapshot.percentileValues()).hasSize(2);
116+
assertThat(snapshot.percentileValues()[0].percentile())
117+
.isEqualTo(0.5);
118+
assertThat(snapshot.percentileValues()[1].percentile())
119+
.isEqualTo(0.7);
120+
});
121+
}
122+
103123
@Test
104124
public void backsOffWhenRestTemplateBuilderIsMissing() {
105125
new ApplicationContextRunner().with(MetricsRun.simple())

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

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
import java.time.Duration;
2020

2121
import io.micrometer.core.instrument.MeterRegistry;
22+
import io.micrometer.core.instrument.Timer;
23+
import io.micrometer.core.instrument.distribution.HistogramSnapshot;
2224
import org.junit.Rule;
2325
import org.junit.Test;
2426
import reactor.core.publisher.Mono;
@@ -101,6 +103,24 @@ public void shouldNotDenyNorLogIfMaxUrisIsNotReached() {
101103
});
102104
}
103105

106+
@Test
107+
public void autoTimeRequestsCanBeConfigured() {
108+
this.contextRunner.withPropertyValues(
109+
"management.metrics.web.client.request.autotime.enabled=true",
110+
"management.metrics.web.client.request.autotime.percentiles=0.5,0.7",
111+
"management.metrics.web.client.request.autotime.percentiles-histogram=true")
112+
.run((context) -> {
113+
MeterRegistry registry = getInitializedMeterRegistry(context);
114+
Timer timer = registry.get("http.client.requests").timer();
115+
HistogramSnapshot snapshot = timer.takeSnapshot();
116+
assertThat(snapshot.percentileValues()).hasSize(2);
117+
assertThat(snapshot.percentileValues()[0].percentile())
118+
.isEqualTo(0.5);
119+
assertThat(snapshot.percentileValues()[1].percentile())
120+
.isEqualTo(0.7);
121+
});
122+
}
123+
104124
private MeterRegistry getInitializedMeterRegistry(
105125
AssertableApplicationContext context) {
106126
WebClient webClient = mockWebClient(context.getBean(WebClient.Builder.class));

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.request.auto-time.enabled=false")
105+
"management.metrics.web.server.request.autotime.enabled=false")
106106
.run((context) -> {
107107
MeterRegistry registry = getInitializedMeterRegistry(context);
108108
assertThat(registry.find("http.server.requests").meter()).isNull();

0 commit comments

Comments
 (0)