使用Guice和Embedded jetty配置codahale MetricsServlet

时间:2014-02-07 03:28:14

标签: servlets jetty guice embedded-jetty jersey-2.0

我似乎无法正确设置Metrics servlet。这是404的。我使用的是Guice 3.0,嵌入式Jetty 9和Metrics 3.0.1。这是我设置Jetty服务器的地方:

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());
}

这是ContextListener扩展名:

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

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

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

如果我点击了http://localhost:8080/rest/metrics,那就是404&#39}。在jetty启动日志中看到,servlet已经创建,似乎已经启动了:

 += 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

1 个答案:

答案 0 :(得分:0)

将MetricsServlet添加到它自己的ServletContextHandler中,并注册MetricsServlet.ContextListener的实现来修复它。

   _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);
    }

MetricsServlet.ContextListener实现(注册表通过guice绑定提供):

    private static class MyMetricsServletContextListener extends MetricsServlet.ContextListener {
    private MetricRegistry _metricRegistry;
    public MyMetricsServletContextListener(MetricRegistry metricRegistry) {
        _metricRegistry = metricRegistry;
    }
    @Override
    protected MetricRegistry getMetricRegistry() {
        return _metricRegistry;
    }
}