I have an embedded jetty application. I intent to monitor threads, which threads are running(by Id) , which are pending/exited with error and which ones have completed. In the end I want to push these stats to a web client as json string (might use Graphite ...but not decided on it yet)
I have just stumbled on Metrics, and I think I it could do what I want. The problem is I seem not able to Instrument my Jetty properly(am using V3.0.0BETA2). In the main class this is what am doing:
Server server = new Server(Integer.valueOf(webPort));
ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
context.setAttribute("com.yammer.metrics.servlets.AdminServlet.registry", metrics);
context.setContextPath("/");
context.addServlet(TestServlet.class, "/test");
context.addServlet(AdminServlet.class, "/threads");
HandlerCollection handlers = new HandlerCollection();
handlers.setHandlers(new Handler[]{context});
server.setHandler(handlers);
On the servlet:
final LoggerContext factory = (LoggerContext) LoggerFactory.getILoggerFactory();
final Logger root = factory.getLogger(Logger.ROOT_LOGGER_NAME);
MetricRegistry metrics;
@Override
public void init() throws ServletException {
super.init();
metrics = metricRegistry(this.getServletContext());
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
SecureRandom random = new SecureRandom();
byte bytes[] = new byte[20];
random.nextBytes(bytes);
System.out.println(req.getSession().getId() + " :Waiting..." + UUID.nameUUIDFromBytes(bytes));
req.getRequestDispatcher("./src/webapp/index.html").forward(req, resp);
}
public MetricRegistry metricRegistry(ServletContext servletContext) {
MetricRegistry metrics = new MetricRegistry();
// healthChecks.register("java", new ThreadDeadlockHealthCheck());
metrics.registerAll(new GarbageCollectorMetricSet());
metrics.registerAll(new JvmAttributeGaugeSet());
metrics.registerAll(new MemoryUsageGaugeSet());
metrics.registerAll(new ThreadStatesGaugeSet());
LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
ch.qos.logback.classic.Logger rootLogger = loggerContext.getLogger(Logger.ROOT_LOGGER_NAME);
ConsoleReporter reporter2 = ConsoleReporter.forRegistry(metrics)
.convertRatesTo(TimeUnit.SECONDS)
.convertDurationsTo(TimeUnit.MILLISECONDS)
.build();
reporter2.start(1, TimeUnit.MINUTES);
// final Slf4jReporter reporter = Slf4jReporter.forRegistry(metrics)
// .outputTo(LoggerFactory.getLogger(AdminServlet.class)).build();
// reporter.start(10, TimeUnit.SECONDS);
return metrics;
}
This is obviously not working, as I keep getting this error:
javax.servlet.ServletException: Couldn't find a HealthCheckRegistry instance.
at com.codahale.metrics.servlets.HealthCheckServlet.init(HealthCheckServlet.java:37) ~[metrics-servlets-3.0.0-BETA2.jar:na]
at com.codahale.metrics.servlets.AdminServlet.init(AdminServlet.java:49) ~[metrics-servlets-3.0.0-BETA2.jar:na]