package org.apereo.cas.monitor; import java.util.Comparator; import java.util.LinkedHashMap; import java.util.Map; import java.util.Set; import java.util.stream.Collectors; /** * Simple health check monitor that reports the overall health as the greatest reported * {@link StatusCode} of an arbitrary number of individual checks. * * @author Marvin S. Addison * @since 3.5.0 */ public class HealthCheckMonitor implements Monitor<HealthStatus> { /** * Individual monitors that comprise health check. */ private final Set<Monitor> monitors; public HealthCheckMonitor(final Set<Monitor> monitors) { this.monitors = monitors; } @Override public String getName() { return HealthCheckMonitor.class.getSimpleName(); } @Override public HealthStatus observe() { final Map<String, Status> results = this.monitors.stream() .collect(Collectors.toMap(Monitor::getName, HealthCheckMonitor::getResultOf, (v1, v2) -> { throw new IllegalStateException(String.format("Duplicate key %s", v1)); }, LinkedHashMap::new)); return new HealthStatus(getWorstStatusFrom(results), results); } private static StatusCode getWorstStatusFrom(final Map<String, Status> results) { return results.values().stream() .map(Status::getCode) .max(Comparator.comparingInt(StatusCode::value)) .orElse(StatusCode.UNKNOWN); } private static Status getResultOf(final Monitor monitor) { try { return monitor.observe(); } catch (final Exception e) { return new Status(StatusCode.ERROR, e.getClass().getSimpleName() + ": " + e.getMessage()); } } }