From 720c7713af9d52fe0d226380155bc7633f94ba59 Mon Sep 17 00:00:00 2001 From: wenshao Date: Sat, 18 Aug 2012 11:03:00 +0800 Subject: [PATCH] bug fixed webStat support --- .../druid/stat/DruidStatManagerFacade.java | 8 ++++++ .../druid/support/JSONDruidStatService.java | 2 -- .../druid/support/http/StatViewServlet.java | 8 ++++++ .../druid/support/http/WebStatFilter.java | 16 +++++++++--- .../support/http/stat/WebRequestStat.java | 16 +++++++++++- .../support/http/stat/WebSessionStat.java | 25 ++++++++++++++++--- .../support/http/resources/websession.html | 4 +-- .../bvt/support/http/WebStatFilterTest2.java | 4 +++ 8 files changed, 71 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/alibaba/druid/stat/DruidStatManagerFacade.java b/src/main/java/com/alibaba/druid/stat/DruidStatManagerFacade.java index f94ea9be6e..d09ca816f4 100644 --- a/src/main/java/com/alibaba/druid/stat/DruidStatManagerFacade.java +++ b/src/main/java/com/alibaba/druid/stat/DruidStatManagerFacade.java @@ -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(); diff --git a/src/main/java/com/alibaba/druid/support/JSONDruidStatService.java b/src/main/java/com/alibaba/druid/support/JSONDruidStatService.java index f7114bf9da..a35b49a7d8 100644 --- a/src/main/java/com/alibaba/druid/support/JSONDruidStatService.java +++ b/src/main/java/com/alibaba/druid/support/JSONDruidStatService.java @@ -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); } diff --git a/src/main/java/com/alibaba/druid/support/http/StatViewServlet.java b/src/main/java/com/alibaba/druid/support/http/StatViewServlet.java index 613bd36a08..0bca8bf97b 100644 --- a/src/main/java/com/alibaba/druid/support/http/StatViewServlet.java +++ b/src/main/java/com/alibaba/druid/support/http/StatViewServlet.java @@ -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) { 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 65b7311901..23bda12b21 100644 --- a/src/main/java/com/alibaba/druid/support/http/WebStatFilter.java +++ b/src/main/java/com/alibaba/druid/support/http/WebStatFilter.java @@ -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(); diff --git a/src/main/java/com/alibaba/druid/support/http/stat/WebRequestStat.java b/src/main/java/com/alibaba/druid/support/http/stat/WebRequestStat.java index 36b9d68200..dab15a12fe 100644 --- a/src/main/java/com/alibaba/druid/support/http/stat/WebRequestStat.java +++ b/src/main/java/com/alibaba/druid/support/http/stat/WebRequestStat.java @@ -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 localRequestStat = new ThreadLocal(); @@ -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; } 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 1686c87d68..342d05992c 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 @@ -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; } diff --git a/src/main/resources/support/http/resources/websession.html b/src/main/resources/support/http/resources/websession.html index 6f7e7aa14d..675139418e 100644 --- a/src/main/resources/support/http/resources/websession.html +++ b/src/main/resources/support/http/resources/websession.html @@ -24,8 +24,8 @@ N-- SESSIONID Principal - CreateTime - LastAccessTime + Create Time + Last Access RemoteAddress Request Count RequestTime diff --git a/src/test/java/com/alibaba/druid/bvt/support/http/WebStatFilterTest2.java b/src/test/java/com/alibaba/druid/bvt/support/http/WebStatFilterTest2.java index 275d4aa095..a0d5f52d9b 100644 --- a/src/test/java/com/alibaba/druid/bvt/support/http/WebStatFilterTest2.java +++ b/src/test/java/com/alibaba/druid/bvt/support/http/WebStatFilterTest2.java @@ -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();