Jetty AsyncProxyServlet没有将所有请求都标记为asyncStarted怎么办?

问题描述

我的团队正在维护基于jetty-9 AsyncProxyServlet的API管理代理

<jetty.version>9.4.30.v20200611</jetty.version>

我们当前的目标是根据普罗米修斯指标提供SLO监控器

到目前为止,我们已经使用自定义AsyncListener

实现了计数器

这是侦听器代码

@AllArgsConstructor
class AccessLogAsyncListener implements AsyncListener {

    private final AccessLogger accessLogger;

    @Override
    public void onComplete(final AsyncEvent event) {
        accessLogger.log(event.getSuppliedRequest(),event.getSuppliedResponse(),ProxyRequestStatus.SUCCESS);
    }

    @Override
    public void onTimeout(final AsyncEvent event) {
        accessLogger.log(event.getSuppliedRequest(),ProxyRequestStatus.TIMEOUT);
    }

    @Override
    public void onError(final AsyncEvent event) {
        accessLogger.log(event.getSuppliedRequest(),ProxyRequestStatus.ERROR);
    }

    @Override
    public void onStartAsync(final AsyncEvent event) {
    }

}

根据请求状态递增专用计数器

使用以下代码将侦听器添加到servlet过滤器中

    @Override
    public void doFilter(final ServletRequest request,final ServletResponse response,final FilterChain chain) throws IOException,servletexception {
        chain.doFilter(request,response);
        if (request.isAsyncStarted()) {
            request.getAsyncContext().addListener(accessLogAsyncListener);
        } else {
            accessLogger.log(request,response,ProxyRequestStatus.UNKNowN);
        }
    }

当工作负载开始达到大约2k req / 30s时,我们得到相当多的计数器,它们的状态为UNKNowN(这意味着该请求未标记为asyncStarted)正在增加。 4k req / 30s时,比率约为13-15%。

我的问题是:什么使Jetty决定何时将请求标记为异步启动或不标记为异步启动?

我的猜测是,某个地方定义了一个阈值,可以触发这种行为。有人可以给我们一些关于该主题的见解吗?

还有一个问题,如果未异步启动请求,推断状态的正确方法是什么(类似于在complete,error或timeout回调中完成的工作)?

解决方法

没关系,我想通了。

未标记为异步的请求实际上是由于正当理由(错误或缺少API密钥)未通过过滤器链的请求

通过过滤器链的所有请求均得到有效的异步处理。