/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package org.act.tstream.ui.model.data; import java.io.Serializable; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import javax.faces.bean.ManagedBean; import javax.faces.bean.ViewScoped; import javax.faces.context.FacesContext; import org.apache.log4j.Logger; import backtype.storm.Config; import backtype.storm.generated.NotAliveException; import backtype.storm.generated.StormTopology; import backtype.storm.generated.TaskSummary; import backtype.storm.generated.TopologyInfo; import backtype.storm.utils.NimbusClient; import org.act.tstream.common.stats.StatBuckets; import org.act.tstream.ui.UIUtils; import org.act.tstream.ui.model.Components; import org.act.tstream.ui.model.TopologySumm; import org.act.tstream.ui.model.WinComponentStats; import org.act.tstream.utils.JStormUtils; /** * * @author xin.zhou/Longda */ @ManagedBean(name = "topologypage") @ViewScoped public class TopologyPage implements Serializable { private static final long serialVersionUID = -214838419818487219L; private static final Logger LOG = Logger.getLogger(TopologyPage.class); private String clusterName = null; private String topologyid = null; private String window = null; private List<TopologySumm> tsumm = null; private List<WinComponentStats> tstats = null; private List<Components> scom = null; private List<Components> bcom = null; public TopologyPage() throws Exception { FacesContext ctx = FacesContext.getCurrentInstance(); if (ctx.getExternalContext().getRequestParameterMap().get("clusterName") != null) { clusterName = (String) ctx.getExternalContext() .getRequestParameterMap().get("clusterName"); } if (ctx.getExternalContext().getRequestParameterMap().get("topologyid") != null) { topologyid = (String) ctx.getExternalContext() .getRequestParameterMap().get("topologyid"); } LOG.debug("Query clusterName=" + clusterName + ", topology=" + topologyid); window = UIUtils.getWindow(ctx); LOG.info("Window:" + window); if (topologyid == null) { LOG.error("Not set topologyid"); throw new NotAliveException("Input topologyId is null "); } init(); } public TopologyPage(String clusterName, String topologyId, String window) throws Exception { this.clusterName = clusterName; this.topologyid = topologyId; this.window = window; LOG.info("Window:" + window); init(); } private void init() throws Exception { NimbusClient client = null; try { Map conf = UIUtils.readUiConfig(); client = UIUtils.getNimbusClient(conf, clusterName); TopologyInfo summ = client.getClient().getTopologyInfo(topologyid); StormTopology topology = client.getClient().getTopology(topologyid); List<TaskSummary> ts = summ.get_tasks(); tsumm = UIUtils.topologySummary(summ); getComponents(ts, topology); tstats = topologyStatsTable(scom, bcom); } catch (Exception e) { LOG.error("Failed to get topology information,", e); throw e; } finally { if (client != null) { client.close(); } } } private List<Components> getComponents( Map<String, List<TaskSummary>> componentMap, String type) { List<Components> components = new ArrayList<Components>(); for (Entry<String, List<TaskSummary>> entry : componentMap.entrySet()) { String componentId = entry.getKey(); List<TaskSummary> taskList = entry.getValue(); Components component = UIUtils.getComponent(taskList, componentId, type, window); String lastError = UIUtils.mostRecentError(taskList); component.setLastError(lastError); components.add(component); } return components; } /** * get spout or bolt's List<Components> * * * @param ts * @param topology * @throws NotAliveException */ private void getComponents(List<TaskSummary> ts, StormTopology topology) throws NotAliveException { if (ts == null) { LOG.error("Task list is empty"); throw new NotAliveException("Task list is empty"); } Map<String, List<TaskSummary>> spoutTasks = new HashMap<String, List<TaskSummary>>(); Map<String, List<TaskSummary>> boltTasks = new HashMap<String, List<TaskSummary>>(); for (TaskSummary t : ts) { if (t == null) { continue; } String componentid = t.get_component_id(); String componentType = UIUtils.componentType(topology, componentid); if (componentType.equals(UIUtils.SPOUT_STR)) { UIUtils.addTask(spoutTasks, t, componentid); } else if (componentType.equals(UIUtils.BOLT_STR)) { UIUtils.addTask(boltTasks, t, componentid); } } scom = getComponents(spoutTasks, UIUtils.SPOUT_STR); bcom = getComponents(boltTasks, UIUtils.BOLT_STR); } private List<WinComponentStats> topologyStatsTable(List<Components> scom, List<Components> bcom) { List<Components> all = new ArrayList<Components>(); all.addAll(scom); all.addAll(bcom); Long emitted = 0l; Double sendTps = 0.0; Double recvTps = 0.0; Long acked = 0l; Long failed = 0l; for (Components component : all) { emitted += Long.valueOf(component.getEmitted()); sendTps += Double.valueOf(component.getSendTps()); recvTps += Double.valueOf(component.getRecvTps()); acked += Long.valueOf(component.getAcked()); failed += Long.valueOf(component.getFailed()); } Double process = 0.0; Long spoutNum = Long.valueOf(0); for (Components component : scom) { if (component.getProcess() != null) { process += (Double.valueOf(component.getProcess()) * Long .valueOf(component.getParallelism())); } spoutNum = Long.valueOf(component.getParallelism()); } Double avergProcess = process / spoutNum; WinComponentStats topologyStats = new WinComponentStats(); topologyStats.setWindow(window); topologyStats.setEmitted(JStormUtils.formatValue(emitted)); topologyStats.setSendTps(JStormUtils.formatValue(sendTps)); topologyStats.setRecvTps(JStormUtils.formatValue(recvTps)); topologyStats.setAcked(JStormUtils.formatValue(acked)); topologyStats.setFailed(JStormUtils.formatValue(failed)); topologyStats.setProcess(JStormUtils.formatValue(avergProcess)); List<WinComponentStats> tss = new ArrayList<WinComponentStats>(); tss.add(topologyStats); return tss; } public String getTopologyid() { return topologyid; } public void setTopologyid(String topologyid) { this.topologyid = topologyid; } public String getWindow() { return window; } public void setWindow(String window) { this.window = window; } public List<TopologySumm> getTsumm() { return tsumm; } public void setTsumm(List<TopologySumm> tsumm) { this.tsumm = tsumm; } public List<WinComponentStats> getTstats() { return tstats; } public void setTstats(List<WinComponentStats> tstats) { this.tstats = tstats; } public List<Components> getScom() { return scom; } public void setScom(List<Components> scom) { this.scom = scom; } public List<Components> getBcom() { return bcom; } public void setBcom(List<Components> bcom) { this.bcom = bcom; } public static void main(String[] args) { try { TopologyPage instance = new TopologyPage("jstorm", "sequence_test-1-1386516240", StatBuckets.ALL_WINDOW_STR); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }