package com.netflix.eureka.util; import com.netflix.appinfo.InstanceInfo; import com.netflix.discovery.shared.Application; import com.netflix.eureka.EurekaServerContext; import com.netflix.eureka.cluster.PeerEurekaNode; import com.netflix.eureka.cluster.PeerEurekaNodes; import com.netflix.eureka.registry.PeerAwareInstanceRegistry; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.net.URI; /** * @author David Liu */ public class StatusUtil { private static final Logger logger = LoggerFactory.getLogger(StatusUtil.class); private final String myAppName; private final PeerAwareInstanceRegistry registry; private final PeerEurekaNodes peerEurekaNodes; private final InstanceInfo instanceInfo; public StatusUtil(EurekaServerContext server) { this.myAppName = server.getApplicationInfoManager().getInfo().getAppName(); this.registry = server.getRegistry(); this.peerEurekaNodes = server.getPeerEurekaNodes(); this.instanceInfo = server.getApplicationInfoManager().getInfo(); } public StatusInfo getStatusInfo() { StatusInfo.Builder builder = StatusInfo.Builder.newBuilder(); // Add application level status int upReplicasCount = 0; StringBuilder upReplicas = new StringBuilder(); StringBuilder downReplicas = new StringBuilder(); StringBuilder replicaHostNames = new StringBuilder(); for (PeerEurekaNode node : peerEurekaNodes.getPeerEurekaNodes()) { if (replicaHostNames.length() > 0) { replicaHostNames.append(", "); } replicaHostNames.append(node.getServiceUrl()); if (isReplicaAvailable(node.getServiceUrl())) { upReplicas.append(node.getServiceUrl()).append(','); upReplicasCount++; } else { downReplicas.append(node.getServiceUrl()).append(','); } } builder.add("registered-replicas", replicaHostNames.toString()); builder.add("available-replicas", upReplicas.toString()); builder.add("unavailable-replicas", downReplicas.toString()); // Only set the healthy flag if a threshold has been configured. if (peerEurekaNodes.getMinNumberOfAvailablePeers() > -1) { builder.isHealthy(upReplicasCount >= peerEurekaNodes.getMinNumberOfAvailablePeers()); } builder.withInstanceInfo(this.instanceInfo); return builder.build(); } private boolean isReplicaAvailable(String url) { try { Application app = registry.getApplication(myAppName, false); if (app == null) { return false; } for (InstanceInfo info : app.getInstances()) { if (peerEurekaNodes.isInstanceURL(url, info)) { return true; } } } catch (Throwable e) { logger.error("Could not determine if the replica is available ", e); } return false; } }