1
0
Fork 0
mirror of https://github.com/overleaf/overleaf.git synced 2025-04-11 07:25:13 +00:00

Add http endpoint to print out native memory diagnostics

This commit is contained in:
Simon Detheridge 2021-06-23 12:43:30 +01:00
parent f51b8139e9
commit ad8fafc5b4
2 changed files with 72 additions and 0 deletions
services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server

View file

@ -0,0 +1,71 @@
package uk.ac.ic.wlgitbridge.server;
import org.eclipse.jetty.server.HttpConnection;
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.handler.AbstractHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import uk.ac.ic.wlgitbridge.bridge.Bridge;
import uk.ac.ic.wlgitbridge.util.Log;
import javax.management.JMException;
import javax.management.ObjectName;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.Writer;
import java.lang.management.ManagementFactory;
public class DiagnosticsHandler extends AbstractHandler {
public DiagnosticsHandler() {
}
@Override
public void handle(
String target,
Request baseRequest,
HttpServletRequest request,
HttpServletResponse response
) throws IOException, ServletException {
String method = baseRequest.getMethod();
if (
("GET".equals(method))
&& target != null
&& target.matches("^/diags/?$")
) {
baseRequest.setHandled(true);
Log.info(method + " <- /diags");
String detail;
String summary;
try {
detail = execute("vmNativeMemory", "detail");
summary = execute("vmNativeMemory", "summary");
} catch(JMException e) {
Log.error("Failed to get native memory detail: " + e.getMessage());
response.setStatus(500);
return;
}
response.setContentType("text/plain");
response.setStatus(200);
response.getWriter().write(summary);
response.getWriter().write("\n----------\n\n");
response.getWriter().write(detail);
response.getWriter().flush();
}
}
public static String execute(String command, String... args) throws JMException {
return (String) ManagementFactory.getPlatformMBeanServer().invoke(
new ObjectName("com.sun.management:type=DiagnosticCommand"),
command,
new Object[]{args},
new String[]{"[Ljava.lang.String;"});
}
}

View file

@ -128,6 +128,7 @@ public class GitBridgeServer {
handlers.addHandler(new HealthCheckHandler(bridge));
handlers.addHandler(new GitLfsHandler(bridge));
handlers.addHandler(new PrometheusHandler());
handlers.addHandler(new DiagnosticsHandler());
base.setHandler(handlers);
return base;
}