package de.is24.util.monitoring.status; import de.is24.util.monitoring.InApplicationMonitor; import de.is24.util.monitoring.StateValueProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class SampledData { private static final Logger LOGGER = LoggerFactory.getLogger(SampledData.class); final int maxIndex = 15; long[] successData = new long[maxIndex]; long[] failureData = new long[maxIndex]; int currentPointer = 0; private final String name; public SampledData(String name) { this.name = name; initData(); InApplicationMonitor.getInstance().registerStateValue(new StateValueProvider() { @Override public long getValue() { return (long) (getOnMinuteFailureRate() * 100); } @Override public String getName() { return SampledData.this.name + ".oneMinuteFailureRate"; } }); } public void addSample(long successCount, long failureCount) { incrementCurrentPointer(); failureData[currentPointer] = failureCount; successData[currentPointer] = successCount; } private void incrementCurrentPointer() { currentPointer += 1; if (currentPointer >= maxIndex) { currentPointer = 0; } } private void initData() { for (int i = 0; i < maxIndex; i++) { failureData[i] = 0; successData[i] = 0; } } public float getOnMinuteFailureRate() { return calcRateOverInterval(1); } public float getFiveMinuteFailureRate() { return calcRateOverInterval(5); } public Float getFifteenMinuteFailureRate() { return calcRateOverInterval(15); } private float calcRateOverInterval(int interval) { int currentIndex = currentPointer; int successCount = 0; int failureCount = 0; int count = 0; while (count < interval) { successCount += successData[currentIndex]; failureCount += failureData[currentIndex]; currentIndex -= 1; if (currentIndex < 0) { currentIndex = maxIndex - 1; } count++; } return calcFailureRate(successCount, failureCount); } private float calcFailureRate(long successCount, long failureCount) { LOGGER.debug("success count {}, failureCount : {}", successCount, failureCount); long total = successCount + failureCount; return (total == 0) ? 0.0f : ((float) failureCount / total); } }