package org.apereo.cas.monitor;
import org.apereo.cas.configuration.CasConfigurationProperties;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.Arrays;
/**
* Abstract base class for monitors that observe cache storage systems.
*
* @author Marvin S. Addison
* @since 3.5.1
*/
public abstract class AbstractCacheMonitor extends AbstractNamedMonitor<CacheStatus> {
private static final Logger LOGGER = LoggerFactory.getLogger(AbstractCacheMonitor.class);
/**
* CAS properties.
*/
@Autowired
protected CasConfigurationProperties casProperties;
public AbstractCacheMonitor(final String name) {
super(name);
}
@Override
public CacheStatus observe() {
CacheStatus status;
try {
final CacheStatistics[] statistics = getStatistics();
if (statistics == null || statistics.length == 0) {
return new CacheStatus(StatusCode.ERROR, "Cache statistics not available.");
}
final StatusCode[] overall = {StatusCode.OK};
Arrays.stream(statistics)
.map(this::status)
.filter(code -> code.value() > overall[0].value())
.forEach(code -> overall[0] = code);
status = new CacheStatus(overall[0], null, statistics);
} catch (final Exception e) {
LOGGER.error(e.getMessage(), e);
status = new CacheStatus(e);
}
return status;
}
/**
* Gets the statistics from this monitor.
*
* @return the statistics
*/
protected abstract CacheStatistics[] getStatistics();
/**
* Computes the status code for a given set of cache statistics.
*
* @param statistics Cache statistics.
* @return {@link StatusCode#WARN} if eviction count is above threshold or if
* percent free space is below threshold, otherwise {@link StatusCode#OK}.
*/
protected StatusCode status(final CacheStatistics statistics) {
final StatusCode code;
if (statistics.getEvictions() > casProperties.getMonitor().getWarn().getEvictionThreshold()) {
code = StatusCode.WARN;
} else if (statistics.getPercentFree() < casProperties.getMonitor().getWarn().getThreshold()) {
code = StatusCode.WARN;
} else {
code = StatusCode.OK;
}
return code;
}
}