package com.jivesoftware.os.amzabot.deployable;
import com.jivesoftware.os.routing.bird.deployable.InstanceConfig;
import com.jivesoftware.os.routing.bird.health.HealthCheck;
import com.jivesoftware.os.routing.bird.health.HealthCheckResponse;
import com.jivesoftware.os.routing.bird.health.HealthCheckResponseImpl;
import com.jivesoftware.os.routing.bird.health.api.HealthCheckConfig;
import java.util.Map;
import java.util.Map.Entry;
import org.merlin.config.defaults.DoubleDefault;
import org.merlin.config.defaults.StringDefault;
class AmzaBotHealthCheck implements HealthCheck {
interface AmzaBotHealthCheckConfig extends HealthCheckConfig {
@Override
@StringDefault("amzabot>fault>count")
String getName();
@Override
@StringDefault("Number of amza bot faults.")
String getDescription();
@DoubleDefault(0.0)
Double getBadHealth();
}
private final InstanceConfig instanceConfig;
private final AmzaBotHealthCheckConfig config;
private final AmzaKeyClearingHousePool amzaKeyClearingHousePool;
AmzaBotHealthCheck(InstanceConfig instanceConfig,
AmzaBotHealthCheckConfig config,
AmzaKeyClearingHousePool amzaKeyClearingHousePool) {
this.instanceConfig = instanceConfig;
this.config = config;
this.amzaKeyClearingHousePool = amzaKeyClearingHousePool;
}
public HealthCheckResponse checkHealth() throws Exception {
Map<String, Entry<Integer, Integer>> quarantinedKeys = amzaKeyClearingHousePool.getAllQuarantinedEntries();
if (quarantinedKeys.isEmpty()) {
return new HealthCheckResponseImpl(config.getName(), 1.0, "Healthy", config.getDescription(), "", System.currentTimeMillis());
} else {
return new HealthCheckResponse() {
@Override
public String getName() {
return config.getName();
}
@Override
public double getHealth() {
return config.getBadHealth();
}
@Override
public String getStatus() {
return "There are " + quarantinedKeys.size() + " invalid keys.";
}
@Override
public String getDescription() {
StringBuilder sb = new StringBuilder();
quarantinedKeys.forEach((key, entry) -> {
if (sb.length() > 0) {
sb.append(",");
}
sb.append(key);
sb.append(":");
sb.append(entry.getKey());
sb.append(":");
sb.append(entry.getValue());
});
sb.insert(0, "Invalid key list: ");
return sb.toString();
}
@Override
public String getResolution() {
return "Investigate invalid Amza keys. Reset via " +
"http://" +
instanceConfig.getHost() + ":" + instanceConfig.getMainPort() +
"/api/amzabot/v1/resetInvalidKeys";
}
@Override
public long getTimestamp() {
return System.currentTimeMillis();
}
};
}
}
}