Adding the MetricsServlet to it's own ServletContextHandler, and registering an implementation of MetricsServlet.ContextListener fixed it.
_server = new Server(_port);
ResourceHandler resourceHandler = new ResourceHandler();
resourceHandler.setDirectoriesListed(true);
resourceHandler.setWelcomeFiles(new String[]{"index.html"});
resourceHandler.setResourceBase(".");
HandlerList handlers = new HandlerList();
ServletContextHandler guiceHandler = new ServletContextHandler();
ServletContextHandler metricsContextHandler = new ServletContextHandler();
metricsContextHandler.setContextPath("/one/metrics");
metricsContextHandler.addEventListener(new MyMetricsServletContextListener(_metricRegistry));
metricsContextHandler.addServlet(MetricsServlet.class, "/registry");
guiceHandler.setContextPath("/one/id");
try {
FilterHolder guiceFilter = new FilterHolder(_filter);
guiceHandler.addFilter(guiceFilter, "/*", EnumSet.allOf(DispatcherType.class));
handlers.setHandlers(new Handler[]{metricsContextHandler, guiceHandler, resourceHandler});
_server.setHandler(handlers);
_server.setDumpAfterStart(true);
_server.start();
}catch(Exception ex) {
log.error("Error starting http server", ex);
throw new RuntimeException(ex);
}
The MetricsServlet.ContextListener implementation (registry is provided via guice binding):
private static class MyMetricsServletContextListener extends MetricsServlet.ContextListener {
private MetricRegistry _metricRegistry;
public MyMetricsServletContextListener(MetricRegistry metricRegistry) {
_metricRegistry = metricRegistry;
}
@Override
protected MetricRegistry getMetricRegistry() {
return _metricRegistry;
}
}