package resa.metrics;
import backtype.storm.metric.api.IMetric;
import java.util.HashMap;
import java.util.Map;
/**
* Created by ding on 14-1-28.
*/
public class CMVMetric implements IMetric {
private static class Accumulator {
private int count = 0;
private double sum = 0;
private double sumOfSquare = 0;
void add(double num) {
count++;
sum = sum + num;
sumOfSquare = sumOfSquare + num * num;
}
public void reset() {
count = 0;
sum = 0;
sumOfSquare = 0;
}
public boolean isEmpty() {
return count == 0;
}
@Override
public String toString() {
return count + "," + sum + "," + sumOfSquare;
}
}
private Map<String, Accumulator> data = new HashMap<>();
public void addMetric(String key, double value) {
data.computeIfAbsent(key, (k) -> new Accumulator()).add(value);
}
@Override
public Object getValueAndReset() {
Map<String, String> ret = new HashMap<>((int) (data.size() / 0.75f) + 1);
data.forEach((k, v) -> {
if (!v.isEmpty()) {
ret.put(k, v.toString());
v.reset();
}
});
return ret;
}
}