bug fixed webStat support

This commit is contained in:
wenshao
2012-08-18 11:03:00 +08:00
parent 37666a7d34
commit 720c7713af
8 changed files with 71 additions and 12 deletions
@@ -11,6 +11,8 @@ import java.util.Set;
import java.util.concurrent.atomic.AtomicLong;
import com.alibaba.druid.VERSION;
import com.alibaba.druid.support.http.stat.WebAppStatManager;
import com.alibaba.druid.support.spring.stat.SpringStatManager;
import com.alibaba.druid.util.DruidDataSourceUtils;
import com.alibaba.druid.util.JdbcSqlStatUtils;
@@ -50,6 +52,12 @@ public class DruidStatManagerFacade {
}
public void resetAll() {
if (!isResetEnable()) {
return;
}
SpringStatManager.getInstance().resetStat();
WebAppStatManager.getInstance().resetStat();
resetSqlStat();
resetDataSourceStat();
resetCount.incrementAndGet();
@@ -62,8 +62,6 @@ public class JSONDruidStatService {
if (url.equals("/reset-all.json")) {
statManagerFacade.resetAll();
SpringStatManager.getInstance().resetStat();
WebAppStatManager.getInstance().resetStat();
return returnJSONResult(RESULT_CODE_SUCCESS, null);
}
@@ -108,6 +108,14 @@ public class StatViewServlet extends HttpServlet {
}
public boolean isPermittedRequest(String remoteAddress) {
boolean ipV6 = remoteAddress != null && remoteAddress.indexOf(':') != -1;
if (ipV6) {
if (denyList.size() == 0 && allowList.size() == 0) {
return true;
}
}
IPAddress ipAddress = new IPAddress(remoteAddress);
for (IPRange range : denyList) {
@@ -85,9 +85,14 @@ public class WebStatFilter implements Filter {
long startNano = System.nanoTime();
long startMillis = System.currentTimeMillis();
WebRequestStat requestStat = new WebRequestStat(startNano);
WebRequestStat requestStat = new WebRequestStat(startNano, startMillis);
WebRequestStat.set(requestStat);
WebSessionStat sessionStat = getSessionStat(httpRequest);
if (sessionStat != null) {
sessionStat.beforeInvoke();
}
webAppStat.beforeInvoke();
WebURIStat uriStat = webAppStat.getURIStat(requestURI, false);
@@ -100,7 +105,6 @@ public class WebStatFilter implements Filter {
// 第一次访问时,sessionId为null,如果缺省sessionCreate=false,sessionStat就为null。
if (sessionStat != null) {
sessionStat.beforeInvoke();
sessionStat.setLastAccessTimeMillis(startMillis);
}
Throwable error = null;
@@ -171,15 +175,21 @@ public class WebStatFilter implements Filter {
}
if (sessionStat != null) {
long currentMillis = System.currentTimeMillis();
if (sessionStat.getCreateTimeMillis() == -1L) {
HttpSession session = request.getSession(false);
if (session != null) {
sessionStat.setCreateTimeMillis(session.getCreationTime());
} else {
sessionStat.setCreateTimeMillis(System.currentTimeMillis());
sessionStat.setCreateTimeMillis(currentMillis);
}
}
String userAgent = request.getHeader("user-agent");
sessionStat.setUserAgent(userAgent);
String ip = DruidWebUtils.getRemoteAddr(request);
int addressCount = sessionStat.getRemoteAddresses().size();
@@ -3,6 +3,7 @@ package com.alibaba.druid.support.http.stat;
public class WebRequestStat {
private long startNano;
private long startMillis;
private long endNano;
private long jdbcCommitCount;
private long jdbcRollbackCount;
@@ -18,6 +19,11 @@ public class WebRequestStat {
public WebRequestStat(long startNano){
this.startNano = startNano;
}
public WebRequestStat(long startNano, long startMillis){
this.startNano = startNano;
this.startMillis = startMillis;
}
private static ThreadLocal<WebRequestStat> localRequestStat = new ThreadLocal<WebRequestStat>();
@@ -37,6 +43,14 @@ public class WebRequestStat {
this.startNano = startNano;
}
public long getStartMillis() {
return startMillis;
}
public void setStartMillis(long startMillis) {
this.startMillis = startMillis;
}
public long getEndNano() {
return endNano;
}
@@ -64,7 +78,7 @@ public class WebRequestStat {
public long getJdbcExecuteTimeNano() {
return jdbcExecuteNano;
}
public void addJdbcExecuteTimeNano(long nano) {
jdbcExecuteNano += nano;
}
@@ -17,7 +17,7 @@ public class WebSessionStat {
private final AtomicLong requestCount = new AtomicLong(0);
private final AtomicLong requestErrorCount = new AtomicLong(0);
private final AtomicLong requestTimeNano = new AtomicLong();
private final AtomicLong jdbcFetchRowCount = new AtomicLong();
private final AtomicLong jdbcUpdateCount = new AtomicLong();
private final AtomicLong jdbcExecuteCount = new AtomicLong();
@@ -33,28 +33,38 @@ public class WebSessionStat {
private String principal = null;
private String userAgent;
public WebSessionStat(String sessionId){
super();
this.sessionId = sessionId;
}
public void reset() {
concurrentMax.set(0);
requestCount.set(0);
requestErrorCount.set(0);
requestTimeNano.set(0);
jdbcFetchRowCount.set(0);
jdbcUpdateCount.set(0);
jdbcExecuteCount.set(0);
jdbcExecuteTimeNano.set(0);
jdbcCommitCount.set(0);
jdbcRollbackCount.set(0);
remoteAddresses.clear();
principal = null;
}
public String getUserAgent() {
return userAgent;
}
public void setUserAgent(String userAgent) {
this.userAgent = userAgent;
}
public String getSessionId() {
return sessionId;
}
@@ -140,6 +150,11 @@ public class WebSessionStat {
}
incrementRequestCount();
WebRequestStat requestStat = WebRequestStat.current();
if (requestStat != null) {
this.setLastAccessTimeMillis(requestStat.getStartMillis());
}
}
public void incrementRequestCount() {
@@ -278,6 +293,8 @@ public class WebSessionStat {
data.put("JdbcExecuteTimeMillis", this.getJdbcExecuteTimeMillis());
data.put("JdbcFetchRowCount", this.getJdbcFetchRowCount());
data.put("JdbcUpdateCount", this.getJdbcUpdateCount());
data.put("UserAgent", this.getUserAgent());
return data;
}
@@ -24,8 +24,8 @@
<th class="td_lable">N--</th>
<th class="td_lable"><a id="SESSIONID" href="javascript:void(0)" onclick="setOrderBy('SESSIONID');">SESSIONID</a></th>
<th class="td_lable" width="50"><a id="th-Principal" href="javascript:void(0)" onclick="setOrderBy('Principal');">Principal</a></th>
<th class="td_lable" width="50"><a id="th-CreateTime" href="javascript:void(0)" onclick="setOrderBy('CreateTime');">CreateTime</a></th>
<th class="td_lable" width="50"><a id="th-LastAccessTime" href="javascript:void(0)" onclick="setOrderBy('LastAccessTime');">LastAccessTime</a></th>
<th class="td_lable" width="100"><a id="th-CreateTime" href="javascript:void(0)" onclick="setOrderBy('CreateTime');">Create Time</a></th>
<th class="td_lable" width="100"><a id="th-LastAccessTime" href="javascript:void(0)" onclick="setOrderBy('LastAccessTime');">Last Access</a></th>
<th class="td_lable" width="50"><a id="th-RemoteAddress" href="javascript:void(0)" onclick="setOrderBy('RemoteAddress');">RemoteAddress</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-RequestTimeMillisTotal" href="javascript:void(0)" onclick="setOrderBy('RequestTimeMillisTotal=');" title="RequestTimeMillisTotal">RequestTime</a></th>
@@ -38,6 +38,8 @@ public class WebStatFilterTest2 extends TestCase {
// 第一个session请求2次
{
Assert.assertNull(appStat.getSessionStat(session_0.getId()));
MockHttpServletRequest request = new MockHttpServletRequest();
MockHttpServletResponse response = new MockHttpServletResponse();
MockFilterChain chain = new MockFilterChain() {
@@ -51,6 +53,8 @@ public class WebStatFilterTest2 extends TestCase {
Assert.assertEquals(1, appStat.getSessionStatDataList().size());
Assert.assertEquals(1, appStat.getSessionStat(session_0.getId()).getRequestCount());
Assert.assertTrue(appStat.getSessionStat(session_0.getId()).getLastAccessTimeMillis() > 0);
}
{
MockHttpServletRequest request = new MockHttpServletRequest();