basic debug servlet to print thread stacks

This commit is contained in:
reusedname 2024-11-14 23:16:42 +05:00
parent f7b473e109
commit e6ccb9b66c
2 changed files with 75 additions and 0 deletions

View File

@ -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);
}
}
}

View File

@ -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);