Log individual Eureka health contributor statuses

Signed-off-by: 98001yash <yashchauhan.gaya@gmail.com>
This commit is contained in:
98001yash
2026-09-03 02:19:30 +05:30
parent 70788002d0
commit c9d9905237
2 changed files with 16 additions and 36 deletions
@@ -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<String, Status> 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<String, Status> statuses) {
Status status = getStatus(statusAggregator, statuses);
protected InstanceStatus getHealthStatus() {
Status status = getStatus(statusAggregator);
return mapToInstanceStatus(status);
}
protected Status getStatus(StatusAggregator statusAggregator, Map<String, Status> statuses) {
protected Status getStatus(StatusAggregator statusAggregator) {
Set<Status> statuses = new HashSet<>();
for (Map.Entry<String, HealthContributor> entry : healthContributors.entrySet()) {
processContributor(statuses, entry.getKey(), entry.getValue());
}
for (Map.Entry<String, ReactiveHealthContributor> entry : reactiveHealthContributors.entrySet()) {
processContributor(statuses, entry.getKey(), entry.getValue());
}
return statusAggregator.getAggregateStatus(new HashSet<>(statuses.values()));
return statusAggregator.getAggregateStatus(statuses);
}
private void processContributor(Map<String, Status> statuses, String name, HealthContributor contributor) {
private void processContributor(Set<Status> 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<String, Status> statuses, String name, ReactiveHealthContributor contributor) {
private void processContributor(Set<Status> 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);
}
}
}
@@ -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<String, Status> 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<String, Status> 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);