package resa.migrate.plan; import org.codehaus.jackson.map.ObjectMapper; import resa.metrics.MetricNames; import java.util.Collections; import java.util.Map; import java.util.SortedMap; import java.util.TreeMap; /** * Created by ding on 14-5-29. */ public class ExecutionAnalyzer { public static class ExecutionStat { private long count; private double cost; private long dataSize; void add(long count, double cost) { this.count += count; this.cost += cost; } void add(ExecutionStat stat) { this.count += stat.count; this.cost += stat.cost; } public long getCount() { return count; } public double getCost() { return cost; } @Override public String toString() { return "ExecutionStat{" + "count=" + count + ", cost=" + cost + '}'; } public long getDataSize() { return dataSize; } public void setDataSize(long dataSize) { this.dataSize = dataSize; } } public ExecutionAnalyzer(Iterable<String> dataStream) { this.dataStream = dataStream; } private Iterable<String> dataStream; private ObjectMapper objectMapper = new ObjectMapper(); private SortedMap<String, ExecutionStat> executeStat = new TreeMap<>(); public ExecutionAnalyzer calcStat() { dataStream.forEach(metricStr -> { final String comp; final int taskId; Map<String, Object> taskData; try { String[] tmp = metricStr.split("->"); String[] head = tmp[0].split(":"); comp = head[0]; taskId = Integer.parseInt(head[1]); taskData = (Map<String, Object>) objectMapper.readValue(tmp[1], Map.class); } catch (Exception e) { return; } String key = String.format("%s:%03d", comp, taskId); ExecutionStat stat = executeStat.computeIfAbsent(key, (k) -> new ExecutionStat()); ((Map<String, String>) taskData.getOrDefault(MetricNames.TASK_EXECUTE, Collections.emptyMap())) .forEach((s, exeStr) -> { String[] elements = exeStr.split(","); int cnt = Integer.valueOf(elements[0]); if (cnt > 0) { double val = Double.valueOf(elements[1]); // double val_2 = Double.valueOf(elements[2]); stat.add(cnt, val); } }); Number dataSize = (Number) taskData.get(MetricNames.SERIALIZED_SIZE); if (dataSize != null) { stat.setDataSize(dataSize.longValue()); } }); return this; } public SortedMap<String, ExecutionStat> getStat() { return executeStat; } }