Embedded Jetty monitoring

瀏覽次數:270 次
跳到第一則未讀訊息

Moses Gone

未讀,
2013年4月28日 上午9:48:452013/4/28
收件者:metric...@googlegroups.com
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]



回覆所有人
回覆作者
轉寄
0 則新訊息