diff --git a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/MetricsEndpoint.java b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/MetricsEndpoint.java index 84738ac5a5..5a9e2b25f3 100644 --- a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/MetricsEndpoint.java +++ b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/MetricsEndpoint.java @@ -16,6 +16,7 @@ package org.springframework.boot.actuate.metrics; +import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; @@ -115,19 +116,17 @@ public class MetricsEndpoint { private Collection findFirstMatchingMeters(MeterRegistry registry, String name, Iterable tags) { if (registry instanceof CompositeMeterRegistry) { - return ((CompositeMeterRegistry) registry).getRegistries().stream() - .map((r) -> findFirstMatchingMeters(r, name, tags)) - .filter((match) -> !match.isEmpty()).findFirst() - .orElse(Collections.emptyList()); + return findFirstMatchingMeters((CompositeMeterRegistry) registry, name, tags); + } + return registry.find(name).tags(tags).meters(); + } - } - else { - Collection metersFound = registry.find(name).tags(tags).meters(); - if (!metersFound.isEmpty()) { - return metersFound; - } - } - return Collections.emptyList(); + private Collection findFirstMatchingMeters(CompositeMeterRegistry composite, + String name, Iterable tags) { + return composite.getRegistries().stream() + .map((registry) -> findFirstMatchingMeters(registry, name, tags)) + .filter((matching) -> !matching.isEmpty()).findFirst() + .orElse(Collections.emptyList()); } private Map getSamples(Collection meters) { diff --git a/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/MetricsEndpointTests.java b/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/MetricsEndpointTests.java index 3ad8e82c23..a417c40b5e 100644 --- a/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/MetricsEndpointTests.java +++ b/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/MetricsEndpointTests.java @@ -98,30 +98,21 @@ public class MetricsEndpointTests { @Test public void findFirstMatchingMetersFromNestedRegistries() { CompositeMeterRegistry composite = new CompositeMeterRegistry(); - SimpleMeterRegistry reg1 = new SimpleMeterRegistry(); - CompositeMeterRegistry reg2 = new CompositeMeterRegistry(); - SimpleMeterRegistry reg3 = new SimpleMeterRegistry(); - - // 1st level nesting - composite.add(reg1); - - // 2st level nesting - reg2.add(reg3); - composite.add(reg2); - - // 2nd level registry has metrics - reg3.counter("cache", "result", "hit", "host", "1").increment(2); - reg3.counter("cache", "result", "miss", "host", "1").increment(2); - reg3.counter("cache", "result", "hit", "host", "2").increment(2); - + SimpleMeterRegistry firstLevel0 = new SimpleMeterRegistry(); + CompositeMeterRegistry firstLevel1 = new CompositeMeterRegistry(); + SimpleMeterRegistry secondLevel = new SimpleMeterRegistry(); + composite.add(firstLevel0); + composite.add(firstLevel1); + firstLevel1.add(secondLevel); + secondLevel.counter("cache", "result", "hit", "host", "1").increment(2); + secondLevel.counter("cache", "result", "miss", "host", "1").increment(2); + secondLevel.counter("cache", "result", "hit", "host", "2").increment(2); MetricsEndpoint endpoint = new MetricsEndpoint(composite); - MetricsEndpoint.MetricResponse response = endpoint.metric("cache", Collections.emptyList()); assertThat(response.getName()).isEqualTo("cache"); assertThat(availableTagKeys(response)).containsExactly("result", "host"); assertThat(getCount(response)).hasValue(6.0); - response = endpoint.metric("cache", Collections.singletonList("result:hit")); assertThat(availableTagKeys(response)).containsExactly("host"); assertThat(getCount(response)).hasValue(4.0); @@ -130,15 +121,11 @@ public class MetricsEndpointTests { @Test public void matchingMeterNotFoundInNestedRegistries() { CompositeMeterRegistry composite = new CompositeMeterRegistry(); - CompositeMeterRegistry reg2 = new CompositeMeterRegistry(); - SimpleMeterRegistry reg3 = new SimpleMeterRegistry(); - - // nested registries - reg2.add(reg3); - composite.add(reg2); - + CompositeMeterRegistry firstLevel = new CompositeMeterRegistry(); + SimpleMeterRegistry secondLevel = new SimpleMeterRegistry(); + composite.add(firstLevel); + firstLevel.add(secondLevel); MetricsEndpoint endpoint = new MetricsEndpoint(composite); - MetricsEndpoint.MetricResponse response = endpoint.metric("invalid.metric.name", Collections.emptyList()); assertThat(response).isNull();