|
@@ -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;
|
|
|
}
|
|
|
|