in fractions/monitor/src/main/java/org/wildfly/swarm/monitor/runtime/HttpContexts.java [120:199]
private void proxyRequests(HttpServerExchange exchange) {
if (monitor.getHealthURIs().isEmpty()) {
noHealthEndpoints(exchange);
} else {
try {
final List<InVMResponse> responses = new CopyOnWriteArrayList<>();
CountDownLatch latch = new CountDownLatch(monitor.getHealthURIs().size());
dispatched.set(latch);
for (HealthMetaData healthCheck : monitor.getHealthURIs()) {
invokeHealthInVM(exchange, healthCheck, responses, latch);
}
latch.await(10, TimeUnit.SECONDS);
if (latch.getCount() > 0) {
throw new Exception("Probe timed out");
}
boolean failed = false;
if (!responses.isEmpty()) {
if (responses.size() != monitor.getHealthURIs().size()) {
throw new RuntimeException("The number of responses does not match!");
}
StringBuffer sb = new StringBuffer("{");
sb.append("\"checks\": [\n");
int i = 0;
for (InVMResponse resp : responses) {
sb.append(resp.getPayload());
if (!failed) {
failed = resp.getStatus() != 200;
}
if (i < responses.size() - 1) {
sb.append(",\n");
}
i++;
}
sb.append("],\n");
String outcome = failed ? "DOWN" : "UP"; // we don't have policies yet, so keep it simple
sb.append("\"outcome\": \"" + outcome + "\"\n");
sb.append("}\n");
// send a response
if (failed) {
exchange.setStatusCode(503);
}
exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "application/json");
exchange.getResponseSender().send(sb.toString());
} else {
new RuntimeException("Responses should not be empty").printStackTrace();
exchange.setStatusCode(500);
}
exchange.endExchange();
} catch (Throwable t) {
LOG.error("Health check failed", t);
if (!exchange.isResponseStarted()) {
exchange.setStatusCode(500);
}
exchange.endExchange();
}
}
}