diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/DiagnosticsHandler.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/DiagnosticsHandler.java new file mode 100644 index 0000000000..4ff339de9e --- /dev/null +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/DiagnosticsHandler.java @@ -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;"}); + } +} diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/GitBridgeServer.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/GitBridgeServer.java index 6c0a32f71c..7cbf50c277 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/GitBridgeServer.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/GitBridgeServer.java @@ -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; }