client_java
client_java copied to clipboard
Add support for async requests in MetricsFilter
It seems to me that MetricsFilter currently does not support async requests, it reports very low times which I guess are only limited to the time the initial request is answered.
I'm still searching about it, but seems like it could be solved something like this:
boolean isAsync = false;
try {
filterChain.doFilter(servletRequest, servletResponse);
isAsync = servletRequest.isAsyncStarted();
if (isAsync) {
servletRequest.getAsyncContext().addListener(new AsyncListener() {
volatile boolean done = false;
private void meter() {
if (!done) {
timer.observeDuration();
statusCounter.labels(components, method, getStatusCode(servletResponse)).inc();
done = true;
}
}
@Override public void onStartAsync(AsyncEvent asyncEvent) { }
@Override public void onComplete(AsyncEvent asyncEvent) { meter(); }
@Override public void onError(AsyncEvent asyncEvent) { meter(); }
@Override public void onTimeout(AsyncEvent asyncEvent) { meter(); }
});
}
} finally {
if (!isAsync) {
timer.observeDuration();
statusCounter.labels(components, method, getStatusCode(servletResponse)).inc();
}
}