blob: faf043f0836de0ad6ba40f49d9bce4ba989774d0 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.alibaba.jstorm.ui.model.pages;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import backtype.storm.generated.MetricInfo;
import backtype.storm.generated.SupervisorSummary;
import backtype.storm.generated.SupervisorWorkers;
import backtype.storm.generated.TaskComponent;
import backtype.storm.generated.WorkerSummary;
import backtype.storm.utils.NimbusClient;
import backtype.storm.utils.Utils;
import com.alibaba.jstorm.client.ConfigExtension;
import com.alibaba.jstorm.common.metric.window.StatBuckets;
import com.alibaba.jstorm.ui.NimbusClientManager;
import com.alibaba.jstorm.ui.UIDef;
import com.alibaba.jstorm.ui.UIUtils;
import com.alibaba.jstorm.ui.model.ColumnData;
import com.alibaba.jstorm.ui.model.LinkData;
import com.alibaba.jstorm.ui.model.PageGenerator;
import com.alibaba.jstorm.ui.model.TableData;
import com.alibaba.jstorm.utils.NetWorkUtils;
public class SupervisorPage implements PageGenerator {
private static final Logger LOG = LoggerFactory
.getLogger(SupervisorPage.class);
public TableData getSupervisorTable(SupervisorSummary supervisorSummary,
Map<String, String> paramMap, Map<String, Object> nimbusConf) {
TableData table = new TableData();
List<String> headers = table.getHeaders();
List<Map<String, ColumnData>> lines = table.getLines();
table.setName(UIDef.SUPERVISOR.toUpperCase());
headers.add(UIDef.HOST.toUpperCase());
headers.add(UIDef.IP);
headers.add(UIDef.HEADER_UPTIME);
headers.add(UIDef.HEADER_TOTAL_PORT);
headers.add(UIDef.HEADER_USED_PORT);
headers.add(UIDef.HEADER_CONF);
headers.add(UIDef.HEADER_LOGS);
Map<String, ColumnData> line = new HashMap<String, ColumnData>();
lines.add(line);
ColumnData hostColumn = new ColumnData();
hostColumn.addText(NetWorkUtils.ip2Host(supervisorSummary.get_host()));
line.put(UIDef.HOST.toUpperCase(), hostColumn);
ColumnData ipColumn = new ColumnData();
ipColumn.addText(NetWorkUtils.host2Ip(supervisorSummary.get_host()));
line.put(UIDef.IP, ipColumn);
ColumnData uptimeColumn = new ColumnData();
int uptime = supervisorSummary.get_uptime_secs();
uptimeColumn.addText(StatBuckets.prettyUptimeStr(uptime));
line.put(UIDef.HEADER_UPTIME, uptimeColumn);
ColumnData totalPortColumn = new ColumnData();
totalPortColumn.addText(String.valueOf(supervisorSummary
.get_num_workers()));
line.put(UIDef.HEADER_TOTAL_PORT, totalPortColumn);
ColumnData usedPortColumn = new ColumnData();
usedPortColumn.addText(String.valueOf(supervisorSummary
.get_num_used_workers()));
line.put(UIDef.HEADER_USED_PORT, usedPortColumn);
ColumnData confColumn = new ColumnData();
LinkData confLink = new LinkData();
confColumn.addLinkData(confLink);
line.put(UIDef.HEADER_CONF, confColumn);
confLink.setUrl(UIDef.LINK_TABLE_PAGE);
confLink.setText(UIDef.HEADER_CONF.toLowerCase());
confLink.addParam(UIDef.CLUSTER, paramMap.get(UIDef.CLUSTER));
confLink.addParam(UIDef.PAGE_TYPE, UIDef.PAGE_TYPE_CONF);
confLink.addParam(UIDef.CONF_TYPE, UIDef.CONF_TYPE_SUPERVISOR);
confLink.addParam(UIDef.HOST,
NetWorkUtils.host2Ip(supervisorSummary.get_host()));
confLink.addParam(UIDef.PORT, String.valueOf(ConfigExtension
.getSupervisorDeamonHttpserverPort(nimbusConf)));
ColumnData logColumn = new ColumnData();
LinkData logLink = new LinkData();
logColumn.addLinkData(logLink);
line.put(UIDef.HEADER_LOGS, logColumn);
logLink.setUrl(UIDef.LINK_TABLE_PAGE);
logLink.setText(UIDef.HEADER_LOGS.toLowerCase());
logLink.addParam(UIDef.PAGE_TYPE, UIDef.PAGE_TYPE_LISTLOG);
logLink.addParam(UIDef.HOST,
NetWorkUtils.host2Ip(supervisorSummary.get_host()));
logLink.addParam(UIDef.PORT, String.valueOf(ConfigExtension
.getSupervisorDeamonHttpserverPort(nimbusConf)));
logLink.addParam(UIDef.DIR, ".");
return table;
}
public TableData getWokerTable(SupervisorWorkers supervisorWorkers,
Map<String, String> paramMap, Map<String, Object> nimbusConf) {
TableData table = new TableData();
List<String> headers = table.getHeaders();
List<Map<String, ColumnData>> lines = table.getLines();
table.setName(StringUtils.capitalize(UIDef.WOKER));
headers.add(StringUtils.capitalize(UIDef.PORT));
headers.add(UIDef.HEADER_UPTIME);
headers.add(StringUtils.capitalize(UIDef.TOPOLOGY));
headers.add(UIDef.HEADER_TASK_LIST);
headers.add(UIDef.HEADER_LOG);
headers.add(StringUtils.capitalize(UIDef.JSTACK));
List<WorkerSummary> workerSummaries = supervisorWorkers.get_workers();
if (workerSummaries == null) {
LOG.error("Failed to get workers of " + paramMap.get(UIDef.HOST));
return table;
}
int logServerPort =
ConfigExtension.getSupervisorDeamonHttpserverPort(nimbusConf);
for (WorkerSummary workerSummary : workerSummaries) {
Map<String, ColumnData> line = new HashMap<String, ColumnData>();
lines.add(line);
ColumnData portColumn = new ColumnData();
portColumn.addText(String.valueOf(workerSummary.get_port()));
line.put(StringUtils.capitalize(UIDef.PORT), portColumn);
ColumnData uptimeColumn = new ColumnData();
int uptime = workerSummary.get_uptime();
uptimeColumn.addText(StatBuckets.prettyUptimeStr(uptime));
line.put(UIDef.HEADER_UPTIME, uptimeColumn);
ColumnData topologyColumn = new ColumnData();
topologyColumn.addText(workerSummary.get_topology());
line.put(StringUtils.capitalize(UIDef.TOPOLOGY), topologyColumn);
ColumnData taskIdColumn = new ColumnData();
line.put(UIDef.HEADER_TASK_LIST, taskIdColumn);
for (TaskComponent taskComponent : workerSummary.get_tasks()) {
LinkData linkData = new LinkData();
taskIdColumn.addLinkData(linkData);
linkData.setUrl(UIDef.LINK_WINDOW_TABLE);
linkData.setText(taskComponent.get_component() + "-"
+ taskComponent.get_taskId());
linkData.addParam(UIDef.CLUSTER, paramMap.get(UIDef.CLUSTER));
linkData.addParam(UIDef.PAGE_TYPE, UIDef.PAGE_TYPE_COMPONENT);
linkData.addParam(UIDef.TOPOLOGY, workerSummary.get_topology());
linkData.addParam(UIDef.COMPONENT,
taskComponent.get_component());
}
ColumnData logColumn = new ColumnData();
LinkData logLink = new LinkData();
logColumn.addLinkData(logLink);
line.put(UIDef.HEADER_LOG, logColumn);
logLink.setUrl(UIDef.LINK_LOG);
logLink.setText(UIDef.HEADER_LOG.toLowerCase());
logLink.addParam(UIDef.CLUSTER, paramMap.get(UIDef.CLUSTER));
logLink.addParam(UIDef.PAGE_TYPE, UIDef.PAGE_TYPE_LOG);
logLink.addParam(UIDef.HOST, NetWorkUtils.host2Ip(supervisorWorkers
.get_supervisor().get_host()));
logLink.addParam(UIDef.TOPOLOGY, workerSummary.get_topology());
logLink.addParam(UIDef.PORT,
String.valueOf(workerSummary.get_port()));
logLink.addParam(UIDef.LOG_SERVER_PORT,
String.valueOf(logServerPort));
ColumnData jstackColumn = new ColumnData();
LinkData jstackLink = new LinkData();
jstackColumn.addLinkData(jstackLink);
line.put(StringUtils.capitalize(UIDef.JSTACK), jstackColumn);
jstackLink.setUrl(UIDef.LINK_TABLE_PAGE);
jstackLink.setText(UIDef.JSTACK);
jstackLink.addParam(UIDef.CLUSTER, paramMap.get(UIDef.CLUSTER));
jstackLink.addParam(UIDef.PAGE_TYPE, UIDef.PAGE_TYPE_JSTACK);
jstackLink.addParam(UIDef.HOST, supervisorWorkers.get_supervisor()
.get_host());
jstackLink.addParam(UIDef.TOPOLOGY, workerSummary.get_topology());
jstackLink.addParam(UIDef.PORT,
String.valueOf(workerSummary.get_port()));
jstackLink.addParam(UIDef.LOG_SERVER_PORT,
String.valueOf(logServerPort));
}
return table;
}
public List<TableData> getMetricsTable(SupervisorWorkers supervisorWorkers,
Map<String, String> paramMap, Map<String, Object> nimbusConf) {
Map<String, MetricInfo> metrics = supervisorWorkers.get_workerMetric();
if (metrics == null) {
LOG.error("No metrics of "
+ supervisorWorkers.get_supervisor().get_host());
return null;
}
return UIUtils.getWorkerMetricsTable(metrics,
StatBuckets.ALL_TIME_WINDOW, paramMap);
}
@Override
public Output generate(Map<String, String> paramMap) {
// TODO Auto-generated method stub
List<TableData> tables = new ArrayList<TableData>();
NimbusClient client = null;
try {
client = NimbusClientManager.getNimbusClient(paramMap);
String jsonConf = client.getClient().getNimbusConf();
Map<String, Object> nimbusConf =
(Map<String, Object>) Utils.from_json(jsonConf);
String host = paramMap.get(UIDef.HOST);
if (StringUtils.isBlank(host)) {
throw new IllegalArgumentException("Invalid parameter of host ");
}
SupervisorWorkers supervisorWorkers =
client.getClient().getSupervisorWorkers(host);
TableData supervisorTable =
getSupervisorTable(supervisorWorkers.get_supervisor(),
paramMap, nimbusConf);
tables.add(supervisorTable);
TableData workerTable =
getWokerTable(supervisorWorkers, paramMap, nimbusConf);
tables.add(workerTable);
List<TableData> metricsTables =
getMetricsTable(supervisorWorkers, paramMap, nimbusConf);
if (metricsTables != null) {
tables.addAll(metricsTables);
}
Output ret = new Output();
ret.tables = tables;
ret.rawData = "";
return ret;
} catch (Exception e) {
// TODO Auto-generated catch block
NimbusClientManager.removeClient(paramMap);
LOG.error(e.getMessage(), e);
return UIUtils.getErrorInfo(e);
}
}
}