From 0502ba38707a91e99712158eb239ade75d545277 Mon Sep 17 00:00:00 2001 From: wenshao Date: Sun, 19 Aug 2012 10:13:21 +0800 Subject: [PATCH] improve stat --- .../druid/support/http/WebStatFilter.java | 44 ------- .../spring/stat/DruidStatInterceptor.java | 112 ++++++++++++++++-- .../support/spring/stat/SpringMethodStat.java | 69 ++++++++--- .../http/resources/js/spring-detail.js | 5 + .../support/http/resources/spring-detail.html | 16 +++ 5 files changed, 177 insertions(+), 69 deletions(-) diff --git a/src/main/java/com/alibaba/druid/support/http/WebStatFilter.java b/src/main/java/com/alibaba/druid/support/http/WebStatFilter.java index eb5033ad3d..3ffb5f6534 100644 --- a/src/main/java/com/alibaba/druid/support/http/WebStatFilter.java +++ b/src/main/java/com/alibaba/druid/support/http/WebStatFilter.java @@ -27,7 +27,6 @@ import com.alibaba.druid.support.http.stat.WebSessionStat; import com.alibaba.druid.support.http.stat.WebURIStat; import com.alibaba.druid.support.logging.Log; import com.alibaba.druid.support.logging.LogFactory; -import com.alibaba.druid.support.spring.stat.SpringMethodStat; import com.alibaba.druid.util.DruidWebUtils; import com.alibaba.druid.util.PatternMatcher; import com.alibaba.druid.util.ServletPathMatcher; @@ -375,11 +374,6 @@ public class WebStatFilter implements Filter { if (reqStat != null) { reqStat.addJdbcUpdateCount(updateCount); } - - SpringMethodStat springMethodStat = SpringMethodStat.current(); - if (springMethodStat != null) { - springMethodStat.addJdbcUpdateCount(updateCount); - } } @Override @@ -388,11 +382,6 @@ public class WebStatFilter implements Filter { if (reqStat != null) { reqStat.addJdbcFetchRowCount(fetchRowCount); } - - SpringMethodStat springMethodStat = SpringMethodStat.current(); - if (springMethodStat != null) { - springMethodStat.addJdbcFetchRowCount(fetchRowCount); - } } @Override @@ -401,11 +390,6 @@ public class WebStatFilter implements Filter { if (reqStat != null) { reqStat.incrementJdbcExecuteCount(); } - - SpringMethodStat springMethodStat = SpringMethodStat.current(); - if (springMethodStat != null) { - springMethodStat.incrementJdbcExecuteCount(); - } } @Override @@ -417,14 +401,6 @@ public class WebStatFilter implements Filter { reqStat.incrementJdbcExecuteErrorCount(); } } - - SpringMethodStat springMethodStat = SpringMethodStat.current(); - if (springMethodStat != null) { - springMethodStat.addJdbcExecuteTimeNano(nanos); - if (error != null) { - springMethodStat.incrementJdbcExecuteErrorCount(); - } - } } @Override @@ -433,11 +409,6 @@ public class WebStatFilter implements Filter { if (reqStat != null) { reqStat.incrementJdbcCommitCount(); } - - SpringMethodStat springMethodStat = SpringMethodStat.current(); - if (springMethodStat != null) { - springMethodStat.incrementJdbcCommitCount(); - } } @Override @@ -446,11 +417,6 @@ public class WebStatFilter implements Filter { if (reqStat != null) { reqStat.incrementJdbcRollbackCount(); } - - SpringMethodStat springMethodStat = SpringMethodStat.current(); - if (springMethodStat != null) { - springMethodStat.incrementJdbcRollbackCount(); - } } @Override @@ -459,11 +425,6 @@ public class WebStatFilter implements Filter { if (reqStat != null) { reqStat.incrementJdbcPoolConnectCount(); } - - SpringMethodStat springMethodStat = SpringMethodStat.current(); - if (springMethodStat != null) { - springMethodStat.incrementJdbcPoolConnectionOpenCount(); - } } @Override @@ -472,11 +433,6 @@ public class WebStatFilter implements Filter { if (reqStat != null) { reqStat.incrementJdbcPoolCloseCount(); } - - SpringMethodStat springMethodStat = SpringMethodStat.current(); - if (springMethodStat != null) { - springMethodStat.incrementJdbcPoolConnectionOpenCount(); - } } @Override diff --git a/src/main/java/com/alibaba/druid/support/spring/stat/DruidStatInterceptor.java b/src/main/java/com/alibaba/druid/support/spring/stat/DruidStatInterceptor.java index 75c2afc642..9ddce29283 100644 --- a/src/main/java/com/alibaba/druid/support/spring/stat/DruidStatInterceptor.java +++ b/src/main/java/com/alibaba/druid/support/spring/stat/DruidStatInterceptor.java @@ -5,24 +5,36 @@ import java.lang.reflect.Method; import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; import org.springframework.aop.TargetSource; +import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.InitializingBean; +import com.alibaba.druid.filter.stat.StatFilterContext; +import com.alibaba.druid.filter.stat.StatFilterContextListenerAdapter; import com.alibaba.druid.support.logging.Log; import com.alibaba.druid.support.logging.LogFactory; -public class DruidStatInterceptor implements MethodInterceptor, InitializingBean { +public class DruidStatInterceptor implements MethodInterceptor, InitializingBean, DisposableBean { - private final static Log LOG = LogFactory.getLog(DruidStatInterceptor.class); + private final static Log LOG = LogFactory.getLog(DruidStatInterceptor.class); + + private static SpringStat springStat = new SpringStat(); + + private SpringMethodContextListener statContextlistener = new SpringMethodContextListener(); + + public DruidStatInterceptor(){ - private static SpringStat springStat = new SpringStat(); - - public DruidStatInterceptor() { - } @Override public void afterPropertiesSet() throws Exception { SpringStatManager.getInstance().addSpringStat(springStat); + + StatFilterContext.getInstance().addContextListener(statContextlistener); + } + + @Override + public void destroy() throws Exception { + StatFilterContext.getInstance().removeContextListener(statContextlistener); } @Override @@ -55,7 +67,7 @@ public class DruidStatInterceptor implements MethodInterceptor, InitializingBean if (methodStat != null) { methodStat.afterInvoke(error, nanos); } - + SpringMethodStat.setCurrent(lastMethodStat); } } @@ -125,4 +137,90 @@ public class DruidStatInterceptor implements MethodInterceptor, InitializingBean return new SpringMethodInfo(clazz, method); } + + class SpringMethodContextListener extends StatFilterContextListenerAdapter { + + @Override + public void addUpdateCount(int updateCount) { + SpringMethodStat springMethodStat = SpringMethodStat.current(); + if (springMethodStat != null) { + springMethodStat.addJdbcUpdateCount(updateCount); + } + } + + @Override + public void addFetchRowCount(int fetchRowCount) { + SpringMethodStat springMethodStat = SpringMethodStat.current(); + if (springMethodStat != null) { + springMethodStat.addJdbcFetchRowCount(fetchRowCount); + } + } + + @Override + public void executeBefore(String sql, boolean inTransaction) { + SpringMethodStat springMethodStat = SpringMethodStat.current(); + if (springMethodStat != null) { + springMethodStat.incrementJdbcExecuteCount(); + } + } + + @Override + public void executeAfter(String sql, long nanos, Throwable error) { + SpringMethodStat springMethodStat = SpringMethodStat.current(); + if (springMethodStat != null) { + springMethodStat.addJdbcExecuteTimeNano(nanos); + if (error != null) { + springMethodStat.incrementJdbcExecuteErrorCount(); + } + } + } + + @Override + public void commit() { + SpringMethodStat springMethodStat = SpringMethodStat.current(); + if (springMethodStat != null) { + springMethodStat.incrementJdbcCommitCount(); + } + } + + @Override + public void rollback() { + SpringMethodStat springMethodStat = SpringMethodStat.current(); + if (springMethodStat != null) { + springMethodStat.incrementJdbcRollbackCount(); + } + } + + @Override + public void pool_connect() { + SpringMethodStat springMethodStat = SpringMethodStat.current(); + if (springMethodStat != null) { + springMethodStat.incrementJdbcPoolConnectionOpenCount(); + } + } + + @Override + public void pool_close(long nanos) { + SpringMethodStat springMethodStat = SpringMethodStat.current(); + if (springMethodStat != null) { + springMethodStat.incrementJdbcPoolConnectionOpenCount(); + } + } + + @Override + public void resultSet_open() { + SpringMethodStat springMethodStat = SpringMethodStat.current(); + if (springMethodStat != null) { + springMethodStat.incrementJdbcResultSetOpenCount(); + } + } + + @Override + public void resultSet_close(long nanos) { + SpringMethodStat springMethodStat = SpringMethodStat.current(); + if (springMethodStat != null) { + springMethodStat.incrementJdbcResultSetCloseCount(); + } + } + } } diff --git a/src/main/java/com/alibaba/druid/support/spring/stat/SpringMethodStat.java b/src/main/java/com/alibaba/druid/support/spring/stat/SpringMethodStat.java index ec30e53ccd..6775027210 100644 --- a/src/main/java/com/alibaba/druid/support/spring/stat/SpringMethodStat.java +++ b/src/main/java/com/alibaba/druid/support/spring/stat/SpringMethodStat.java @@ -8,27 +8,30 @@ import java.util.concurrent.atomic.AtomicLong; public class SpringMethodStat { - private final static ThreadLocal currentLocal = new ThreadLocal(); + private final static ThreadLocal currentLocal = new ThreadLocal(); private final SpringMethodInfo methodInfo; - private final AtomicInteger runningCount = new AtomicInteger(); - private final AtomicInteger concurrentMax = new AtomicInteger(); - private final AtomicLong executeCount = new AtomicLong(0); - private final AtomicLong executeErrorCount = new AtomicLong(0); - private final AtomicLong executeTimeNano = new AtomicLong(); + private final AtomicInteger runningCount = new AtomicInteger(); + private final AtomicInteger concurrentMax = new AtomicInteger(); + private final AtomicLong executeCount = new AtomicLong(0); + private final AtomicLong executeErrorCount = new AtomicLong(0); + private final AtomicLong executeTimeNano = new AtomicLong(); - private final AtomicLong jdbcFetchRowCount = new AtomicLong(); - private final AtomicLong jdbcUpdateCount = new AtomicLong(); - private final AtomicLong jdbcExecuteCount = new AtomicLong(); - private final AtomicLong jdbcExecuteErrorCount = new AtomicLong(); - private final AtomicLong jdbcExecuteTimeNano = new AtomicLong(); + private final AtomicLong jdbcFetchRowCount = new AtomicLong(); + private final AtomicLong jdbcUpdateCount = new AtomicLong(); + private final AtomicLong jdbcExecuteCount = new AtomicLong(); + private final AtomicLong jdbcExecuteErrorCount = new AtomicLong(); + private final AtomicLong jdbcExecuteTimeNano = new AtomicLong(); - private final AtomicLong jdbcCommitCount = new AtomicLong(); - private final AtomicLong jdbcRollbackCount = new AtomicLong(); + private final AtomicLong jdbcCommitCount = new AtomicLong(); + private final AtomicLong jdbcRollbackCount = new AtomicLong(); - private final AtomicLong jdbcPoolConnectionOpenCount = new AtomicLong(); - private final AtomicLong jdbcPoolConnectionCloseCount = new AtomicLong(); + private final AtomicLong jdbcPoolConnectionOpenCount = new AtomicLong(); + private final AtomicLong jdbcPoolConnectionCloseCount = new AtomicLong(); + + private final AtomicLong jdbcResultSetOpenCount = new AtomicLong(); + private final AtomicLong jdbcResultSetCloseCount = new AtomicLong(); private volatile Throwable lastError; private volatile long lastErrorTimeMillis; @@ -54,6 +57,9 @@ public class SpringMethodStat { jdbcPoolConnectionOpenCount.set(0); jdbcPoolConnectionCloseCount.set(0); + + jdbcResultSetOpenCount.set(0); + jdbcResultSetCloseCount.set(0); lastError = null; lastErrorTimeMillis = 0; @@ -226,7 +232,7 @@ public class SpringMethodStat { public void addJdbcPoolConnectionOpenCount(long delta) { jdbcPoolConnectionOpenCount.addAndGet(delta); } - + public void incrementJdbcPoolConnectionOpenCount() { jdbcPoolConnectionOpenCount.incrementAndGet(); } @@ -238,10 +244,34 @@ public class SpringMethodStat { public void addJdbcPoolConnectionCloseCount(long delta) { jdbcPoolConnectionCloseCount.addAndGet(delta); } - + public void incrementJdbcPoolConnectionCloseCount() { jdbcPoolConnectionCloseCount.incrementAndGet(); } + + public long getJdbcResultSetOpenCount() { + return jdbcResultSetOpenCount.get(); + } + + public void addJdbcResultSetOpenCount(long delta) { + jdbcResultSetOpenCount.addAndGet(delta); + } + + public void incrementJdbcResultSetOpenCount() { + jdbcResultSetOpenCount.incrementAndGet(); + } + + public long getJdbcResultSetCloseCount() { + return jdbcResultSetCloseCount.get(); + } + + public void addJdbcResultSetCloseCount(long delta) { + jdbcResultSetCloseCount.addAndGet(delta); + } + + public void incrementJdbcResultSetCloseCount() { + jdbcResultSetCloseCount.incrementAndGet(); + } public Map getStatData() { Map data = new LinkedHashMap(); @@ -260,7 +290,10 @@ public class SpringMethodStat { data.put("JdbcPoolConnectionOpenCount", this.getJdbcPoolConnectionOpenCount()); data.put("JdbcPoolConnectionCloseCount", this.getJdbcPoolConnectionCloseCount()); - + + data.put("JdbcResultSetOpenCount", this.getJdbcResultSetOpenCount()); + data.put("JdbcResultSetCloseCount", this.getJdbcResultSetCloseCount()); + data.put("JdbcExecuteCount", this.getJdbcExecuteCount()); data.put("JdbcExecuteErrorCount", this.getJdbcExecuteErrorCount()); data.put("JdbcExecuteTimeMillis", this.getJdbcExecuteTimeMillis()); diff --git a/src/main/resources/support/http/resources/js/spring-detail.js b/src/main/resources/support/http/resources/js/spring-detail.js index 7dd99c5383..0b08b0d2d9 100644 --- a/src/main/resources/support/http/resources/js/spring-detail.js +++ b/src/main/resources/support/http/resources/js/spring-detail.js @@ -24,4 +24,9 @@ function ajaxResponseForSqlInfo() { changeInnerHtml("JdbcRollbackCount", stat.JdbcRollbackCount); changeInnerHtml("JdbcFetchRowCount", stat.JdbcFetchRowCount); changeInnerHtml("JdbcUpdateCount", stat.JdbcUpdateCount); + + changeInnerHtml("JdbcPoolConnectionOpenCount", stat.JdbcPoolConnectionOpenCount); + changeInnerHtml("JdbcPoolConnectionCloseCount", stat.JdbcPoolConnectionCloseCount); + changeInnerHtml("JdbcResultSetOpenCount", stat.JdbcResultSetOpenCount); + changeInnerHtml("JdbcResultSetCloseCount", stat.JdbcResultSetCloseCount); } diff --git a/src/main/resources/support/http/resources/spring-detail.html b/src/main/resources/support/http/resources/spring-detail.html index 671e5629e0..48020fa834 100644 --- a/src/main/resources/support/http/resources/spring-detail.html +++ b/src/main/resources/support/http/resources/spring-detail.html @@ -77,6 +77,22 @@ JdbcUpdateCount + + JdbcPoolConnectionOpenCount + + + + JdbcPoolConnectionCloseCount + + + + JdbcResultSetOpenCount + + + + JdbcResultSetCloseCount + +