From 720627ae953e5aba6080f1083ba5ad0588f27142 Mon Sep 17 00:00:00 2001 From: Bjørn Christian Seime Date: Thu, 18 May 2017 12:39:36 +0200 Subject: Add support for inspecting Jetty metrics through JMX --- .../jdisc/http/server/jetty/JettyHttpServer.java | 27 ++++++++++++++++++++++ .../configdefinitions/jdisc.http.server.def | 6 +++++ 2 files changed, 33 insertions(+) (limited to 'jdisc_http_service/src') diff --git a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/JettyHttpServer.java b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/JettyHttpServer.java index 837f21519f2..16600edec7f 100644 --- a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/JettyHttpServer.java +++ b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/server/jetty/JettyHttpServer.java @@ -15,6 +15,8 @@ import com.yahoo.jdisc.http.server.FilterBindings; import com.yahoo.jdisc.service.AbstractServerProvider; import com.yahoo.jdisc.service.CurrentContainer; import org.eclipse.jetty.http.HttpField; +import org.eclipse.jetty.jmx.ConnectorServer; +import org.eclipse.jetty.jmx.MBeanContainer; import org.eclipse.jetty.server.Connector; import org.eclipse.jetty.server.Handler; import org.eclipse.jetty.server.RequestLog; @@ -37,8 +39,11 @@ import org.osgi.framework.BundleContext; import org.osgi.framework.InvalidSyntaxException; import org.osgi.framework.ServiceReference; +import javax.management.remote.JMXServiceURL; import javax.servlet.DispatcherType; +import java.lang.management.ManagementFactory; import java.net.BindException; +import java.net.MalformedURLException; import java.nio.channels.FileChannel; import java.nio.channels.ServerSocketChannel; import java.nio.file.Path; @@ -138,6 +143,7 @@ public class JettyHttpServer extends AbstractServerProvider { initializeJettyLogging(); server = new Server(); + setupJmx(server, serverConfig); ((QueuedThreadPool)server.getThreadPool()).setMaxThreads(serverConfig.maxWorkerThreads()); Map keyStoreChannels = getKeyStoreFileChannels(osgiFramework.bundleContext()); @@ -193,6 +199,27 @@ public class JettyHttpServer extends AbstractServerProvider { } } + private static void setupJmx(Server server, ServerConfig serverConfig) { + if (serverConfig.jmx().enabled()) { + System.setProperty("java.rmi.server.hostname", "localhost"); + server.addBean( + new MBeanContainer(ManagementFactory.getPlatformMBeanServer())); + server.addBean( + new ConnectorServer( + createJmxLoopbackOnlyServiceUrl(serverConfig.jmx().listenPort()), + "org.eclipse.jetty.jmx:name=rmiconnectorserver")); + } + } + + private static JMXServiceURL createJmxLoopbackOnlyServiceUrl(int port) { + try { + return new JMXServiceURL( + "rmi", "localhost", port, "/jndi/rmi://localhost:" + port + "/jmxrmi"); + } catch (MalformedURLException e) { + throw new RuntimeException(e); + } + } + private HandlerCollection getHandlerCollection( ServerConfig serverConfig, ServletPathsConfig servletPathsConfig, diff --git a/jdisc_http_service/src/main/resources/configdefinitions/jdisc.http.server.def b/jdisc_http_service/src/main/resources/configdefinitions/jdisc.http.server.def index 01206869862..006a6726a90 100644 --- a/jdisc_http_service/src/main/resources/configdefinitions/jdisc.http.server.def +++ b/jdisc_http_service/src/main/resources/configdefinitions/jdisc.http.server.def @@ -26,3 +26,9 @@ filter[].binding string # Max number of threads in pool maxWorkerThreads int default = 200 + +# Enable embedded JMX server. Note: only accessible through the loopback interface. +jmx.enabled bool default = false + +# Listen port for the JMX server. +jmx.listenPort int default = 1099 -- cgit v1.2.3