I am using Spring WebFlux
in my project. I want to create an interceptor to calculate the time taken by each API. In Spring MVC
we have HandlerInterceptor
which is not present in spring-boot-starter-webflux
. I tried adding spring-boot-starter-web
and wrote my interceptor but it didn't work. Here is the code:
@Component
public class TimeInterceptor implements HandlerInterceptor {
public static Logger logger = Logger.getLogger(TimeInterceptor.class);
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
long startTime = System.currentTimeMillis();
request.setAttribute("startTime", startTime);
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
long totaltime = System.currentTimeMillis() - (long) request.getAttribute("startTime");
request.setAttribute("totaltime", totaltime);
logger.info("Logging total time" + totaltime);
}
...
...
I want to add similar functionality to my application and intercept time taken by each call.
Thanks in advance.
If you want to handle a request when it starts and when it completes, you can use WebFilter.
Try something like this
When request processing is start all defined filters called. Mono is returned from filter. It indicates when request processing is complete.
There is no concept of
HandlerInterceptor
in Spring WebFlux, but you can use your ownWebFilter
for that instead.The feature you're describing sounds a lot like the metrics support provided by Actuator and Micrometer. If you'd like to try it:
metrics
)"/actuator/metrics
and select the metric for server HTTP requests (see the reference documentation).Micrometer offers way more and helps you to get your metrics right, like: taking into account GC pauses when measuring time, providing histograms/percentiles/..., and more.
Note: adding
spring-boot-starter-web
to your application will turn it into a Spring MVC application.