001package io.prometheus.jmx;
002
003import io.prometheus.client.exporter.MetricsServlet;
004import io.prometheus.client.hotspot.DefaultExports;
005import java.lang.instrument.Instrumentation;
006import java.io.File;
007import java.net.InetSocketAddress;
008import org.eclipse.jetty.server.Server;
009import org.eclipse.jetty.servlet.ServletContextHandler;
010import org.eclipse.jetty.servlet.ServletHolder;
011import org.eclipse.jetty.util.thread.QueuedThreadPool;
012
013public class JavaAgent {
014   static Server server;
015
016   public static void premain(String agentArgument, Instrumentation instrumentation) throws Exception {
017     String[] args = agentArgument.split(":");
018     if (args.length < 2 || args.length > 3) {
019       System.err.println("Usage: -javaagent:/path/to/JavaAgent.jar=[host:]<port>:<yaml configuration file>");
020       System.exit(1);
021     }
022
023     int port;
024     InetSocketAddress socket;
025     String file;
026
027     if (args.length == 3) {
028       port = Integer.parseInt(args[1]);
029       socket = new InetSocketAddress(args[0], port);
030       file = args[2];
031     } else {
032       port = Integer.parseInt(args[0]);
033       socket = new InetSocketAddress(port);
034       file = args[1];
035     }
036
037     new JmxCollector(new File(file)).register();
038     DefaultExports.initialize();
039
040     server = new Server(socket);
041     QueuedThreadPool pool = new QueuedThreadPool();
042     pool.setDaemon(true);
043     pool.setMaxThreads(10);
044     pool.setMaxQueued(10);
045     pool.setName("jmx_exporter");
046     server.setThreadPool(pool);
047     ServletContextHandler context = new ServletContextHandler();
048     context.setContextPath("/");
049     server.setHandler(context);
050     context.addServlet(new ServletHolder(new MetricsServlet()), "/metrics");
051     server.start();
052   }
053}