package de.otto.edison.metrics.http; import com.codahale.metrics.MetricRegistry; import com.codahale.metrics.Timer; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** * A filter that records some metrics: * - Counting http requests for different methods and status * - Measuring response rates and times for different methods * * Created by guido on 08.06.16. * @since 0.60.0 */ @Component public class HttpMetricsFilter implements Filter { private final MetricRegistry metricRegistry; @Autowired public HttpMetricsFilter(final MetricRegistry metricRegistry) { this.metricRegistry = metricRegistry; } @Override public void init(final FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(final ServletRequest request, final ServletResponse response, FilterChain chain) throws IOException, ServletException { final String method = ((HttpServletRequest) request).getMethod().toLowerCase(); final Timer.Context context = metricRegistry.timer("timer.http." + method).time(); try { chain.doFilter(request, response); } finally { if (response != null) { final int status = ((HttpServletResponse) response).getStatus(); metricRegistry.counter("counter.http." + method + "." + status).inc(); context.stop(); } } } @Override public void destroy() { } }