package de.is24.util.monitoring.visitors;
import java.util.TreeMap;
import de.is24.util.monitoring.Counter;
import de.is24.util.monitoring.HistorizableList;
import de.is24.util.monitoring.MultiValueProvider;
import de.is24.util.monitoring.ReportVisitor;
import de.is24.util.monitoring.StateValueProvider;
import de.is24.util.monitoring.Timer;
import de.is24.util.monitoring.Version;
import de.is24.util.monitoring.helper.HistogramLikeValue;
public class HistogramLikeValueAnalysisVisitor implements ReportVisitor {
private String base;
private float[] percentages = { 0.8f, 0.90f, 0.95f, 0.99f, 1f };
private long totalCount = 0;
private long factor = 0;
private TreeMap<Long, Long> timeToCount = new TreeMap<Long, Long>();
private long currentMax;
public HistogramLikeValueAnalysisVisitor(String base) {
this.base = base;
}
@Override
public void reportCounter(Counter counter) {
String name = counter.getName();
String baseName = base + HistogramLikeValue.NAME_BIGGER_THAN;
if (name.startsWith(baseName)) {
String timeString = name.substring(baseName.length());
long time = Long.parseLong(timeString);
long count = counter.getCount();
timeToCount.put(time, count);
totalCount += count;
}
}
@Override
public void reportHistorizableList(HistorizableList historizableList) {
}
@Override
public void reportStateValue(StateValueProvider stateValueProvider) {
String baseNameFactor = base + HistogramLikeValue.NAME_FACTOR;
String baseNameCurrentMax = base + HistogramLikeValue.NAME_CURRENT_MAX;
if (stateValueProvider.getName().equals(baseNameFactor)) {
factor = stateValueProvider.getValue();
} else if (stateValueProvider.getName().equals(baseNameCurrentMax)) {
currentMax = stateValueProvider.getValue();
}
}
@Override
public void reportTimer(Timer timer) {
}
@Override
public void reportVersion(Version version) {
}
@Override
public void reportMultiValue(MultiValueProvider multiValueProvider) {
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
int currentPercentageIdx = 0;
long currentCount = 0;
sb.append(base).append("\n");
for (Long time : timeToCount.keySet()) {
Long count = timeToCount.get(time);
currentCount += count;
float border = percentages[currentPercentageIdx] * totalCount;
if (currentCount >= border) {
double currentPercentage = ((double) currentCount / totalCount) * 100;
sb.append(currentCount)
.append(" values, which are ")
.append(currentPercentage)
.append(
"%, are smaller than ")
.append(((currentPercentage >= 100) ? "or equal to " : ""))
.append(
(currentPercentage >= 100) ? currentMax : (time + factor))
.append(" flurbs")
.append("\n");
currentPercentageIdx++;
}
}
return sb.toString();
}
}