WANG 6 年之前
父节点
当前提交
fd38328c75

+ 6 - 1
src/main/java/cn/com/qmth/examcloud/web/enums/HttpServletRequestAttribute.java

@@ -42,6 +42,11 @@ public enum HttpServletRequestAttribute {
 	/**
 	/**
 	 * 企业顶级机构(对外服务接口)
 	 * 企业顶级机构(对外服务接口)
 	 */
 	 */
-	$_ENTERPRISE_ROOT_ORG_ID
+	$_ENTERPRISE_ROOT_ORG_ID,
+
+	/**
+	 * metrics timer context
+	 */
+	$_METRICS_TIMER_CTX
 
 
 }
 }

+ 11 - 18
src/main/java/cn/com/qmth/examcloud/web/interceptor/StatisticInterceptor.java

@@ -1,7 +1,5 @@
 package cn.com.qmth.examcloud.web.interceptor;
 package cn.com.qmth.examcloud.web.interceptor;
 
 
-import java.util.HashMap;
-import java.util.Map;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeUnit;
 
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletRequest;
@@ -10,8 +8,9 @@ import javax.servlet.http.HttpServletResponse;
 import org.springframework.web.servlet.HandlerInterceptor;
 import org.springframework.web.servlet.HandlerInterceptor;
 
 
 import com.codahale.metrics.ConsoleReporter;
 import com.codahale.metrics.ConsoleReporter;
-import com.codahale.metrics.Meter;
 import com.codahale.metrics.MetricRegistry;
 import com.codahale.metrics.MetricRegistry;
+import com.codahale.metrics.Timer;
+import com.codahale.metrics.Timer.Context;
 
 
 import cn.com.qmth.examcloud.web.enums.HttpServletRequestAttribute;
 import cn.com.qmth.examcloud.web.enums.HttpServletRequestAttribute;
 import cn.com.qmth.examcloud.web.support.ApiInfo;
 import cn.com.qmth.examcloud.web.support.ApiInfo;
@@ -25,8 +24,6 @@ import cn.com.qmth.examcloud.web.support.ApiInfo;
  */
  */
 public class StatisticInterceptor implements HandlerInterceptor {
 public class StatisticInterceptor implements HandlerInterceptor {
 
 
-	private Map<ApiInfo, Meter> meterMap = new HashMap<>();
-
 	private MetricRegistry metrics = new MetricRegistry();
 	private MetricRegistry metrics = new MetricRegistry();
 
 
 	ConsoleReporter reporter = ConsoleReporter.forRegistry(metrics).convertRatesTo(TimeUnit.SECONDS)
 	ConsoleReporter reporter = ConsoleReporter.forRegistry(metrics).convertRatesTo(TimeUnit.SECONDS)
@@ -39,31 +36,27 @@ public class StatisticInterceptor implements HandlerInterceptor {
 	@Override
 	@Override
 	public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
 	public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
 			Object handler) throws Exception {
 			Object handler) throws Exception {
+
 		ApiInfo apiInfo = (ApiInfo) request
 		ApiInfo apiInfo = (ApiInfo) request
 				.getAttribute(HttpServletRequestAttribute.$_API_INFO.name());
 				.getAttribute(HttpServletRequestAttribute.$_API_INFO.name());
+
 		if (null == apiInfo) {
 		if (null == apiInfo) {
 			return true;
 			return true;
 		}
 		}
 
 
-		Meter meter = meterMap.get(apiInfo);
-		if (null == meter) {
-			synchronized (this) {
-				meter = meterMap.get(apiInfo);
-				if (null == meter) {
-					meter = metrics.meter(apiInfo.getMapping());
-					meterMap.put(apiInfo, meter);
-				}
-			}
-		}
+		Timer timer = metrics
+				.timer(MetricRegistry.name(apiInfo.getMapping(), apiInfo.getDescription()));
+		Context ctx = timer.time();
+		request.setAttribute(HttpServletRequestAttribute.$_METRICS_TIMER_CTX.name(), ctx);
 
 
-		meter.mark();
 		return true;
 		return true;
 	}
 	}
 
 
 	@Override
 	@Override
 	public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
 	public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
 			Object handler, Exception ex) throws Exception {
 			Object handler, Exception ex) throws Exception {
-
+		Context ctx = (Context) request
+				.getAttribute(HttpServletRequestAttribute.$_METRICS_TIMER_CTX.name());
+		ctx.stop();
 	}
 	}
-
 }
 }