diff --git a/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/web/client/MetricsRestTemplateCustomizerTests.java b/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/web/client/MetricsRestTemplateCustomizerTests.java index 2ce4ceaa20d..8af0ceb93de 100644 --- a/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/web/client/MetricsRestTemplateCustomizerTests.java +++ b/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/web/client/MetricsRestTemplateCustomizerTests.java @@ -24,6 +24,7 @@ import io.micrometer.core.instrument.Statistic; import io.micrometer.core.instrument.Tag; import io.micrometer.core.instrument.simple.SimpleConfig; import io.micrometer.core.instrument.simple.SimpleMeterRegistry; +import org.junit.Before; import org.junit.Test; import org.springframework.http.HttpMethod; @@ -39,35 +40,54 @@ import static org.assertj.core.api.Assertions.assertThat; * Tests for {@link MetricsRestTemplateCustomizer}. * * @author Jon Schneider + * @author Brian Clozel */ public class MetricsRestTemplateCustomizerTests { + private MeterRegistry registry; + + private RestTemplate restTemplate; + + @Before + public void setup() { + this.registry = new SimpleMeterRegistry(SimpleConfig.DEFAULT, new MockClock()); + this.restTemplate = new RestTemplate(); + } + @Test public void interceptRestTemplate() { - MeterRegistry registry = new SimpleMeterRegistry(SimpleConfig.DEFAULT, - new MockClock()); - RestTemplate restTemplate = new RestTemplate(); MetricsRestTemplateCustomizer customizer = new MetricsRestTemplateCustomizer( - registry, new DefaultRestTemplateExchangeTagsProvider(), + this.registry, new DefaultRestTemplateExchangeTagsProvider(), "http.client.requests", true); - customizer.customize(restTemplate); + customizer.customize(this.restTemplate); MockRestServiceServer mockServer = MockRestServiceServer - .createServer(restTemplate); + .createServer(this.restTemplate); mockServer.expect(MockRestRequestMatchers.requestTo("/test/123")) .andExpect(MockRestRequestMatchers.method(HttpMethod.GET)) .andRespond(MockRestResponseCreators.withSuccess("OK", MediaType.APPLICATION_JSON)); - String result = restTemplate.getForObject("/test/{id}", String.class, 123); - MockClock.clock(registry).add(SimpleConfig.DEFAULT_STEP); - assertThat(registry.find("http.client.requests") + String result = this.restTemplate.getForObject("/test/{id}", String.class, 123); + MockClock.clock(this.registry).add(SimpleConfig.DEFAULT_STEP); + assertThat(this.registry.find("http.client.requests") .meters()).anySatisfy((m) -> assertThat( - StreamSupport.stream(m.getId().getTags().spliterator(), false) - .map(Tag::getKey)).doesNotContain("bucket")); - assertThat(registry.find("http.client.requests") + StreamSupport.stream(m.getId().getTags().spliterator(), false) + .map(Tag::getKey)).doesNotContain("bucket")); + assertThat(this.registry.find("http.client.requests") .tags("method", "GET", "uri", "/test/{id}", "status", "200") .value(Statistic.Count, 1.0).timer()).isPresent(); assertThat(result).isEqualTo("OK"); mockServer.verify(); } + @Test + public void avoidDuplicateRegistration() { + MetricsRestTemplateCustomizer customizer = new MetricsRestTemplateCustomizer( + this.registry, new DefaultRestTemplateExchangeTagsProvider(), + "http.client.requests", true); + customizer.customize(this.restTemplate); + assertThat(this.restTemplate.getInterceptors()).hasSize(1); + customizer.customize(this.restTemplate); + assertThat(this.restTemplate.getInterceptors()).hasSize(1); + } + }