forked from j62/ctbrec
basic debug servlet to print thread stacks
This commit is contained in:
parent
f7b473e109
commit
e6ccb9b66c
|
@ -0,0 +1,71 @@
|
||||||
|
package ctbrec.recorder.server;
|
||||||
|
|
||||||
|
import ctbrec.Config;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.json.JSONObject;
|
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
|
import java.io.PrintWriter;
|
||||||
|
import java.io.StringWriter;
|
||||||
|
import java.net.URLDecoder;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
import java.text.MessageFormat;
|
||||||
|
|
||||||
|
import static java.nio.charset.StandardCharsets.UTF_8;
|
||||||
|
import static javax.servlet.http.HttpServletResponse.*;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
public class DebugServlet extends AbstractCtbrecServlet {
|
||||||
|
|
||||||
|
public static final String BASE_URL = "/debug";
|
||||||
|
|
||||||
|
private static final Pattern URL_PATTERN_DEBUG_STACK = Pattern.compile(BASE_URL + "/stack(/.*?)");
|
||||||
|
|
||||||
|
public DebugServlet()
|
||||||
|
{}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
|
||||||
|
String requestURI = req.getRequestURI().substring(req.getContextPath().length());
|
||||||
|
try {
|
||||||
|
// boolean authenticated = checkAuthentication(req, "");
|
||||||
|
// if (!authenticated) {
|
||||||
|
// sendResponse(resp, SC_UNAUTHORIZED, HMAC_ERROR_DOCUMENT);
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
|
||||||
|
Matcher m;
|
||||||
|
if ((m = URL_PATTERN_DEBUG_STACK.matcher(requestURI)).matches()) {
|
||||||
|
String threadUrl = URLDecoder.decode(m.group(1), UTF_8);
|
||||||
|
|
||||||
|
var stacks = Thread.getAllStackTraces();
|
||||||
|
var box = new Object() { String text = ""; };//stacks.toString();
|
||||||
|
|
||||||
|
StringWriter sw = new StringWriter();
|
||||||
|
PrintWriter pw = new PrintWriter(sw);
|
||||||
|
// e.printStackTrace(pw);
|
||||||
|
|
||||||
|
stacks.forEach((thread, stack) -> {
|
||||||
|
box.text += String.format("%s:\n", thread.getName());
|
||||||
|
var idx = 0;
|
||||||
|
for (var s : stack) {
|
||||||
|
box.text += String.format("[%d] %s\n", idx++, s.toString());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
log.debug("Stacks Request {} - {}", threadUrl, stacks);
|
||||||
|
resp.setContentType("text/plain");
|
||||||
|
sendResponse(resp, SC_OK, box.text);
|
||||||
|
} else
|
||||||
|
sendResponse(resp, SC_NOT_FOUND, "");
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error(INTERNAL_SERVER_ERROR, e);
|
||||||
|
sendResponse(resp, SC_INTERNAL_SERVER_ERROR, INTERNAL_SERVER_ERROR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -259,6 +259,10 @@ public class HttpServer {
|
||||||
holder = new ServletHolder(modelServlet);
|
holder = new ServletHolder(modelServlet);
|
||||||
defaultContext.addServlet(holder, ModelServlet.BASE_URL + "/*");
|
defaultContext.addServlet(holder, ModelServlet.BASE_URL + "/*");
|
||||||
|
|
||||||
|
DebugServlet debugServlet = new DebugServlet();
|
||||||
|
holder = new ServletHolder(debugServlet);
|
||||||
|
defaultContext.addServlet(holder, DebugServlet.BASE_URL + "/*");
|
||||||
|
|
||||||
if (this.config.getSettings().webinterface) {
|
if (this.config.getSettings().webinterface) {
|
||||||
startWebInterface(defaultContext, basicAuthContext);
|
startWebInterface(defaultContext, basicAuthContext);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue