Skip to content

Commit eb028fa

Browse files
committed
Merge pull request #15988 from ttddyy
* pr/15988: Polish "Allow configuration of auto-timed metrics" Allow configuration of auto-timed metrics
2 parents 3d814a5 + 8045bf1 commit eb028fa

File tree

27 files changed

+519
-94
lines changed

27 files changed

+519
-94
lines changed

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

Lines changed: 96 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,18 @@
1919
import java.util.LinkedHashMap;
2020
import java.util.Map;
2121

22+
import org.springframework.boot.actuate.metrics.Autotime;
2223
import org.springframework.boot.context.properties.ConfigurationProperties;
24+
import org.springframework.boot.context.properties.DeprecatedConfigurationProperty;
25+
import org.springframework.boot.context.properties.NestedConfigurationProperty;
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,7 @@ public Server getServer() {
9498

9599
public static class Client {
96100

97-
/**
98-
* Name of the metric for sent requests.
99-
*/
100-
private String requestsMetricName = "http.client.requests";
101+
private final ClientRequest request = new ClientRequest();
101102

102103
/**
103104
* Maximum number of unique URI tag values allowed. After the max number of
@@ -106,12 +107,29 @@ public static class Client {
106107
*/
107108
private int maxUriTags = 100;
108109

110+
public ClientRequest getRequest() {
111+
return this.request;
112+
}
113+
114+
/**
115+
* Return the name of the metric for client requests.
116+
* @return request metric name
117+
* @deprecated since 2.2.0 in favor of {@link ClientRequest#getMetricName()}
118+
*/
119+
@DeprecatedConfigurationProperty(
120+
replacement = "management.metrics.web.client.request.metric-name")
109121
public String getRequestsMetricName() {
110-
return this.requestsMetricName;
122+
return this.request.getMetricName();
111123
}
112124

125+
/**
126+
* Set the name of the metric for client requests.
127+
* @param requestsMetricName request metric name
128+
* @deprecated since 2.2.0 in favor of
129+
* {@link ClientRequest#setMetricName(String)}
130+
*/
113131
public void setRequestsMetricName(String requestsMetricName) {
114-
this.requestsMetricName = requestsMetricName;
132+
this.request.setMetricName(requestsMetricName);
115133
}
116134

117135
public int getMaxUriTags() {
@@ -122,22 +140,38 @@ public void setMaxUriTags(int maxUriTags) {
122140
this.maxUriTags = maxUriTags;
123141
}
124142

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+
* Auto-timed request settings.
152+
*/
153+
@NestedConfigurationProperty
154+
private final Autotime autoTime = new Autotime();
155+
156+
public Autotime getAutotime() {
157+
return this.autoTime;
158+
}
159+
160+
public String getMetricName() {
161+
return this.metricName;
162+
}
163+
164+
public void setMetricName(String metricName) {
165+
this.metricName = metricName;
166+
}
167+
168+
}
169+
125170
}
126171

127172
public static class Server {
128173

129-
/**
130-
* Whether requests handled by Spring MVC, WebFlux or Jersey should be
131-
* automatically timed. If the number of time series emitted grows too large
132-
* on account of request mapping timings, disable this and use 'Timed' on a
133-
* per request mapping basis as needed.
134-
*/
135-
private boolean autoTimeRequests = true;
136-
137-
/**
138-
* Name of the metric for received requests.
139-
*/
140-
private String requestsMetricName = "http.server.requests";
174+
private final ServerRequest request = new ServerRequest();
141175

142176
/**
143177
* Maximum number of unique URI tag values allowed. After the max number of
@@ -146,20 +180,29 @@ public static class Server {
146180
*/
147181
private int maxUriTags = 100;
148182

149-
public boolean isAutoTimeRequests() {
150-
return this.autoTimeRequests;
151-
}
152-
153-
public void setAutoTimeRequests(boolean autoTimeRequests) {
154-
this.autoTimeRequests = autoTimeRequests;
183+
public ServerRequest getRequest() {
184+
return this.request;
155185
}
156186

187+
/**
188+
* Return name of the metric for server requests.
189+
* @return request metric name
190+
* @deprecated since 2.2.0 in favor of {@link ServerRequest#getMetricName()}
191+
*/
192+
@DeprecatedConfigurationProperty(
193+
replacement = "management.metrics.web.server.request.metric-name")
157194
public String getRequestsMetricName() {
158-
return this.requestsMetricName;
195+
return this.request.getMetricName();
159196
}
160197

198+
/**
199+
* Set the name of the metric for server requests.
200+
* @param requestsMetricName request metric name
201+
* @deprecated since 2.2.0 in favor of
202+
* {@link ServerRequest#setMetricName(String)}
203+
*/
161204
public void setRequestsMetricName(String requestsMetricName) {
162-
this.requestsMetricName = requestsMetricName;
205+
this.request.setMetricName(requestsMetricName);
163206
}
164207

165208
public int getMaxUriTags() {
@@ -170,6 +213,33 @@ public void setMaxUriTags(int maxUriTags) {
170213
this.maxUriTags = maxUriTags;
171214
}
172215

216+
public static class ServerRequest {
217+
218+
/**
219+
* Name of the metric for received requests.
220+
*/
221+
private String metricName = "http.server.requests";
222+
223+
/**
224+
* Auto-timed request settings.
225+
*/
226+
@NestedConfigurationProperty
227+
private final Autotime autotime = new Autotime();
228+
229+
public Autotime getAutotime() {
230+
return this.autotime;
231+
}
232+
233+
public String getMetricName() {
234+
return this.metricName;
235+
}
236+
237+
public void setMetricName(String metricName) {
238+
this.metricName = metricName;
239+
}
240+
241+
}
242+
173243
}
174244

175245
}

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: 4 additions & 2 deletions
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.client.DefaultRestTemplateExchangeTagsProvider;
2324
import org.springframework.boot.actuate.metrics.web.client.MetricsRestTemplateCustomizer;
2425
import org.springframework.boot.actuate.metrics.web.client.RestTemplateExchangeTagsProvider;
@@ -53,9 +54,10 @@ public MetricsRestTemplateCustomizer metricsRestTemplateCustomizer(
5354
MeterRegistry meterRegistry,
5455
RestTemplateExchangeTagsProvider restTemplateExchangeTagsProvider,
5556
MetricsProperties properties) {
57+
ClientRequest request = properties.getWeb().getClient().getRequest();
5658
return new MetricsRestTemplateCustomizer(meterRegistry,
57-
restTemplateExchangeTagsProvider,
58-
properties.getWeb().getClient().getRequestsMetricName());
59+
restTemplateExchangeTagsProvider, request.getMetricName(),
60+
request.getAutotime());
5961
}
6062

6163
}

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().getRequestsMetricName());
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: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +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.Server.ServerRequest;
2425
import org.springframework.boot.actuate.autoconfigure.metrics.OnlyOnceLoggingDenyMeterFilter;
2526
import org.springframework.boot.actuate.autoconfigure.metrics.export.simple.SimpleMetricsExportAutoConfiguration;
2627
import org.springframework.boot.actuate.metrics.web.reactive.server.DefaultWebFluxTagsProvider;
@@ -65,15 +66,16 @@ public DefaultWebFluxTagsProvider webfluxTagConfigurer() {
6566
@Bean
6667
public MetricsWebFilter webfluxMetrics(MeterRegistry registry,
6768
WebFluxTagsProvider tagConfigurer) {
68-
return new MetricsWebFilter(registry, tagConfigurer,
69-
this.properties.getWeb().getServer().getRequestsMetricName(),
70-
this.properties.getWeb().getServer().isAutoTimeRequests());
69+
ServerRequest request = this.properties.getWeb().getServer().getRequest();
70+
return new MetricsWebFilter(registry, tagConfigurer, request.getMetricName(),
71+
request.getAutotime());
7172
}
7273

7374
@Bean
7475
@Order(0)
7576
public MeterFilter metricsHttpServerUriTagFilter() {
76-
String metricName = this.properties.getWeb().getServer().getRequestsMetricName();
77+
String metricName = this.properties.getWeb().getServer().getRequest()
78+
.getMetricName();
7779
MeterFilter filter = new OnlyOnceLoggingDenyMeterFilter(() -> String
7880
.format("Reached the maximum number of URI tags for '%s'.", metricName));
7981
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: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +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.Server;
26+
import org.springframework.boot.actuate.autoconfigure.metrics.MetricsProperties.Web.Server.ServerRequest;
2727
import org.springframework.boot.actuate.autoconfigure.metrics.OnlyOnceLoggingDenyMeterFilter;
2828
import org.springframework.boot.actuate.autoconfigure.metrics.export.simple.SimpleMetricsExportAutoConfiguration;
2929
import org.springframework.boot.actuate.metrics.web.servlet.DefaultWebMvcTagsProvider;
@@ -78,10 +78,9 @@ public DefaultWebMvcTagsProvider webMvcTagsProvider() {
7878
@Bean
7979
public FilterRegistrationBean<WebMvcMetricsFilter> webMvcMetricsFilter(
8080
MeterRegistry registry, WebMvcTagsProvider tagsProvider) {
81-
Server serverProperties = this.properties.getWeb().getServer();
81+
ServerRequest request = this.properties.getWeb().getServer().getRequest();
8282
WebMvcMetricsFilter filter = new WebMvcMetricsFilter(registry, tagsProvider,
83-
serverProperties.getRequestsMetricName(),
84-
serverProperties.isAutoTimeRequests());
83+
request.getMetricName(), request.getAutotime());
8584
FilterRegistrationBean<WebMvcMetricsFilter> registration = new FilterRegistrationBean<>(
8685
filter);
8786
registration.setOrder(Ordered.HIGHEST_PRECEDENCE + 1);
@@ -92,7 +91,8 @@ public FilterRegistrationBean<WebMvcMetricsFilter> webMvcMetricsFilter(
9291
@Bean
9392
@Order(0)
9493
public MeterFilter metricsHttpServerUriTagFilter() {
95-
String metricName = this.properties.getWeb().getServer().getRequestsMetricName();
94+
String metricName = this.properties.getWeb().getServer().getRequest()
95+
.getMetricName();
9696
MeterFilter filter = new OnlyOnceLoggingDenyMeterFilter(() -> String
9797
.format("Reached the maximum number of URI tags for '%s'.", metricName));
9898
return MeterFilter.maximumAllowableTags(metricName, "uri",

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())

0 commit comments

Comments
 (0)