Skip to content

Commit 4df6f5d

Browse files
ttddyysnicoll
authored andcommitted
Allow configuration of auto-timed metrics
When `management.metrics.web.server.auto-time-requests` is enabled (default=true), Spring Boot collects metrics on controller methods even when they are not annotated with `@Timed`. When this happens, created metrics are based on the default `@Timed` configuration and there is no way to customize the configuration of those auto-timed controller metrics. This commit adds default configurations to auto-timed requests on both client and server sides. See gh-15988
1 parent 3d814a5 commit 4df6f5d

File tree

20 files changed

+416
-72
lines changed

20 files changed

+416
-72
lines changed

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

Lines changed: 142 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,21 @@
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;
25+
import org.springframework.boot.context.properties.DeprecatedConfigurationProperty;
2326

2427
/**
2528
* {@link ConfigurationProperties @ConfigurationProperties} for configuring
2629
* Micrometer-based metrics.
2730
*
2831
* @author Jon Schneider
2932
* @author Alexander Abramov
33+
* @author Tadaya Tsuyukubo
3034
* @since 2.0.0
3135
*/
3236
@ConfigurationProperties("management.metrics")
@@ -94,10 +98,79 @@ public Server getServer() {
9498

9599
public static class Client {
96100

101+
private final ClientRequest request = new ClientRequest();
102+
103+
/**
104+
* Maximum number of unique URI tag values allowed. After the max number of
105+
* tag values is reached, metrics with additional tag values are denied by
106+
* filter.
107+
*/
108+
private int maxUriTags = 100;
109+
97110
/**
98-
* Name of the metric for sent requests.
111+
* Get name of the metric for received requests.
112+
* @return request metric name
113+
* @deprecated since 2.2.0 in favor of {@link ClientRequest#getMetricName()}
99114
*/
100-
private String requestsMetricName = "http.client.requests";
115+
@DeprecatedConfigurationProperty(
116+
replacement = "management.metrics.web.client.request.metric-name")
117+
public String getRequestsMetricName() {
118+
return this.request.getMetricName();
119+
}
120+
121+
/**
122+
* Set name of the metric for received requests.
123+
* @param requestsMetricName request metric name
124+
* @deprecated since 2.2.0 in favor of
125+
* {@link ClientRequest#setMetricName(String)}
126+
*/
127+
public void setRequestsMetricName(String requestsMetricName) {
128+
this.request.setMetricName(requestsMetricName);
129+
}
130+
131+
public ClientRequest getRequest() {
132+
return this.request;
133+
}
134+
135+
public int getMaxUriTags() {
136+
return this.maxUriTags;
137+
}
138+
139+
public void setMaxUriTags(int maxUriTags) {
140+
this.maxUriTags = maxUriTags;
141+
}
142+
143+
public static class ClientRequest {
144+
145+
/**
146+
* Name of the metric for sent requests.
147+
*/
148+
private String metricName = "http.client.requests";
149+
150+
/**
151+
* Automatically time requests.
152+
*/
153+
private final AutoTime autoTime = new AutoTime();
154+
155+
public AutoTime getAutoTime() {
156+
return this.autoTime;
157+
}
158+
159+
public String getMetricName() {
160+
return this.metricName;
161+
}
162+
163+
public void setMetricName(String metricName) {
164+
this.metricName = metricName;
165+
}
166+
167+
}
168+
169+
}
170+
171+
public static class Server {
172+
173+
private final ServerRequest request = new ServerRequest();
101174

102175
/**
103176
* Maximum number of unique URI tag values allowed. After the max number of
@@ -106,12 +179,29 @@ public static class Client {
106179
*/
107180
private int maxUriTags = 100;
108181

182+
/**
183+
* Get name of the metric for received requests.
184+
* @return request metric name
185+
* @deprecated since 2.2.0 in favor of {@link ServerRequest#getMetricName()}
186+
*/
187+
@DeprecatedConfigurationProperty(
188+
replacement = "management.metrics.web.server.request.metric-name")
109189
public String getRequestsMetricName() {
110-
return this.requestsMetricName;
190+
return this.request.getMetricName();
111191
}
112192

193+
/**
194+
* Set name of the metric for received requests.
195+
* @param requestsMetricName request metric name
196+
* @deprecated since 2.2.0 in favor of
197+
* {@link ServerRequest#setMetricName(String)}
198+
*/
113199
public void setRequestsMetricName(String requestsMetricName) {
114-
this.requestsMetricName = requestsMetricName;
200+
this.request.setMetricName(requestsMetricName);
201+
}
202+
203+
public ServerRequest getRequest() {
204+
return this.request;
115205
}
116206

117207
public int getMaxUriTags() {
@@ -122,52 +212,80 @@ public void setMaxUriTags(int maxUriTags) {
122212
this.maxUriTags = maxUriTags;
123213
}
124214

215+
public static class ServerRequest {
216+
217+
/**
218+
* Name of the metric for received requests.
219+
*/
220+
private String metricName = "http.server.requests";
221+
222+
/**
223+
* Automatically time requests.
224+
*/
225+
private final AutoTime autoTime = new AutoTime();
226+
227+
public AutoTime getAutoTime() {
228+
return this.autoTime;
229+
}
230+
231+
public String getMetricName() {
232+
return this.metricName;
233+
}
234+
235+
public void setMetricName(String metricName) {
236+
this.metricName = metricName;
237+
}
238+
239+
}
240+
125241
}
126242

127-
public static class Server {
243+
public static class AutoTime {
128244

129245
/**
130246
* Whether requests handled by Spring MVC, WebFlux or Jersey should be
131247
* automatically timed. If the number of time series emitted grows too large
132248
* on account of request mapping timings, disable this and use 'Timed' on a
133249
* per request mapping basis as needed.
134250
*/
135-
private boolean autoTimeRequests = true;
251+
private boolean enabled = true;
136252

137253
/**
138-
* Name of the metric for received requests.
254+
* Default percentiles when @Timed annotation is not presented on the
255+
* corresponding request handler. Any @Timed annotation presented will have
256+
* precedence.
139257
*/
140-
private String requestsMetricName = "http.server.requests";
258+
private List<Double> defaultPercentiles = new ArrayList<>();
141259

142260
/**
143-
* Maximum number of unique URI tag values allowed. After the max number of
144-
* tag values is reached, metrics with additional tag values are denied by
145-
* filter.
261+
* Default histogram when @Timed annotation is not presented on the
262+
* corresponding request handler. Any @Timed annotation presented will have
263+
* precedence.
146264
*/
147-
private int maxUriTags = 100;
265+
private boolean defaultHistogram;
148266

149-
public boolean isAutoTimeRequests() {
150-
return this.autoTimeRequests;
267+
public boolean isEnabled() {
268+
return this.enabled;
151269
}
152270

153-
public void setAutoTimeRequests(boolean autoTimeRequests) {
154-
this.autoTimeRequests = autoTimeRequests;
271+
public void setEnabled(boolean enabled) {
272+
this.enabled = enabled;
155273
}
156274

157-
public String getRequestsMetricName() {
158-
return this.requestsMetricName;
275+
public List<Double> getDefaultPercentiles() {
276+
return this.defaultPercentiles;
159277
}
160278

161-
public void setRequestsMetricName(String requestsMetricName) {
162-
this.requestsMetricName = requestsMetricName;
279+
public void setDefaultPercentiles(List<Double> defaultPercentiles) {
280+
this.defaultPercentiles = defaultPercentiles;
163281
}
164282

165-
public int getMaxUriTags() {
166-
return this.maxUriTags;
283+
public boolean isDefaultHistogram() {
284+
return this.defaultHistogram;
167285
}
168286

169-
public void setMaxUriTags(int maxUriTags) {
170-
this.maxUriTags = maxUriTags;
287+
public void setDefaultHistogram(boolean defaultHistogram) {
288+
this.defaultHistogram = defaultHistogram;
171289
}
172290

173291
}

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -79,14 +79,16 @@ public ResourceConfigCustomizer jerseyServerMetricsResourceConfigCustomizer(
7979
MeterRegistry meterRegistry, JerseyTagsProvider tagsProvider) {
8080
Server server = this.properties.getWeb().getServer();
8181
return (config) -> config.register(new MetricsApplicationEventListener(
82-
meterRegistry, tagsProvider, server.getRequestsMetricName(),
83-
server.isAutoTimeRequests(), new AnnotationUtilsAnnotationFinder()));
82+
meterRegistry, tagsProvider, server.getRequest().getMetricName(),
83+
server.getRequest().getAutoTime().isEnabled(),
84+
new AnnotationUtilsAnnotationFinder()));
8485
}
8586

8687
@Bean
8788
@Order(0)
8889
public MeterFilter jerseyMetricsUriTagFilter() {
89-
String metricName = this.properties.getWeb().getServer().getRequestsMetricName();
90+
String metricName = this.properties.getWeb().getServer().getRequest()
91+
.getMetricName();
9092
MeterFilter filter = new OnlyOnceLoggingDenyMeterFilter(() -> String
9193
.format("Reached the maximum number of URI tags for '%s'.", metricName));
9294
return MeterFilter.maximumAllowableTags(metricName, "uri",

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ public class HttpClientMetricsAutoConfiguration {
5353
@Bean
5454
@Order(0)
5555
public MeterFilter metricsHttpClientUriTagFilter(MetricsProperties properties) {
56-
String metricName = properties.getWeb().getClient().getRequestsMetricName();
56+
String metricName = properties.getWeb().getClient().getRequest().getMetricName();
5757
MeterFilter denyFilter = new OnlyOnceLoggingDenyMeterFilter(() -> String
5858
.format("Reached the maximum number of URI tags for '%s'. Are you using "
5959
+ "'uriVariables'?", metricName));

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
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;
2224
import org.springframework.boot.actuate.metrics.web.client.DefaultRestTemplateExchangeTagsProvider;
2325
import org.springframework.boot.actuate.metrics.web.client.MetricsRestTemplateCustomizer;
2426
import org.springframework.boot.actuate.metrics.web.client.RestTemplateExchangeTagsProvider;
@@ -53,9 +55,13 @@ public MetricsRestTemplateCustomizer metricsRestTemplateCustomizer(
5355
MeterRegistry meterRegistry,
5456
RestTemplateExchangeTagsProvider restTemplateExchangeTagsProvider,
5557
MetricsProperties properties) {
58+
59+
Client client = properties.getWeb().getClient();
60+
AutoTime autoTime = client.getRequest().getAutoTime();
5661
return new MetricsRestTemplateCustomizer(meterRegistry,
57-
restTemplateExchangeTagsProvider,
58-
properties.getWeb().getClient().getRequestsMetricName());
62+
restTemplateExchangeTagsProvider, client.getRequest().getMetricName(),
63+
autoTime.isEnabled(), autoTime.getDefaultPercentiles(),
64+
autoTime.isDefaultHistogram());
5965
}
6066

6167
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ public MetricsWebClientCustomizer metricsWebClientCustomizer(
4949
MeterRegistry meterRegistry, WebClientExchangeTagsProvider tagsProvider,
5050
MetricsProperties properties) {
5151
return new MetricsWebClientCustomizer(meterRegistry, tagsProvider,
52-
properties.getWeb().getClient().getRequestsMetricName());
52+
properties.getWeb().getClient().getRequest().getMetricName());
5353
}
5454

5555
}

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

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
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;
2426
import org.springframework.boot.actuate.autoconfigure.metrics.OnlyOnceLoggingDenyMeterFilter;
2527
import org.springframework.boot.actuate.autoconfigure.metrics.export.simple.SimpleMetricsExportAutoConfiguration;
2628
import org.springframework.boot.actuate.metrics.web.reactive.server.DefaultWebFluxTagsProvider;
@@ -65,15 +67,18 @@ public DefaultWebFluxTagsProvider webfluxTagConfigurer() {
6567
@Bean
6668
public MetricsWebFilter webfluxMetrics(MeterRegistry registry,
6769
WebFluxTagsProvider tagConfigurer) {
70+
Server serverProperties = this.properties.getWeb().getServer();
71+
AutoTime autotime = serverProperties.getRequest().getAutoTime();
6872
return new MetricsWebFilter(registry, tagConfigurer,
69-
this.properties.getWeb().getServer().getRequestsMetricName(),
70-
this.properties.getWeb().getServer().isAutoTimeRequests());
73+
serverProperties.getRequest().getMetricName(), autotime.isEnabled(),
74+
autotime.getDefaultPercentiles(), autotime.isDefaultHistogram());
7175
}
7276

7377
@Bean
7478
@Order(0)
7579
public MeterFilter metricsHttpServerUriTagFilter() {
76-
String metricName = this.properties.getWeb().getServer().getRequestsMetricName();
80+
String metricName = this.properties.getWeb().getServer().getRequest()
81+
.getMetricName();
7782
MeterFilter filter = new OnlyOnceLoggingDenyMeterFilter(() -> String
7883
.format("Reached the maximum number of URI tags for '%s'.", metricName));
7984
return MeterFilter.maximumAllowableTags(metricName, "uri",

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

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +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;
2627
import org.springframework.boot.actuate.autoconfigure.metrics.MetricsProperties.Web.Server;
2728
import org.springframework.boot.actuate.autoconfigure.metrics.OnlyOnceLoggingDenyMeterFilter;
2829
import org.springframework.boot.actuate.autoconfigure.metrics.export.simple.SimpleMetricsExportAutoConfiguration;
@@ -79,9 +80,10 @@ public DefaultWebMvcTagsProvider webMvcTagsProvider() {
7980
public FilterRegistrationBean<WebMvcMetricsFilter> webMvcMetricsFilter(
8081
MeterRegistry registry, WebMvcTagsProvider tagsProvider) {
8182
Server serverProperties = this.properties.getWeb().getServer();
83+
AutoTime autotime = serverProperties.getRequest().getAutoTime();
8284
WebMvcMetricsFilter filter = new WebMvcMetricsFilter(registry, tagsProvider,
83-
serverProperties.getRequestsMetricName(),
84-
serverProperties.isAutoTimeRequests());
85+
serverProperties.getRequest().getMetricName(), autotime.isEnabled(),
86+
autotime.getDefaultPercentiles(), autotime.isDefaultHistogram());
8587
FilterRegistrationBean<WebMvcMetricsFilter> registration = new FilterRegistrationBean<>(
8688
filter);
8789
registration.setOrder(Ordered.HIGHEST_PRECEDENCE + 1);
@@ -92,7 +94,8 @@ public FilterRegistrationBean<WebMvcMetricsFilter> webMvcMetricsFilter(
9294
@Bean
9395
@Order(0)
9496
public MeterFilter metricsHttpServerUriTagFilter() {
95-
String metricName = this.properties.getWeb().getServer().getRequestsMetricName();
97+
String metricName = this.properties.getWeb().getServer().getRequest()
98+
.getMetricName();
9699
MeterFilter filter = new OnlyOnceLoggingDenyMeterFilter(() -> String
97100
.format("Reached the maximum number of URI tags for '%s'.", metricName));
98101
return MeterFilter.maximumAllowableTags(metricName, "uri",

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

0 commit comments

Comments
 (0)