我似乎无法正确设置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
答案 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;
}
}