package org.act.tstream.daemon.worker.metrics;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;
import org.apache.log4j.Logger;
import org.act.tstream.task.heartbeat.TaskHeartbeat;
import org.act.tstream.stats.CommonStatsData;
public class TopoCommStatsInfo {
private static final Logger LOG = Logger.getLogger(TopoCommStatsInfo.class);
private String topologyId;
private String topologyName;
// Map<ComponentId, List<TaskId, TaskHeartbeat>>
private Map<String, Map<String, TaskHeartbeat>> spoutHbMap;
private Map<String, Map<String, TaskHeartbeat>> boltHbMap;
//*********** Statistic data ****************//
// Topology Data
private CommStatsData topoStatsData;
// Spout Data
private Map<String, CommStatsData> spoutStatsDataMap;
// Bolt Data
private Map<String, CommStatsData> boltStatsDataMap;
public TopoCommStatsInfo(String topologyId, String topologyName) {
this.topologyId = topologyId;
this.topologyName = topologyName;
topoStatsData = new CommStatsData();
spoutHbMap = new HashMap<String, Map<String, TaskHeartbeat>>();
boltHbMap = new HashMap<String, Map<String, TaskHeartbeat>>();
spoutStatsDataMap = new HashMap<String, CommStatsData>();
boltStatsDataMap = new HashMap<String, CommStatsData>();
}
public String getTopoId() {
return topologyId;
}
public String getTopoName() {
return topologyName;
}
public Map<String, Map<String, TaskHeartbeat>> getSpoutList() {
return spoutHbMap;
}
public Map<String, Map<String, TaskHeartbeat>> getBoltList() {
return boltHbMap;
}
public CommStatsData getTopoStatsData() {
return topoStatsData;
}
public Map<String, CommStatsData> getSpoutStatsData() {
return spoutStatsDataMap;
}
public Map<String, CommStatsData> getBoltStatsData() {
return boltStatsDataMap;
}
public void addToSpoutList(String componentId, String taskId, TaskHeartbeat taskHb) {
Map<String, TaskHeartbeat> taskMap = spoutHbMap.get(componentId);
if (taskMap == null) {
taskMap = new HashMap<String, TaskHeartbeat>();
spoutHbMap.put(componentId, taskMap);
}
taskMap.put(taskId, taskHb);
}
public void addToBoltList(String componentId, String taskId, TaskHeartbeat taskHb) {
Map<String, TaskHeartbeat> taskMap = boltHbMap.get(componentId);
if (taskMap == null) {
taskMap = new HashMap<String, TaskHeartbeat>();
boltHbMap.put(componentId, taskMap);
}
taskMap.put(taskId, taskHb);
}
public void buildTopoStatsData() {
topoStatsData.resetData();
Double latency = 0.0;
for (Entry<String, CommStatsData> spoutEntry : spoutStatsDataMap.entrySet()) {
CommStatsData statsData = spoutEntry.getValue();
topoStatsData.updateSendTps(statsData.getSendTps());
topoStatsData.updateRecvTps(statsData.getRecvTps());
topoStatsData.updateFailed(statsData.getFailed());
latency += statsData.getLatency();
}
latency = latency/(spoutStatsDataMap.size());
topoStatsData.updateLatency(latency);
for (Entry<String, CommStatsData> boltEntry : boltStatsDataMap.entrySet()) {
CommStatsData statsData = boltEntry.getValue();
topoStatsData.updateSendTps(statsData.getSendTps());
topoStatsData.updateRecvTps(statsData.getRecvTps());
topoStatsData.updateFailed(statsData.getFailed());
}
}
public void buildSpoutStatsData() {
updateStatsData(spoutHbMap, spoutStatsDataMap);
}
public void buildBoltStatsData() {
updateStatsData(boltHbMap, boltStatsDataMap);
}
public void updateStatsData(Map<String, Map<String, TaskHeartbeat>> HbMap, Map<String, CommStatsData> statsDataMap) {
for (Entry<String, Map<String, TaskHeartbeat>> Entry : HbMap.entrySet()) {
String componentId = Entry.getKey();
Map<String, TaskHeartbeat> compList = Entry.getValue();
CommStatsData comStatsData = statsDataMap.get(componentId);
if (comStatsData == null) {
comStatsData = new CommStatsData();
statsDataMap.put(componentId, comStatsData);
}
comStatsData.resetData();
for (Entry<String, TaskHeartbeat> compEntry : compList.entrySet()) {
TaskHeartbeat taskHb = compEntry.getValue();
CommonStatsData statsData = taskHb.getStats();
comStatsData.updateStatsData(statsData);
}
double avgLatency = (comStatsData.getLatency())/(compList.size());
comStatsData.updateLatency(avgLatency);
}
}
public class CommStatsData {
private static final String TOPOLOGYNAME = "TopologyName";
private static final String COMPONTENT= "Component";
private static final String SEND_TPS = "send_tps";
private static final String RECV_TPS = "recv_tps";
private static final String FAILED = "failed";
private static final String LATENCY = "process_latency";
private Double sendTps;
private Double recvTps;
private Long failed;
private Double latency;
public CommStatsData() {
resetData();
}
public Double getSendTps() {
return sendTps;
}
public Double getRecvTps() {
return recvTps;
}
public Long getFailed() {
return failed;
}
public Double getLatency() {
return latency;
}
public void updateSendTps(Double tps) {
sendTps += tps;
}
public void updateRecvTps(Double tps) {
recvTps += tps;
}
public void updateFailed(Long fail) {
failed += fail;
}
public void updateLatency(Double latency) {
this.latency = latency;
}
public void updateStatsData(CommonStatsData commStatsData) {
sendTps += commStatsData.get_total_send_tps();
recvTps += commStatsData.get_total_recv_tps();
failed += commStatsData.get_total_failed();
latency += commStatsData.get_avg_latency();
}
public void updateStatsData(CommStatsData commStatsData) {
sendTps += commStatsData.getSendTps();
recvTps += commStatsData.getRecvTps();
failed += commStatsData.getFailed();
latency += commStatsData.getLatency();
}
public void resetData() {
sendTps = 0.0;
recvTps = 0.0;
failed = 0l;
latency = 0.0;
}
public Map<String, Object> convertToKVMap(String topoloygName,String componentId) {
Map<String, Object> ret = new HashMap<String, Object>();
ret.put(TOPOLOGYNAME, topoloygName);
ret.put( COMPONTENT, componentId);
ret.put(SEND_TPS, sendTps);
ret.put( RECV_TPS, recvTps);
ret.put(FAILED, failed);
ret.put(LATENCY, latency);
return ret;
}
public void printValue() {
LOG.info("send_tps: " + sendTps);
LOG.info("recv_tps: " + recvTps);
LOG.info("failed: " + failed);
LOG.info("latency: " + latency);
}
}
}