package com.livefyre.livecount;
import java.util.HashMap;
import java.util.Map;
import com.livefyre.livecount.PerformanceMetric.RequestType;
public class MetricAggregator {
private Map<RequestType, MetricGroup> aggregates = new HashMap<RequestType, MetricAggregator.MetricGroup>();
private MetricGroup totals = new MetricGroup();
public void add(PerformanceMetric metric) {
if (!aggregates.containsKey(metric.requestType)) {
aggregates.put(metric.requestType, new MetricGroup());
}
MetricGroup group = aggregates.get(metric.requestType);
group.add(metric);
totals.add(metric);
aggregates.put(metric.requestType, group);
}
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("****************************:\n");
sb.append("Totals:\n");
sb.append(totals);
sb.append("\n");
sb.append("By Type: \n");
for (RequestType type : aggregates.keySet()) {
sb.append(type.name() + ":\n");
sb.append(aggregates.get(type));
sb.append("\n");
}
return sb.toString();
}
class MetricGroup {
public long average = 0;
public long count = 0;
public long total = 0;
public long errors = 0;
public long shortestTrip = Long.MAX_VALUE;
public long longestTrip = Long.MIN_VALUE;
public synchronized void add(PerformanceMetric metric) {
errors += metric.exception == null ? 0 : 1;
total += metric.roundTripTime;
count++;
average = (total / count);
longestTrip = metric.roundTripTime > longestTrip ? metric.roundTripTime : longestTrip;
shortestTrip = metric.roundTripTime < shortestTrip ? metric.roundTripTime : shortestTrip;
}
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(" Requests: " + count + "\n");
sb.append(" Errors: " + errors + "\n");
sb.append(" Total Time: " + total + " ms\n");
sb.append(" Shortest Time: " + shortestTrip + " ms\n");
sb.append(" Average Time: " + average + " ms\n");
sb.append(" Longest Time: " + longestTrip + " ms\n");
return sb.toString();
}
}
}