Skip to content

Commit 02715a3

Browse files
committed
Add properties for default config 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 configuration values of `@Timed`. Currently, there is no way to specify the default configuration to those auto-timed controller metrics. This commit adds default configurations to auto-time requests on both client and server sides. These properties are introduced: - "management.metrics.web.[server|client].request.auto-time.enabled" - "management.metrics.web.[server|client].request.auto-time.default-percentiles" - "management.metrics.web.[server|client].request.auto-time.default-histogram" Also, "requests-metric-name" property is updated: old: "management.metrics.web.[server|client].requests-metric-name" new: "management.metrics.web.[server|client].request.metric-name" This property is removed: - `management.metrics.web.server.auto-time-requests`
1 parent 9b7bc69 commit 02715a3

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,16 +16,20 @@
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} for configuring Micrometer-based metrics.
2629
*
2730
* @author Jon Schneider
2831
* @author Alexander Abramov
32+
* @author Tadaya Tsuyukubo
2933
* @since 2.0.0
3034
*/
3135
@ConfigurationProperties("management.metrics")
@@ -93,10 +97,79 @@ public Server getServer() {
9397

9498
public static class Client {
9599

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

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

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

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

116206
public int getMaxUriTags() {
@@ -121,52 +211,80 @@ public void setMaxUriTags(int maxUriTags) {
121211
this.maxUriTags = maxUriTags;
122212
}
123213

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

126-
public static class Server {
242+
public static class AutoTime {
127243

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

136252
/**
137-
* Name of the metric for received requests.
253+
* Default percentiles when @Timed annotation is not presented on the
254+
* corresponding request handler. Any @Timed annotation presented will have
255+
* precedence.
138256
*/
139-
private String requestsMetricName = "http.server.requests";
257+
private List<Double> defaultPercentiles = new ArrayList<>();
140258

141259
/**
142-
* Maximum number of unique URI tag values allowed. After the max number of
143-
* tag values is reached, metrics with additional tag values are denied by
144-
* filter.
260+
* Default histogram when @Timed annotation is not presented on the
261+
* corresponding request handler. Any @Timed annotation presented will have
262+
* precedence.
145263
*/
146-
private int maxUriTags = 100;
264+
private boolean defaultHistogram;
147265

148-
public boolean isAutoTimeRequests() {
149-
return this.autoTimeRequests;
266+
public boolean isEnabled() {
267+
return this.enabled;
150268
}
151269

152-
public void setAutoTimeRequests(boolean autoTimeRequests) {
153-
this.autoTimeRequests = autoTimeRequests;
270+
public void setEnabled(boolean enabled) {
271+
this.enabled = enabled;
154272
}
155273

156-
public String getRequestsMetricName() {
157-
return this.requestsMetricName;
274+
public List<Double> getDefaultPercentiles() {
275+
return this.defaultPercentiles;
158276
}
159277

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

164-
public int getMaxUriTags() {
165-
return this.maxUriTags;
282+
public boolean isDefaultHistogram() {
283+
return this.defaultHistogram;
166284
}
167285

168-
public void setMaxUriTags(int maxUriTags) {
169-
this.maxUriTags = maxUriTags;
286+
public void setDefaultHistogram(boolean defaultHistogram) {
287+
this.defaultHistogram = defaultHistogram;
170288
}
171289

172290
}

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)