client_java icon indicating copy to clipboard operation
client_java copied to clipboard

Add support for async requests in MetricsFilter

Open lapo-luchini opened this issue 4 years ago • 1 comments

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.

lapo-luchini avatar Jul 29 '21 10:07 lapo-luchini

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();
            }
        }

lapo-luchini avatar Jul 29 '21 13:07 lapo-luchini