RequestMonitor.java 2.04 KB
package com.infoloop.tianting.intercepter;

import com.infoloop.tianting.utils.RequestUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.time.Instant;

@Slf4j
@SuppressWarnings("all")
public class RequestMonitor implements HandlerInterceptor {

    private static final String REQUEST_TIME_ATTRIBUTE = "requestedAt";

    @Override
    public boolean preHandle(final HttpServletRequest request,
                             final HttpServletResponse response,
                             final Object handler) {
        boolean isHandler = handler instanceof HandlerMethod;
        if (!isHandler) {
            return true;
        }
        request.setAttribute(REQUEST_TIME_ATTRIBUTE, Instant.now());
        final var queryParams = RequestUtil.getFormParameters(request);
        final var logMessage = new StringBuilder();
        logMessage.append("start to process ").append(request.getMethod()).append(":").append(request.getRequestURI());
        if (!queryParams.isEmpty()) {
            String param = RequestUtil.joinParams(queryParams);
            logMessage.append("?").append(param);
        }
        log.info(logMessage.toString());
        return true;
    }

    @Override
    public void postHandle(final HttpServletRequest request,
                           final HttpServletResponse response,
                           final Object handler,
                           final ModelAndView modelAndView) {
        boolean isHandler = handler instanceof HandlerMethod;
        if (!isHandler) {
            return;
        }
        final var requestTime = (Instant) request.getAttribute(REQUEST_TIME_ATTRIBUTE);
        log.info("took {}ms to process {}:{}. status: {}", Instant.now().toEpochMilli() - requestTime.toEpochMilli(), request.getMethod(), request.getRequestURI(), response.getStatus());
    }
}