dnet-applications/apps/dhp-broker-application/src/main/java/eu/dnetlib/broker/metrics/RequestTimingInterceptor.java

48 lines
1.7 KiB
Java

package eu.dnetlib.broker.metrics;
import java.lang.reflect.Method;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import io.prometheus.client.Summary;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
@Component
public class RequestTimingInterceptor extends HandlerInterceptorAdapter implements MetricInterceptor {
private static final String REQ_PARAM_TIMING = "timing";
private static final Summary responseTimeInMs = Summary
.build()
.name("http_response_time_milliseconds")
.labelNames("method", "handler", "status")
.help("Request completed time in milliseconds")
.register();
@Override
public boolean preHandle(final HttpServletRequest request, final HttpServletResponse response, final Object handler) throws Exception {
request.setAttribute(REQ_PARAM_TIMING, System.currentTimeMillis());
return true;
}
@Override
public void afterCompletion(final HttpServletRequest request, final HttpServletResponse response, final Object handler, final Exception ex) throws Exception {
final Long timingAttr = (Long) request.getAttribute(REQ_PARAM_TIMING);
final long completedTime = System.currentTimeMillis() - timingAttr;
String handlerLabel = handler.toString();
// get short form of handler method name
if (handler instanceof HandlerMethod) {
Method method = ((HandlerMethod) handler).getMethod();
handlerLabel = method.getDeclaringClass().getSimpleName() + "." + method.getName();
}
responseTimeInMs.labels(
request.getMethod(),
handlerLabel,
Integer.toString(response.getStatus())).observe(completedTime);
}
}