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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -258,6 +258,10 @@ public class HttpServer {
|
|||
ModelServlet modelServlet = new ModelServlet(config);
|
||||
holder = new ServletHolder(modelServlet);
|
||||
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) {
|
||||
startWebInterface(defaultContext, basicAuthContext);
|
||||
|
|
Loading…
Reference in New Issue