blob: 6fd7ec8f3a1738f3f4873788167ca18381c8c603 [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.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import org.apache.commons.lang.StringUtils;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import backtype.storm.utils.NimbusClient;
import backtype.storm.utils.Utils;
import com.alibaba.jstorm.client.ConfigExtension;
import com.alibaba.jstorm.cluster.Common;
import com.alibaba.jstorm.ui.NimbusClientManager;
import com.alibaba.jstorm.ui.UIDef;
import com.alibaba.jstorm.ui.UIMetrics;
import com.alibaba.jstorm.ui.UIUtils;
import com.alibaba.jstorm.ui.model.LinkData;
import com.alibaba.jstorm.ui.model.PageIndex;
import com.alibaba.jstorm.utils.HttpserverUtils;
import com.alibaba.jstorm.utils.JStormUtils;
import com.alibaba.jstorm.utils.NetWorkUtils;
@ManagedBean(name = "logpage")
@ViewScoped
public class LogPage implements Serializable {
private static final long serialVersionUID = 4326599394273506083L;
private static final Logger LOG = LoggerFactory.getLogger(LogPage.class);
/**
* proxy url, which call the log service on the task node.
*/
private static final String PROXY_URL = "http://%s:%s/logview?%s=%s&log=%s";
/**
* store the log content.
*/
private String log = "";
private List<PageIndex> pages = new ArrayList<PageIndex>();
protected Map<String, String> paramMap;
protected LogPage.Event event;
protected Map<String, Object> conf;
public LogPage() throws Exception {
FacesContext ctx = FacesContext.getCurrentInstance();
paramMap = ctx.getExternalContext().getRequestParameterMap();
init();
}
public LogPage(Map<String, String> paramMap) throws Exception {
this.paramMap = paramMap;
init();
}
private void init() throws Exception {
long start = System.nanoTime();
try {
event = new LogPage.Event(paramMap);
conf = getNimbusConf();
// proxy call
queryLog(event);
} catch (Exception e) {
LOG.error(e.getMessage(), e);
throw e;
}finally {
long end = System.nanoTime();
UIMetrics.updateHistorgram(this.getClass().getSimpleName(), (end - start)/1000000.0d);
}
}
private Map<String, Object> getNimbusConf() {
NimbusClient client = null;
try {
client = NimbusClientManager.getNimbusClient(paramMap);
String jsonConf = client.getClient().getNimbusConf();
Map<String, Object> nimbusConf =
(Map<String, Object>) Utils.from_json(jsonConf);
return nimbusConf;
} catch (Exception e) {
NimbusClientManager.removeClient(paramMap);
LOG.error(e.getMessage(), e);
return UIUtils.readUiConfig();
}
}
/**
* proxy query log for the specified task.
*
* @param task the specified task
* @throws IOException
* @throws ClientProtocolException
*/
private void queryLog(LogPage.Event event) throws ClientProtocolException,
IOException {
// PROXY_URL = "http://%s:%s/logview?%s=%s&log=%s";
String baseUrl =
String.format(PROXY_URL, NetWorkUtils.host2Ip(event.host),
event.logServerPort,
HttpserverUtils.HTTPSERVER_LOGVIEW_PARAM_CMD,
HttpserverUtils.HTTPSERVER_LOGVIEW_PARAM_CMD_SHOW,
event.logName);
String url = baseUrl;
if (event.pos != null) {
url +=
("&" + HttpserverUtils.HTTPSERVER_LOGVIEW_PARAM_POS + "=" + event.pos);
}
// 1. proxy call the task host log view service
HttpClient client = HttpClientBuilder.create().build();
HttpPost post = new HttpPost(url);
HttpResponse response = client.execute(post);
// 2. check the request is success, then read the log
if (response.getStatusLine().getStatusCode() == 200) {
String data =
EntityUtils.toString(response.getEntity(),
ConfigExtension.getLogViewEncoding(conf));
String sizeStr = data.substring(0, 16);
PageIndex.Event pageIndexEvent = new PageIndex.Event();
pageIndexEvent.totalSize = Long.valueOf(sizeStr);
pageIndexEvent.pos = JStormUtils.parseLong(event.pos, pageIndexEvent.totalSize > 0 ? pageIndexEvent.totalSize - 1: 0);
pageIndexEvent.pageSize = ConfigExtension.getLogPageSize(conf);
pageIndexEvent.url = UIDef.LINK_LOG;
pageIndexEvent.paramMap = event.toMap();
pages = PageIndex.generatePageIndex(pageIndexEvent);
setLog(data);
} else {
setLog(EntityUtils.toString(response.getEntity()));
}
}
public static class Event implements Serializable {
public final String clusterName;
public final String host;
public final String logServerPort;
public String logName;
public final String topologyId;
public final String workerPort;
public final String pos;
public Event(Map<String, String> paramMap) {
clusterName = paramMap.get(UIDef.CLUSTER);
host = paramMap.get(UIDef.HOST);
logServerPort = paramMap.get(UIDef.LOG_SERVER_PORT);
logName = paramMap.get(UIDef.LOG_NAME);
topologyId = paramMap.get(UIDef.TOPOLOGY);
workerPort = paramMap.get(UIDef.PORT);
pos = paramMap.get(UIDef.POS);
if (host == null) {
throw new IllegalArgumentException("Please set host");
} else if (logServerPort == null) {
throw new IllegalArgumentException(
"Please set log server's port");
}
if (StringUtils.isBlank(logName) == false) {
return;
}
if (topologyId == null || workerPort == null) {
throw new IllegalArgumentException(
"Please set log fileName or topologyId-workerPort");
}
String topologyName;
try {
topologyName = Common.topologyIdToName(topologyId);
} catch (Exception e) {
// TODO Auto-generated catch block
throw new IllegalArgumentException(
"Please set log fileName or topologyId-workerPort");
}
logName = topologyName + "-worker-" + workerPort + ".log";
}
public Map<String, String> toMap() {
Map<String, String> paramMap = new HashMap<String, String>();
paramMap.put(UIDef.CLUSTER, clusterName);
paramMap.put(UIDef.HOST, host);
paramMap.put(UIDef.LOG_SERVER_PORT, logServerPort);
paramMap.put(UIDef.LOG_NAME, logName);
paramMap.put(UIDef.POS, pos);
return paramMap;
}
public String getClusterName() {
return clusterName;
}
public String getHost() {
return host;
}
public String getLogServerPort() {
return logServerPort;
}
public String getLogName() {
return logName;
}
public String getTopologyId() {
return topologyId;
}
public String getWorkerPort() {
return workerPort;
}
public String getPos() {
return pos;
}
}
public String getLog() {
return log;
}
public void setLog(String log) {
this.log = log;
}
public List<PageIndex> getPages() {
return pages;
}
public Event getEvent() {
return event;
}
public Map<String, Object> getConf() {
return conf;
}
public static void main() {
}
}