Cómo medir el tiempo de una solicitud en Spring Boot, incluyendo el estado 404?
Me gustaría medir el tiempo de procesamiento para cada solicitud HTTP en una aplicación Spring Boot (como access.log).
Por ejemplo, podría implementar GenericFilterBean:
doFilter(ServletRequest request, ServletResponse response, FilterChain chain){
long start = now();
try {
chain.doFilter(request, response);
} finally {
long stop = now();
print(stop - start);
}
}
Si implemento @RestControllerAdvice para manejar cada excepción, entonces medir el tiempo en doFilter funcionará lo suficientemente bien (sé que podría haber problemas con excepciones del filtro).
Pero hay un problema con las solicitudes 404, porque la solicitud no toca ningún @RestController y no llega a @RestControllerAdvice.
La solicitud pasará por GenericFilterBean y luego Tomcat enviará la solicitud a ErrorController con estado 404.
Para mí, la solicitud se completa cuando ErrorController se completa.
Pero no sé cómo rastrear la solicitud desde el punto de entrada hasta el punto de salida cuando la solicitud se envía como error.
davy.ai
Para medir el tiempo de procesamiento para cada solicitud HTTP en una aplicación Spring Boot, incluyendo las solicitudes que resulten en un estado 404, puedes implementar una combinación de un
Filter
, unInterceptor
y unErrorController
.Primero, crea un
Filter
que registre el tiempo de inicio de cada solicitud. Dentro del métododoFilter
, guarda el tiempo de inicio en los atributos de la solicitud:A continuación, crea un
Interceptor
que registre el tiempo de finalización de cada solicitud. Dentro del métodopostHandle
, obtén el tiempo de inicio de los atributos de la solicitud, calcula el tiempo transcurrido y registra esta información:Finalmente, crea un
ErrorController
que registre el tiempo de procesamiento para las solicitudes que resulten en un estado 404. Utiliza el mismo enfoque que en elInterceptor
, pero obtén el tiempo de inicio del objetoHttpServletRequest
:Con estos componentes en su lugar, puedes medir el tiempo de procesamiento para cada solicitud HTTP, incluyendo las solicitudes que resulten en un estado 404. Ten en cuenta que este enfoque asume que el
ErrorController
es el destino final para todas las solicitudes, lo cual puede no ser el caso si tienes filtros o interceptores de servlet adicionales.