Question

I can't seem to get the Metrics servlet set up correctly. It 404's. I'm using Guice 3.0, embedded Jetty 9, and Metrics 3.0.1. Here's where I set up Jetty server:

public void start() {
    //start jetty
    _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();
    guiceHandler.addEventListener(_metricsServletContextListener);
    guiceHandler.setContextPath("/rest");
    guiceHandler.addServlet(new ServletHolder(new MetricsServlet(_metricRegistry)), "/metrics");
    FilterHolder guiceFilter = new FilterHolder(_filter);
    guiceHandler.addFilter(guiceFilter, "/*", EnumSet.allOf(DispatcherType.class));
    handlers.setHandlers(new Handler[]{guiceHandler, resourceHandler});
    _server.setHandler(handlers);
    _server.setDumpAfterStart(true);
    try {
        _server.start();
    }catch(Exception ex) {
        log.error("Error starting http server", ex);
        throw new RuntimeException(ex);
    }
    log.info("one id http service started, doc base: {}, URI: {}", resourceHandler.getResourceBase(), _server.getURI());
}

Here's the ContextListener extension:

public class MetricsServletContextListener extends MetricsServlet.ContextListener {
    private MetricRegistry _metricRegistry;

    public MetricsServletContextListener(MetricRegistry metricRegistry) {
        _metricRegistry = metricRegistry;
    }

    @Override
    protected MetricRegistry getMetricRegistry() {
        return _metricRegistry;
    }
}

If I hit http://localhost:8080/rest/metrics, it 404's. see in the jetty startup logs, that the servlet got created, and seems to be up:

 += org.eclipse.jetty.server.handler.HandlerList@766adae2 - STARTED
 |   += o.e.j.s.ServletContextHandler@478e3145{/rest,null,AVAILABLE} - STARTED
 |   |   += org.eclipse.jetty.servlet.ServletHandler@40542fa7 - STARTED
 |   |   |   += com.codahale.metrics.servlets.MetricsServlet- 299abf92@b8bee068==com.codahale.metrics.servlets.MetricsServlet,-1,true - STARTED
 |   |   |   +- [/metrics]=>com.codahale.metrics.servlets.MetricsServlet-299abf92
 |   |   |   += com.google.inject.servlet.GuiceFilter-5baef385 - STARTED
Était-ce utile?

La solution

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;
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top