Jetty集成Prometheus Java client启动报错及请求指标不增长问题
Jetty集成Prometheus指标请求相关计数为0问题
问题现象
参照Prometheus Java客户端库的Jetty指标采集实现为Jetty服务暴露Prometheus指标时,服务初始启动抛出如下异常:
Exception in thread "main" java.lang.RuntimeException: Unable to start jetty server Caused by: java.lang.IllegalStateException: StatisticsHandler has no Wrapped Handler
为修复启动错误调整配置代码如下:
StatisticsHandler stats = new StatisticsHandler(); stats.setServer(server.getServer()); HandlerWrapper hw = new HandlerWrapper(); stats.setHandler(hw); new JettyStatisticsCollector(stats).register(); contextCollectionHandler.addHandler(stats); server.setHandler(contextCollectionHandler); try { server.start(); } catch (final Exception e) { throw new RuntimeException("Unable to start jetty server", e); }
调整后服务可正常启动,发起请求可正常收到200、404等响应,但jetty_requests_total、jetty_responses_total等请求相关指标始终为0无增长,仅jetty_stats_seconds指标数值正常变化。
问题根因
- 启动报错的修复逻辑错误:
StatisticsHandler是Jetty提供的包装型请求统计处理器,必须将实际处理业务请求的Handler链设置为它的子Handler,才能拦截所有经过的请求,完成请求、响应相关维度的指标统计。 - 当前代码给
StatisticsHandler设置的子Handler是空的HandlerWrapper实例,没有包裹实际承载业务路由的contextCollectionHandler,所有业务请求不会经过StatisticsHandler的统计逻辑,因此请求数、响应数这类依赖请求流转的指标始终为0。 jetty_stats_seconds仅依赖StatisticsHandler自身的启动时长计算,不需要拦截请求即可正常更新,因此该指标数值表现正常。
修复方案
调整Handler嵌套顺序,将业务Handler链作为StatisticsHandler的子Handler,再把StatisticsHandler设置为Server的根Handler,确保所有请求都先经过统计处理器,参考代码如下:
// 初始化统计处理器 StatisticsHandler stats = new StatisticsHandler(); // 将实际处理业务的上下文Handler集合设置为统计处理器的子Handler,保证所有请求先经过统计逻辑 stats.setHandler(contextCollectionHandler); // 注册Prometheus指标采集器 new JettyStatisticsCollector(stats).register(); // 将包裹了完整业务链路的统计处理器设置为服务根Handler server.setHandler(stats); try { server.start(); } catch (final Exception e) { throw new RuntimeException("Unable to start jetty server", e); }
注意:不需要额外创建空的
HandlerWrapper实例设置给StatisticsHandler,必须保证整个业务请求处理链路都被StatisticsHandler包裹,才能采集到完整的请求相关指标。
内容的提问来源于stack exchange,提问作者Harrish A
相关产品推荐
相关产品推荐

