WANG 6 лет назад
Родитель
Сommit
cade10f90b

+ 24 - 6
src/main/java/cn/com/qmth/examcloud/web/interceptor/StatisticInterceptor.java

@@ -14,6 +14,9 @@ import com.codahale.metrics.ConsoleReporter;
 import com.codahale.metrics.Meter;
 import com.codahale.metrics.MetricRegistry;
 
+import cn.com.qmth.examcloud.web.enums.HttpServletRequestAttribute;
+import cn.com.qmth.examcloud.web.support.ApiInfo;
+
 /**
  * 统计拦截器
  *
@@ -23,7 +26,7 @@ import com.codahale.metrics.MetricRegistry;
  */
 public class StatisticInterceptor implements HandlerInterceptor {
 
-	private Map<String, Meter> metricMap = new HashMap<>();
+	private Map<ApiInfo, Meter> meterMap = new HashMap<>();
 
 	private MetricRegistry metrics = new MetricRegistry();
 
@@ -31,18 +34,33 @@ public class StatisticInterceptor implements HandlerInterceptor {
 			.convertDurationsTo(TimeUnit.MILLISECONDS).build();
 
 	public StatisticInterceptor() {
-		metricMap.put("/", metrics.meter("/"));
 		reporter.start(1, TimeUnit.SECONDS);// 1s报道一次
 	}
 
 	@Override
 	public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
 			Object handler) throws Exception {
-		String servletPath = request.getServletPath();
-		if (metricMap.containsKey(servletPath)) {
-			metricMap.get(servletPath).mark();// 统计tps
+
+		ApiInfo apiInfo = (ApiInfo) request
+				.getAttribute(HttpServletRequestAttribute.$_API_INFO.name());
+
+		if (null == apiInfo) {
+			return true;
 		}
-		reporter.report();
+
+		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);
+				}
+			}
+		}
+
+		meter.mark();
+
 		return true;
 	}