Spring Boot ActuatorのHTTP Client MetricsのURI tagが上限に達した

Spring Boot ActuatorとMicrometerを使っているときに、こんなwarnログが出たときのメモ。

WARN o.s.b.a.a.m.OnlyOnceLoggingDenyMeterFilter -
Reached the maximum number of URI tags for 'http.client.requests'. Are you using 'uriVariables' on RestTemplate calls?

これは、RestTemplateのmetrics(http.client.requests)のURIタグがmanagement.web.client.max-uri-tags(defaultは100)に達したため。
warnログで指摘されている通り、RestTemplateのuriVariablesを使っていなかったので、クエリパラメータごとにURIタグが作られていた。

修正前

Spring Boot: 2.1.0

String uri = UriComponentsBuilder.fromHttpUrl("http://md5.jsontest.com")
                                 .queryParam("text", text)
                                 .toUriString();
restTemplate.getForObject(uri, Map.class);

Spring Boot ActuatorのPrometheusのエンドポイントを確認すると、URLクエリパラメータごとにURIタグが作られていた。

http_client_requests_seconds_count{clientName="md5.jsontest.com",method="GET",status="200",uri="/http://md5.jsontest.com?text=aaa",} 1.0
http_client_requests_seconds_count{clientName="md5.jsontest.com",method="GET",status="200",uri="/http://md5.jsontest.com?text=bbb",} 1.0
http_client_requests_seconds_count{clientName="md5.jsontest.com",method="GET",status="200",uri="/http://md5.jsontest.com?text=ccc",} 1.0

修正後

RestTemplateを呼び出すときに、uriVariablesを使うように変更。

String uri = UriComponentsBuilder.fromHttpUrl("http://md5.jsontest.com")
                                 .queryParam("text", "{text}")
                                 .build(false)
                                 .toUriString();
restTemplate.getForObject(uri, Map.class, text);

URIタグはtemplate形式になったので、一つになった。

http_client_requests_seconds_count{clientName="md5.jsontest.com",method="GET",status="200",uri="/http://md5.jsontest.com?text={text}",} 3.0

参考