diff --git a/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/EurekaHealthCheckHandler.java b/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/EurekaHealthCheckHandler.java index 9b3dec21f..60ee28afc 100644 --- a/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/EurekaHealthCheckHandler.java +++ b/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/EurekaHealthCheckHandler.java @@ -19,6 +19,7 @@ package org.springframework.cloud.netflix.eureka; import java.util.HashMap; import java.util.HashSet; import java.util.Map; +import java.util.Set; import com.netflix.appinfo.HealthCheckHandler; import com.netflix.appinfo.InstanceInfo; @@ -130,10 +131,9 @@ public class EurekaHealthCheckHandler @Override public InstanceStatus getStatus(InstanceStatus instanceStatus) { if (running) { - Map statuses = new HashMap<>(); - InstanceStatus status = getHealthStatus(statuses); + InstanceStatus status = getHealthStatus(); if (status != instanceStatus) { - log.info("Eureka health status changed to " + status + " with health contributors " + statuses); + log.info("Eureka health status changed to " + status); } return status; } @@ -145,33 +145,36 @@ public class EurekaHealthCheckHandler } } - protected InstanceStatus getHealthStatus(Map statuses) { - Status status = getStatus(statusAggregator, statuses); + protected InstanceStatus getHealthStatus() { + Status status = getStatus(statusAggregator); return mapToInstanceStatus(status); } - protected Status getStatus(StatusAggregator statusAggregator, Map statuses) { + protected Status getStatus(StatusAggregator statusAggregator) { + Set statuses = new HashSet<>(); for (Map.Entry entry : healthContributors.entrySet()) { processContributor(statuses, entry.getKey(), entry.getValue()); } for (Map.Entry entry : reactiveHealthContributors.entrySet()) { processContributor(statuses, entry.getKey(), entry.getValue()); } - return statusAggregator.getAggregateStatus(new HashSet<>(statuses.values())); + return statusAggregator.getAggregateStatus(statuses); } - private void processContributor(Map statuses, String name, HealthContributor contributor) { + private void processContributor(Set statuses, String name, HealthContributor contributor) { if (contributor instanceof CompositeHealthContributor) { for (HealthContributors.Entry contrib : (CompositeHealthContributor) contributor) { processContributor(statuses, contrib.name(), contrib.contributor()); } } else if (contributor instanceof HealthIndicator) { - statuses.put(name, ((HealthIndicator) contributor).health().getStatus()); + Status status = ((HealthIndicator) contributor).health().getStatus(); + log.debug("Health contributor " + name + " has status " + status); + statuses.add(status); } } - private void processContributor(Map statuses, String name, ReactiveHealthContributor contributor) { + private void processContributor(Set statuses, String name, ReactiveHealthContributor contributor) { if (contributor instanceof CompositeReactiveHealthContributor) { for (ReactiveHealthContributors.Entry contrib : (CompositeReactiveHealthContributor) contributor) { processContributor(statuses, contrib.name(), contrib.contributor()); @@ -180,7 +183,9 @@ public class EurekaHealthCheckHandler else if (contributor instanceof ReactiveHealthIndicator) { Health health = ((ReactiveHealthIndicator) contributor).health().block(); if (health != null) { - statuses.put(name, health.getStatus()); + Status status = health.getStatus(); + log.debug("Health contributor " + name + " has status " + status); + statuses.add(status); } } } diff --git a/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/EurekaHealthCheckHandlerTests.java b/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/EurekaHealthCheckHandlerTests.java index 7ad240230..396f6f30f 100644 --- a/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/EurekaHealthCheckHandlerTests.java +++ b/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/EurekaHealthCheckHandlerTests.java @@ -36,7 +36,6 @@ import org.springframework.boot.health.contributor.HealthContributor; import org.springframework.boot.health.contributor.HealthContributors; import org.springframework.boot.health.contributor.HealthIndicator; import org.springframework.boot.health.contributor.ReactiveHealthIndicator; -import org.springframework.boot.health.contributor.Status; import org.springframework.cloud.client.discovery.health.DiscoveryClientHealthIndicator; import org.springframework.cloud.client.discovery.health.DiscoveryCompositeHealthContributor; import org.springframework.cloud.client.discovery.health.DiscoveryHealthIndicator; @@ -164,30 +163,6 @@ class EurekaHealthCheckHandlerTests { assertThat(status).isEqualTo(InstanceStatus.DOWN); } - @Test - void testContributorStatusesWithBlockingIndicators() { - initialize(NamedUpHealthConfiguration.class, NamedDownHealthConfiguration.class); - - Map statuses = new HashMap<>(); - Status status = healthCheckHandler.getStatus(new SimpleStatusAggregator(), statuses); - - assertThat(status).isEqualTo(Status.DOWN); - assertThat(statuses).containsEntry("upHealthIndicator", Status.UP); - assertThat(statuses).containsEntry("downHealthIndicator", Status.DOWN); - } - - @Test - void testContributorStatusesWithReactiveIndicators() { - initialize(NamedReactiveUpHealthConfiguration.class, NamedReactiveDownHealthConfiguration.class); - - Map statuses = new HashMap<>(); - Status status = healthCheckHandler.getStatus(new SimpleStatusAggregator(), statuses); - - assertThat(status).isEqualTo(Status.DOWN); - assertThat(statuses).containsEntry("reactiveUpHealthIndicator", Status.UP); - assertThat(statuses).containsEntry("reactiveDownHealthIndicator", Status.DOWN); - } - private void initialize(Class... configurations) { ApplicationContext applicationContext = new AnnotationConfigApplicationContext(configurations); healthCheckHandler.setApplicationContext(applicationContext);