package org.quickbundle.project.test;
import java.util.Arrays;
import java.util.Enumeration;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.quickbundle.config.RmClusterConfig;
import org.quickbundle.project.RmProjectHelper;
import org.quickbundle.project.listener.RmGlobalMonitor;
import org.quickbundle.project.listener.RmRequestMonitor;
import org.quickbundle.tools.helper.RmStringHelper;
public class RmAlarmCollector {
/**
* 根据传入的msg和Throwable对象,自动采集服务器上下文信息生成标题和正文
* @param msg
* @param e
* @return new String[]{subject, content}
*/
public static String[] createInfo(Object msg, Throwable e) {
StringBuilder subject = new StringBuilder();
if(RmClusterConfig.getLocalhostInfo() != null) {
subject.append(RmClusterConfig.getLocalhostInfo().getLocalhostUrlPath());
} else {
subject.append(RmClusterConfig.getSingleton().getSelfNode().get(RmClusterConfig.NodeKey.baseUrl.name()));
}
if(subject.toString().startsWith("http://")) {
subject.delete(0, "http://".length());
}
subject.append(" ");
if(msg != null) {
if(msg.toString().length() < 200) {
subject.append(msg);
} else {
subject.append(msg.toString().substring(0, 200));
}
} else if(e != null){
subject.append(e.getMessage());
}
String br = "";//"<br/>";
StringBuilder content = new StringBuilder();
{ //系统信息
content.append("UUID: ");
content.append(RmGlobalMonitor.getShortUniqueUUID());
content.append("\n");
content.append("Thread.currentThread(): ");
content.append(Thread.currentThread().getId());
content.append(" | ");
content.append(Thread.currentThread().getName());
content.append(" | ");
content.append(Thread.currentThread().getClass().getName());
content.append(br);
content.append("\n");
}
if(msg != null) { //消息
content.append("Message: ");
content.append(msg.toString());
content.append(br);
content.append("\n\n");
}
if(e != null) { //异常
content.append("Throwable: ");
content.append(e.toString());
content.append("\n");
content.append(RmStringHelper.getStackTraceStr(e, 100000));
content.append(br);
content.append("\n\n");
}
{ //调用栈
String callStack = Arrays.deepToString(Thread.currentThread().getStackTrace());
if(callStack.length() > 100000) {
callStack = callStack.substring(0, 100000);
content.append("[stack string length:" + callStack.length() + "]");
}
content.append("Thread.getStackTrace: ");
callStack = callStack.replaceAll(", ", ",\n");
content.append(callStack);
content.append(br);
content.append("\n\n");
}
if(RmRequestMonitor.getCurrentThreadRequest() != null) { //Request信息
HttpServletRequest request = RmRequestMonitor.getCurrentThreadRequest();
content.append("request.getRequestURL: ");
content.append(request.getRequestURL());
content.append("\n");
content.append("request.getMethod: ");
content.append(request.getMethod());
content.append("\n");
content.append("request.getRemoteAddr: ");
content.append(RmProjectHelper.getIp(request));
content.append("\n\n");
content.append("request.getParameter:\n");
Enumeration enume = request.getParameterNames();
for(Object key; enume.hasMoreElements(); ) {
key = enume.nextElement();
content.append(key);
content.append(":");
content.append(Arrays.deepToString(request.getParameterValues((String)key)));
content.append("\n");
}
content.append(br);
content.append("\n\n");
content.append("request.getHeader:\n");
enume = request.getHeaderNames();
for(Object key; enume.hasMoreElements(); ) {
key = enume.nextElement();
content.append(key);
content.append(":");
content.append(request.getHeader((String)key));
content.append("\n");
}
content.append(br);
content.append("\n\n");
content.append("request.getAttribute:\n");
enume = request.getAttributeNames();
for(Object key; enume.hasMoreElements(); ) {
key = enume.nextElement();
content.append(key);
content.append(":");
content.append(request.getAttribute((String)key));
content.append("\n");
}
content.append(br);
content.append("\n\n");
HttpSession session = request.getSession(false);
if(session != null) {
content.append("session.getId: ");
content.append(session.getId());
content.append("\n");
content.append("session.getAttribute:\n");
enume = session.getAttributeNames();
for(Object key; enume.hasMoreElements(); ) {
key = enume.nextElement();
content.append(key);
content.append(":");
content.append(session.getAttribute((String)key));
content.append("\n");
}
content.append(br);
content.append("\n\n");
}
}
return new String[]{subject.toString(), content.toString()};
}
}