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