add web stat support

This commit is contained in:
wenshao
2012-08-13 10:49:12 +08:00
parent a5bb190e9b
commit efb066f508
7 changed files with 97 additions and 88 deletions
@@ -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();
}
}
}
@@ -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);
@@ -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();
@@ -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<WebURIStat> currentLocal = new ThreadLocal<WebURIStat>();
private final static ThreadLocal<WebURIStat> currentLocal = new ThreadLocal<WebURIStat>();
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());
@@ -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;
@@ -31,12 +31,12 @@
<th class="td_lable" width="50"><a id="RequestTimeMillisTotal" href="javascript:void(0)" onclick="setOrderBy('RequestTimeMillisTotal=');" title="RequestTimeMillisTotal">RequestTime</a></th>
<th class="td_lable" width="50"><a id="th-RunningCount" href="javascript:void(0)" onclick="setOrderBy('RunningCount');">Running Count</a></th>
<th class="td_lable" width="80"><a id="th-ConcurrentMax" href="javascript:void(0)" onclick="setOrderBy('ConcurrentMax');">Concurrent Max</a></th>
<th class="td_lable" width="80"><a id="th-JdbcExecuteCount" href="javascript:void(0)" onclick="setOrderBy('JdbcExecuteCount');">JdbcExecuteCount</a></th>
<th class="td_lable" width="80"><a id="th-JdbcExecuteTimeMillis" href="javascript:void(0)" onclick="setOrderBy('JdbcExecuteTimeMillis');" title="JdbcExecuteTimeMillis">JdbcExecuteTime</a></th>
<th class="td_lable" width="80"><a id="th-JdbcCommitCount" href="javascript:void(0)" onclick="setOrderBy('JdbcCommitCount');">JdbcCommitCount</a></th>
<th class="td_lable" width="80"><a id="th-JdbcRollbackCount" href="javascript:void(0)" onclick="setOrderBy('JdbcRollbackCount');">JdbcRollbackCount</a></th>
<th class="td_lable" width="80"><a id="th-JdbcFetchRowCount" href="javascript:void(0)" onclick="setOrderBy('JdbcFetchRowCount');">JdbcFetchRowCount</a></th>
<th class="td_lable" width="80"><a id="th-JdbcUpdateCount" href="javascript:void(0)" onclick="setOrderBy('JdbcUpdateCount');">JdbcUpdateCount</a></th>
<th class="td_lable" width="80"><a id="th-JdbcExecuteCount" href="javascript:void(0)" onclick="setOrderBy('JdbcExecuteCount');">Jdbc Exec Count</a></th>
<th class="td_lable" width="80"><a id="th-JdbcExecuteTimeMillis" href="javascript:void(0)" onclick="setOrderBy('JdbcExecuteTimeMillis');" title="JdbcExecuteTimeMillis">Jdbc Exec Time</a></th>
<th class="td_lable" width="80"><a id="th-JdbcCommitCount" href="javascript:void(0)" onclick="setOrderBy('JdbcCommitCount');">Jdbc Commit</a></th>
<th class="td_lable" width="80"><a id="th-JdbcRollbackCount" href="javascript:void(0)" onclick="setOrderBy('JdbcRollbackCount');">Jdbc Rollback</a></th>
<th class="td_lable" width="80"><a id="th-JdbcFetchRowCount" href="javascript:void(0)" onclick="setOrderBy('JdbcFetchRowCount');">Jdbc FetchRow</a></th>
<th class="td_lable" width="80"><a id="th-JdbcUpdateCount" href="javascript:void(0)" onclick="setOrderBy('JdbcUpdateCount');">Jdbc Update</a></th>
</tr>
</thead>
</table>
@@ -25,14 +25,16 @@
<tr>
<th class="td_lable">N--</th>
<th class="td_lable"><a id="URI" href="javascript:void(0)" onclick="setOrderBy('URI');">URI</a></th>
<th class="td_lable" width="50"><a id="RequestCount" href="javascript:void(0)" onclick="setOrderBy('RequestCount');">Request Count</a></th>
<th class="td_lable" width="50"><a id="th-RequestCount" href="javascript:void(0)" onclick="setOrderBy('RequestCount');">Request Count</a></th>
<th class="td_lable" width="50"><a id="th-RequestTimeMillis" href="javascript:void(0)" onclick="setOrderBy('RequestTimeMillis');">Request Time</a></th>
<th class="td_lable" width="50"><a id="th-RunningCount" href="javascript:void(0)" onclick="setOrderBy('RunningCount');">Running Count</a></th>
<th class="td_lable" width="80"><a id="th-ConcurrentMax" href="javascript:void(0)" onclick="setOrderBy('ConcurrentMax');">Concurrent Max</a></th>
<th class="td_lable" width="80"><a id="th-JdbcExecuteCount" href="javascript:void(0)" onclick="setOrderBy('JdbcExecuteCount');">JdbcExecuteCount</a></th>
<th class="td_lable" width="80"><a id="th-JdbcCommitCount" href="javascript:void(0)" onclick="setOrderBy('JdbcCommitCount');">JdbcCommitCount</a></th>
<th class="td_lable" width="80"><a id="th-JdbcRollbackCount" href="javascript:void(0)" onclick="setOrderBy('JdbcRollbackCount');">JdbcRollbackCount</a></th>
<th class="td_lable" width="80"><a id="th-JdbcFetchRowCount" href="javascript:void(0)" onclick="setOrderBy('JdbcFetchRowCount');">JdbcFetchRowCount</a></th>
<th class="td_lable" width="80"><a id="th-JdbcUpdateCount" href="javascript:void(0)" onclick="setOrderBy('JdbcUpdateCount');">JdbcUpdateCount</a></th>
<th class="td_lable" width="50"><a id="th-ConcurrentMax" href="javascript:void(0)" onclick="setOrderBy('ConcurrentMax');">Concurrent Max</a></th>
<th class="td_lable" width="50"><a id="th-JdbcExecuteCount" href="javascript:void(0)" onclick="setOrderBy('JdbcExecuteCount');">Jdbc Exec Count</a></th>
<th class="td_lable" width="50"><a id="th-JdbcExecuteTimeMillis" href="javascript:void(0)" onclick="setOrderBy('JdbcExecuteTimeMillis');">Jdbc Exec Time</a></th>
<th class="td_lable" width="50"><a id="th-JdbcCommitCount" href="javascript:void(0)" onclick="setOrderBy('JdbcCommitCount');">Jdbc Commit</a></th>
<th class="td_lable" width="50"><a id="th-JdbcRollbackCount" href="javascript:void(0)" onclick="setOrderBy('JdbcRollbackCount');">Jdbc Rollback</a></th>
<th class="td_lable" width="50"><a id="th-JdbcFetchRowCount" href="javascript:void(0)" onclick="setOrderBy('JdbcFetchRowCount');">Jdbc FetchRow</a></th>
<th class="td_lable" width="50"><a id="th-JdbcUpdateCount" href="javascript:void(0)" onclick="setOrderBy('JdbcUpdateCount');">Jdbc Update</a></th>
</tr>
</thead>
</table>