mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
add web stat support
This commit is contained in:
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user