从Jetty 11迁移至Jetty 12:StatisticsHandler缺失方法咨询
1. 缺失方法被移除的原因
Jetty 12对核心Handler架构和统计模型做了大幅重构,核心目标是统一请求处理流程、简化API并适配Servlet 6.0规范。你提到的getDispatched*、getAsync*等方法被移除,主要原因有两点:
- 统计模型的整合与简化:Jetty 10/11的StatisticsHandler暴露的内部统计项过于零散,部分指标的定义和Jetty 12新的请求生命周期模型不匹配。比如原
Dispatched系列指标针对旧的线程调度模型设计,而Jetty 12采用了更通用的任务执行框架,这类细分指标的语义已不再清晰。 - 异步请求处理的架构调整:Jetty 12重新设计了异步请求的管理逻辑,原
AsyncRequests系列指标的统计维度被整合到更通用的请求状态统计中,旧方法的存在会破坏新API的一致性。
虽然Issue #10555提到要重新引入完整统计集,但目前官方优先保证核心架构的稳定性,部分缺失方法的恢复被延后。
2. 替代方案
针对你依赖Prometheus JettyStatisticsCollector的场景,可采用以下方案:
方案一:自定义统计逻辑适配Jetty 12
- 补充异步请求统计:通过注册
AsyncListener或ServletRequestListener,在异步请求的创建、等待、完成等阶段手动统计getAsyncRequests、getAsyncDispatches等指标。 - 恢复响应字节统计:实现自定义的
HttpServletResponseWrapper,在write方法中累加响应字节数,替代getResponsesBytesTotal。 - 重构Dispatched相关指标:利用Jetty 12
StatisticsHandler提供的getRequestsActive()、getRequestsTotal()等基础方法,结合线程池统计(QueuedThreadPool的getQueueSize、getActiveThreads)推导近似的Dispatched系列指标。
方案二:扩展StatisticsHandler自行实现缺失方法
继承Jetty 12的StatisticsHandler,通过访问其内部的Statistics实例(需注意Jetty内部API的兼容性),自行实现缺失的统计方法。例如:
public class ExtendedStatisticsHandler extends StatisticsHandler { public long getDispatched() { return getStatistics().getRequestsTotal(); } // 其他缺失方法的实现,根据内部统计数据推导或补充 }
之后将你的Web应用使用的Handler替换为这个扩展类,保持原有Prometheus Collector的代码逻辑不变。
方案三:修改Prometheus Collector适配Jetty 12
由于io.prometheus:simpleclient_jetty已停止维护,可自行fork该项目或复制JettyStatisticsCollector代码,将其中依赖旧方法的逻辑替换为Jetty 12的可用API或自定义统计逻辑。例如用getRequestsActive()替代getDispatchedActive,用自定义的响应字节统计替代getResponsesBytesTotal。
方案四:等待官方更新
虽然目前client_java尚未迁移JettyStatisticsCollector,但Jetty官方后续版本大概率会恢复部分核心统计方法(参考Issue #10555的规划),可关注Jetty和Prometheus Client Java的版本更新。
内容的提问来源于stack exchange,提问作者Lesiak

