From efb066f508f8c311bd351628a208a24dc26ba01d Mon Sep 17 00:00:00 2001 From: wenshao Date: Mon, 13 Aug 2012 10:49:12 +0800 Subject: [PATCH] add web stat support --- .../druid/support/http/WebStatFilter.java | 86 +++++++------------ .../druid/support/http/stat/WebAppStat.java | 4 +- .../support/http/stat/WebSessionStat.java | 8 +- .../druid/support/http/stat/WebURIStat.java | 57 ++++++++---- .../support/http/resources/js/weburi.js | 2 + .../support/http/resources/websession.html | 12 +-- .../support/http/resources/weburi.html | 16 ++-- 7 files changed, 97 insertions(+), 88 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 dc3aa606fc..bfcbba7159 100644 --- a/src/main/java/com/alibaba/druid/support/http/WebStatFilter.java +++ b/src/main/java/com/alibaba/druid/support/http/WebStatFilter.java @@ -20,7 +20,6 @@ import com.alibaba.druid.support.http.stat.WebAppStat; import com.alibaba.druid.support.http.stat.WebAppStatManager; import com.alibaba.druid.support.http.stat.WebRequestStat; 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.util.DruidWebUtils; @@ -78,17 +77,30 @@ public class WebStatFilter implements Filter { sessionStat.setLastAccessTimeMillis(startMillis); } + Throwable error = null; try { chain.doFilter(request, response); + } catch (IOException e) { + error = e; + throw e; + } catch (ServletException e) { + error = e; + throw e; + } catch (RuntimeException e) { + error = e; + throw e; + } catch (Error e) { + error = e; + throw e; } finally { long endNano = System.nanoTime(); requestStat.setEndNano(endNano); long nanoSpan = endNano - startNano; - webAppStat.afterInvoke(nanoSpan); + webAppStat.afterInvoke(error, nanoSpan); if (sessionStat != null) { - sessionStat.afterInvoke(nanoSpan); + sessionStat.afterInvoke(error, nanoSpan); } else { sessionStat = getSessionStat(httpRequest); if (sessionStat != null) { @@ -252,50 +264,25 @@ public class WebStatFilter implements Filter { @Override public void addUpdateCount(int updateCount) { - { - WebURIStat stat = WebURIStat.current(); - if (stat != null) { - stat.addJdbcUpdateCount(updateCount); - } - } - { - - WebRequestStat localStat = WebRequestStat.current(); - if (localStat != null) { - localStat.addJdbcUpdateCount(updateCount); - } + WebRequestStat localStat = WebRequestStat.current(); + if (localStat != null) { + localStat.addJdbcUpdateCount(updateCount); } } @Override public void addFetchRowCount(int fetchRowCount) { - { - WebURIStat stat = WebURIStat.current(); - if (stat != null) { - stat.addJdbcFetchRowCount(fetchRowCount); - } - } - { - WebRequestStat localStat = WebRequestStat.current(); - if (localStat != null) { - localStat.addJdbcFetchRowCount(fetchRowCount); - } + WebRequestStat localStat = WebRequestStat.current(); + if (localStat != null) { + localStat.addJdbcFetchRowCount(fetchRowCount); } } @Override public void executeBefore(String sql, boolean inTransaction) { - { - WebURIStat stat = WebURIStat.current(); - if (stat != null) { - stat.incrementJdbcExecuteCount(); - } - } - { - WebRequestStat localStat = WebRequestStat.current(); - if (localStat != null) { - localStat.incrementJdbcExecuteCount(); - } + WebRequestStat localStat = WebRequestStat.current(); + if (localStat != null) { + localStat.incrementJdbcExecuteCount(); } } @@ -309,30 +296,17 @@ public class WebStatFilter implements Filter { @Override public void commit() { - WebURIStat stat = WebURIStat.current(); - if (stat != null) { - stat.incrementJdbcCommitCount(); - } - { - WebRequestStat localStat = WebRequestStat.current(); - if (localStat != null) { - localStat.incrementJdbcCommitCount(); - } + WebRequestStat localStat = WebRequestStat.current(); + if (localStat != null) { + localStat.incrementJdbcCommitCount(); } } @Override public void rollback() { - WebURIStat stat = WebURIStat.current(); - if (stat != null) { - stat.incrementJdbcRollbackCount(); - } - - { - WebRequestStat localStat = WebRequestStat.current(); - if (localStat != null) { - localStat.incrementJdbcRollbackCount(); - } + WebRequestStat localStat = WebRequestStat.current(); + if (localStat != null) { + localStat.incrementJdbcRollbackCount(); } } } diff --git a/src/main/java/com/alibaba/druid/support/http/stat/WebAppStat.java b/src/main/java/com/alibaba/druid/support/http/stat/WebAppStat.java index fc705ce184..18bfe0f566 100644 --- a/src/main/java/com/alibaba/druid/support/http/stat/WebAppStat.java +++ b/src/main/java/com/alibaba/druid/support/http/stat/WebAppStat.java @@ -158,12 +158,12 @@ public class WebAppStat { } } - public void afterInvoke(long nanoSpan) { + public void afterInvoke(Throwable error, long nanoSpan) { runningCount.decrementAndGet(); WebURIStat uriStat = WebURIStat.current(); if (uriStat != null) { - uriStat.afterInvoke(nanoSpan); + uriStat.afterInvoke(error, nanoSpan); } currentLocal.set(null); diff --git a/src/main/java/com/alibaba/druid/support/http/stat/WebSessionStat.java b/src/main/java/com/alibaba/druid/support/http/stat/WebSessionStat.java index 1c6649da3e..07e565af18 100644 --- a/src/main/java/com/alibaba/druid/support/http/stat/WebSessionStat.java +++ b/src/main/java/com/alibaba/druid/support/http/stat/WebSessionStat.java @@ -15,6 +15,7 @@ public class WebSessionStat { private final AtomicInteger runningCount = new AtomicInteger(); private final AtomicInteger concurrentMax = new AtomicInteger(); private final AtomicLong requestCount = new AtomicLong(0); + private final AtomicLong requestErrorCount = new AtomicLong(0); private final AtomicLong jdbcFetchRowCount = new AtomicLong(); private final AtomicLong jdbcUpdateCount = new AtomicLong(); @@ -119,9 +120,8 @@ public class WebSessionStat { requestCount.incrementAndGet(); } - public void afterInvoke(long nanoSpan) { + public void afterInvoke(Throwable error, long nanoSpan) { runningCount.decrementAndGet(); - reacord(nanoSpan); } @@ -154,6 +154,10 @@ public class WebSessionStat { public long getRequestCount() { return requestCount.get(); } + + public long getRequestErrorCount() { + return requestErrorCount.get(); + } public long getRequestTimeNano() { return requestTimeNano.get(); diff --git a/src/main/java/com/alibaba/druid/support/http/stat/WebURIStat.java b/src/main/java/com/alibaba/druid/support/http/stat/WebURIStat.java index ed3fe9b17f..de5c165322 100644 --- a/src/main/java/com/alibaba/druid/support/http/stat/WebURIStat.java +++ b/src/main/java/com/alibaba/druid/support/http/stat/WebURIStat.java @@ -9,24 +9,25 @@ public class WebURIStat { private final String uri; - private final AtomicInteger runningCount = new AtomicInteger(); - private final AtomicInteger concurrentMax = new AtomicInteger(); - private final AtomicLong requestCount = new AtomicLong(0); + private final AtomicInteger runningCount = new AtomicInteger(); + private final AtomicInteger concurrentMax = new AtomicInteger(); + private final AtomicLong requestCount = new AtomicLong(0); + private final AtomicLong requestTimeNano = new AtomicLong(); - private final AtomicLong jdbcFetchRowCount = new AtomicLong(); - private final AtomicLong jdbcFetchRowPeak = new AtomicLong(); // 单次请求读取行数的峰值 + private final AtomicLong jdbcFetchRowCount = new AtomicLong(); + private final AtomicLong jdbcFetchRowPeak = new AtomicLong(); // 单次请求读取行数的峰值 - private final AtomicLong jdbcUpdateCount = new AtomicLong(); - private final AtomicLong jdbcUpdatePeak = new AtomicLong(); // 单次请求更新行数的峰值 + private final AtomicLong jdbcUpdateCount = new AtomicLong(); + private final AtomicLong jdbcUpdatePeak = new AtomicLong(); // 单次请求更新行数的峰值 - private final AtomicLong jdbcExecuteCount = new AtomicLong(); - private final AtomicLong jdbcExecutePeak = new AtomicLong(); // 单次请求执行SQL次数的峰值 + private final AtomicLong jdbcExecuteCount = new AtomicLong(); + private final AtomicLong jdbcExecutePeak = new AtomicLong(); // 单次请求执行SQL次数的峰值 + 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 static ThreadLocal currentLocal = new ThreadLocal(); - + private final static ThreadLocal currentLocal = new ThreadLocal(); public WebURIStat(String uri){ super(); @@ -62,14 +63,16 @@ public class WebURIStat { requestCount.incrementAndGet(); } - public void afterInvoke(long nanoSpan) { + public void afterInvoke(Throwable error, long nanoSpan) { runningCount.decrementAndGet(); + requestTimeNano.addAndGet(nanoSpan); { WebRequestStat localStat = WebRequestStat.current(); if (localStat != null) { { long fetchRowCount = localStat.getJdbcFetchRowCount(); + this.addJdbcFetchRowCount(fetchRowCount); for (;;) { long peak = jdbcFetchRowPeak.get(); @@ -84,6 +87,7 @@ public class WebURIStat { } { long executeCount = localStat.getJdbcExecuteCount(); + this.addJdbcExecuteCount(executeCount); for (;;) { long peak = jdbcExecutePeak.get(); @@ -98,6 +102,7 @@ public class WebURIStat { } { long updateCount = localStat.getJdbcUpdateCount(); + this.addJdbcUpdateCount(updateCount); for (;;) { long peak = jdbcUpdatePeak.get(); @@ -128,6 +133,14 @@ public class WebURIStat { return requestCount.get(); } + public long getRequestTimeNano() { + return requestTimeNano.get(); + } + + public long getRequestTimeMillis() { + return getRequestTimeNano() / (1000 * 1000); + } + public void addJdbcFetchRowCount(long delta) { this.jdbcFetchRowCount.addAndGet(delta); } @@ -140,7 +153,7 @@ public class WebURIStat { return jdbcFetchRowPeak.get(); } - public void addJdbcUpdateCount(int updateCount) { + public void addJdbcUpdateCount(long updateCount) { this.jdbcUpdateCount.addAndGet(updateCount); } @@ -155,6 +168,10 @@ public class WebURIStat { public void incrementJdbcExecuteCount() { jdbcExecuteCount.incrementAndGet(); } + + public void addJdbcExecuteCount(long executeCount) { + jdbcExecuteCount.addAndGet(executeCount); + } public long getJdbcExecuteCount() { return jdbcExecuteCount.get(); @@ -164,6 +181,14 @@ public class WebURIStat { return jdbcExecutePeak.get(); } + public long getJdbcExecuteTimeMillis() { + return getJdbcExecuteTimeNano() / (1000 * 1000); + } + + public long getJdbcExecuteTimeNano() { + return jdbcExecuteTimeNano.get(); + } + public void incrementJdbcCommitCount() { jdbcCommitCount.incrementAndGet(); } @@ -187,12 +212,14 @@ public class WebURIStat { data.put("RunningCount", this.getRunningCount()); data.put("ConcurrentMax", this.getConcurrentMax()); data.put("RequestCount", this.getRequestCount()); + data.put("RequestTimeMillis", this.getRequestTimeMillis()); data.put("JdbcCommitCount", this.getJdbcCommitCount()); data.put("JdbcRollbackCount", this.getJdbcRollbackCount()); data.put("JdbcExecuteCount", this.getJdbcExecuteCount()); data.put("JdbcExecutePeak", this.getJdbcExecutePeak()); + data.put("JdbcExecuteTimeMillis", this.getJdbcExecuteTimeMillis()); data.put("JdbcFetchRowCount", this.getJdbcFetchRowCount()); data.put("JdbcFetchRowPeak", this.getJdbcFetchRowPeak()); diff --git a/src/main/resources/support/http/resources/js/weburi.js b/src/main/resources/support/http/resources/js/weburi.js index 15cb9dfd9c..a7e21efa6c 100644 --- a/src/main/resources/support/http/resources/js/weburi.js +++ b/src/main/resources/support/http/resources/js/weburi.js @@ -97,9 +97,11 @@ function ajaxResponseForDataSourceSqlStatInfo() { newRow.insertCell(-1).innerHTML = i+1; newRow.insertCell(-1).innerHTML = subSqlString(sqlStat.URI, 64); newRow.insertCell(-1).innerHTML = sqlStat.RequestCount; + newRow.insertCell(-1).innerHTML = sqlStat.RequestTimeMillis; newRow.insertCell(-1).innerHTML = sqlStat.RunningCount; newRow.insertCell(-1).innerHTML = sqlStat.ConcurrentMax; newRow.insertCell(-1).innerHTML = sqlStat.JdbcExecuteCount; + newRow.insertCell(-1).innerHTML = sqlStat.JdbcExecuteTimeMillis; newRow.insertCell(-1).innerHTML = sqlStat.JdbcCommitCount; newRow.insertCell(-1).innerHTML = sqlStat.JdbcRollbackCount; newRow.insertCell(-1).innerHTML = sqlStat.JdbcFetchRowCount; diff --git a/src/main/resources/support/http/resources/websession.html b/src/main/resources/support/http/resources/websession.html index 3316533342..675b2e58c7 100644 --- a/src/main/resources/support/http/resources/websession.html +++ b/src/main/resources/support/http/resources/websession.html @@ -31,12 +31,12 @@ RequestTime Running Count Concurrent Max - JdbcExecuteCount - JdbcExecuteTime - JdbcCommitCount - JdbcRollbackCount - JdbcFetchRowCount - JdbcUpdateCount + Jdbc Exec Count + Jdbc Exec Time + Jdbc Commit + Jdbc Rollback + Jdbc FetchRow + Jdbc Update diff --git a/src/main/resources/support/http/resources/weburi.html b/src/main/resources/support/http/resources/weburi.html index 51e9d0f972..1d5b5debce 100644 --- a/src/main/resources/support/http/resources/weburi.html +++ b/src/main/resources/support/http/resources/weburi.html @@ -25,14 +25,16 @@ N-- URI - Request Count + Request Count + Request Time Running Count - Concurrent Max - JdbcExecuteCount - JdbcCommitCount - JdbcRollbackCount - JdbcFetchRowCount - JdbcUpdateCount + Concurrent Max + Jdbc Exec Count + Jdbc Exec Time + Jdbc Commit + Jdbc Rollback + Jdbc FetchRow + Jdbc Update