package resa.metrics; import backtype.storm.metric.api.IMetric; import java.util.Arrays; import java.util.HashMap; import java.util.Map; /** * Created by ding on 14-8-12. */ public class StatMetric implements IMetric { private double[] xAxis; private Map<String, long[]> data; public StatMetric(double[] xAxis) { this.xAxis = xAxis; if (xAxis != null && xAxis.length > 0) { data = new HashMap<>(); } } public void add(String key, double value) { int pos = Arrays.binarySearch(xAxis, value); if (pos < 0) { pos = -pos - 1; } data.computeIfAbsent(key, k -> new long[xAxis.length + 1])[pos]++; // long[] stat = data.computeIfAbsent(key, k -> new long[(xAxis.length + 1) * 2]); // stat[pos * 2]++; // stat[pos * 2 + 1] = Double.doubleToLongBits(Double.longBitsToDouble(stat[pos * 2 + 1]) + value); } @Override public Object getValueAndReset() { if (data == null || data.isEmpty()) { return null; } Map<String, String> ret = new HashMap<>(); data.forEach((k, v) -> ret.put(k, stat2String(v))); data = new HashMap<>(); return ret; } private String stat2String(long[] statData) { StringBuilder sb = new StringBuilder(); sb.append(statData[0]); for (int i = 1; i < statData.length; i++) { sb.append(','); sb.append(statData[i]); } // for (int i = 2; i < statData.length; i += 2) { // sb.append(','); // sb.append(statData[i]); // } // sb.append(";"); // sb.append(Double.longBitsToDouble(statData[1])); // for (int i = 3; i < statData.length; i += 2) { // sb.append(','); // sb.append(Double.longBitsToDouble(statData[i])); // } return sb.toString(); } }