package com.dianping.cosmos.monitor;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import backtype.storm.metric.api.IMetricsConsumer.DataPoint;
import backtype.storm.metric.api.IMetricsConsumer.TaskInfo;
public class TopologyMonitor {
private static final Logger LOGGER = LoggerFactory.getLogger(TopologyMonitor.class);
private static Map<Integer, SpoutCounter> spoutCounterMap = new ConcurrentHashMap<Integer, SpoutCounter>();
public void monitorStatus(String stormId, TaskInfo taskInfo, DataPoint p) {
SpoutCounter counter = spoutCounterMap.get(taskInfo.srcTaskId);
if(counter == null){
counter = new SpoutCounter();
spoutCounterMap.put(taskInfo.srcTaskId, counter);
}
counter.incrRepeatCounter();
String value = String.valueOf(p.value);
long increment = Long.parseLong(value);
counter.incrTupleCounter(increment);
//连续1分钟
if(counter.getRepeatCounter() >= 12){
//数据量少于某个记录
LOGGER.info("last minute tuple = " + counter.getTupleCounter());
if(counter.getTupleCounter() <= 10000){
LOGGER.error("spout has problem, restar topology....");
//restartTopology(stormId);
}
spoutCounterMap.clear();
}
}
/**
* stromId: MobileUV_7-212-1409657868
* @param stormId
*/
public void restartTopology(String stormId){
String currentTopology = StringUtils.substringBefore(stormId, "-");
String topologyPrefix = StringUtils.substringBefore(currentTopology, "_");
String topologyIndex = StringUtils.substringAfter(currentTopology, "_");
int newIndex = Integer.parseInt(topologyIndex) + 1;
String newTopologyName = topologyPrefix + "_" + newIndex;
LOGGER.info("new topology name = " + newTopologyName);
execStartCommand(newTopologyName);
LOGGER.info("execStartCommand finish ..");
execShutdownCommand(currentTopology);
LOGGER.info("execShutdownCommand finish ..");
}
public void execStartCommand(String topologyName){
Process process;
try {
process = Runtime.getRuntime().exec(new String[]{
"/usr/local/storm/bin/storm",
"jar",
"/home/hadoop/topology/meteor-traffic-0.0.1.jar",
"com.dianping.data.warehouse.traffic.mobile.MobileUVTopology",
topologyName});
process.waitFor();
} catch (Exception e) {
LOGGER.error("", e);
}
}
public void execShutdownCommand(String topologyName){
Process process;
try {
process = Runtime.getRuntime().exec(new String[]{
"/usr/local/storm/bin/storm",
"kill",
topologyName,
"10"});
process.waitFor();
} catch (Exception e) {
LOGGER.error("", e);
}
}
public static void main(String[] args){
TopologyMonitor monitor = new TopologyMonitor();
monitor.restartTopology("MobileUV_7-212-1409657868");
}
}