为什么 Jetty AsyncProxyServlet 没有将所有请求都标记为 asyncStarted?
How is it that Jetty AsyncProxyServlet does not mark all the requests as asyncStarted?
我的团队正在维护一个基于 jetty-9 AsyncProxyServlet
的 API 管理代理
<jetty.version>9.4.30.v20200611</jetty.version>
我们当前的目标是提供基于 Prometheus 指标的 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(), event.getSuppliedResponse(), ProxyRequestStatus.TIMEOUT);
}
@Override
public void onError(final AsyncEvent event) {
accessLogger.log(event.getSuppliedRequest(), event.getSuppliedResponse(), 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 决定何时将请求标记或不标记为异步启动的底层机制是什么?
我的猜测是在某个地方定义了一个阈值来触发这种行为。有人可以给我们一些关于这个话题的见解吗?
作为一个附加问题,如果请求尚未异步启动,推断状态的正确方法是什么(类似于在完成、错误或超时回调中所做的)?
没关系,我想通了。
未标记为异步的请求实际上是由于合法原因(错误或缺少 API 键)而未通过过滤器链的请求
通过过滤器链,所有请求都被有效地异步处理。
我的团队正在维护一个基于 jetty-9 AsyncProxyServlet
的 API 管理代理<jetty.version>9.4.30.v20200611</jetty.version>
我们当前的目标是提供基于 Prometheus 指标的 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(), event.getSuppliedResponse(), ProxyRequestStatus.TIMEOUT);
}
@Override
public void onError(final AsyncEvent event) {
accessLogger.log(event.getSuppliedRequest(), event.getSuppliedResponse(), 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 决定何时将请求标记或不标记为异步启动的底层机制是什么?
我的猜测是在某个地方定义了一个阈值来触发这种行为。有人可以给我们一些关于这个话题的见解吗?
作为一个附加问题,如果请求尚未异步启动,推断状态的正确方法是什么(类似于在完成、错误或超时回调中所做的)?
没关系,我想通了。
未标记为异步的请求实际上是由于合法原因(错误或缺少 API 键)而未通过过滤器链的请求
通过过滤器链,所有请求都被有效地异步处理。