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 23bda12b21..11ffc8a8ff 100644 --- a/src/main/java/com/alibaba/druid/support/http/WebStatFilter.java +++ b/src/main/java/com/alibaba/druid/support/http/WebStatFilter.java @@ -89,10 +89,6 @@ public class WebStatFilter implements Filter { WebRequestStat.set(requestStat); WebSessionStat sessionStat = getSessionStat(httpRequest); - if (sessionStat != null) { - sessionStat.beforeInvoke(); - } - webAppStat.beforeInvoke(); WebURIStat uriStat = webAppStat.getURIStat(requestURI, false); 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 342d05992c..7b0a5ef8ea 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 @@ -8,33 +8,37 @@ import java.util.Set; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; +import com.alibaba.druid.util.Histogram; + public class WebSessionStat { private final String sessionId; - 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 requestTimeNano = new AtomicLong(); + 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 requestTimeNano = new AtomicLong(); - private final AtomicLong jdbcFetchRowCount = new AtomicLong(); - private final AtomicLong jdbcUpdateCount = new AtomicLong(); - private final AtomicLong jdbcExecuteCount = new AtomicLong(); - private final AtomicLong jdbcExecuteTimeNano = new AtomicLong(); + private final AtomicLong jdbcFetchRowCount = new AtomicLong(); + private final AtomicLong jdbcUpdateCount = new AtomicLong(); + private final AtomicLong jdbcExecuteCount = new AtomicLong(); + 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 long createTimeMillis = -1L; - private long lastAccessTimeMillis = -1L; + private long createTimeMillis = -1L; + private volatile long lastAccessTimeMillis = -1L; - private Set remoteAddresses = new HashSet(); + private Set remoteAddresses = new HashSet(); - private String principal = null; + private String principal = null; private String userAgent; + private Histogram requestIntervalHistogram = Histogram.makeHistogram(8); + public WebSessionStat(String sessionId){ super(); this.sessionId = sessionId; @@ -55,6 +59,8 @@ public class WebSessionStat { remoteAddresses.clear(); principal = null; + + requestIntervalHistogram.reset(); } public String getUserAgent() { @@ -130,6 +136,10 @@ public class WebSessionStat { } public void setLastAccessTimeMillis(long lastAccessTimeMillis) { + if (this.lastAccessTimeMillis > 0) { + long interval = lastAccessTimeMillis - this.lastAccessTimeMillis; + requestIntervalHistogram.record(interval); + } this.lastAccessTimeMillis = lastAccessTimeMillis; } @@ -150,7 +160,7 @@ public class WebSessionStat { } incrementRequestCount(); - + WebRequestStat requestStat = WebRequestStat.current(); if (requestStat != null) { this.setLastAccessTimeMillis(requestStat.getStartMillis()); @@ -161,9 +171,9 @@ public class WebSessionStat { requestCount.incrementAndGet(); } - public void afterInvoke(Throwable error, long nanoSpan) { + public void afterInvoke(Throwable error, long nanos) { runningCount.decrementAndGet(); - reacord(nanoSpan); + reacord(nanos); } public void reacord(long nanos) { @@ -272,6 +282,10 @@ public class WebSessionStat { this.jdbcRollbackCount.addAndGet(rollbackCount); } + public long[] getRequestInterval() { + return requestIntervalHistogram.toArray(); + } + public Map getStatData() { Map data = new LinkedHashMap(); @@ -293,8 +307,9 @@ public class WebSessionStat { data.put("JdbcExecuteTimeMillis", this.getJdbcExecuteTimeMillis()); data.put("JdbcFetchRowCount", this.getJdbcFetchRowCount()); data.put("JdbcUpdateCount", this.getJdbcUpdateCount()); - + data.put("UserAgent", this.getUserAgent()); + data.put("RequestInterval", this.getRequestInterval()); return data; } diff --git a/src/main/java/com/alibaba/druid/util/Histogram.java b/src/main/java/com/alibaba/druid/util/Histogram.java index 50fe849461..f4c0adb9f8 100644 --- a/src/main/java/com/alibaba/druid/util/Histogram.java +++ b/src/main/java/com/alibaba/druid/util/Histogram.java @@ -30,6 +30,16 @@ public class Histogram { rangeCounters[i] = new AtomicLong(); } } + + public static Histogram makeHistogram(int rangeCount) { + long[] rangeValues = new long[rangeCount]; + + for (int i = 0; i < rangeValues.length; ++i) { + rangeValues[i] = (long) Math.pow(10, i); + } + + return new Histogram(rangeValues); + } public Histogram(TimeUnit timeUnit, long... ranges){ this.ranges = new long[ranges.length]; diff --git a/src/main/resources/support/http/resources/js/websession-detail.js b/src/main/resources/support/http/resources/js/websession-detail.js index aa5609347a..91d76ca3b9 100644 --- a/src/main/resources/support/http/resources/js/websession-detail.js +++ b/src/main/resources/support/http/resources/js/websession-detail.js @@ -19,6 +19,7 @@ function ajaxResponseForSqlInfo() { changeInnerHtml("RemoteAddress", stat.RemoteAddress); changeInnerHtml("RequestCount", stat.RequestCount); changeInnerHtml("RequestTimeMillisTotal", stat.RequestTimeMillisTotal); + changeInnerHtml("RequestInterval", '[' + stat.RequestInterval + ']'); changeInnerHtml("RunningCount", stat.RunningCount); changeInnerHtml("ConcurrentMax", stat.ConcurrentMax); changeInnerHtml("JdbcExecuteCount", stat.JdbcExecuteCount); diff --git a/src/main/resources/support/http/resources/websession-detail.html b/src/main/resources/support/http/resources/websession-detail.html index f127ed2b4b..49b5ee5fde 100644 --- a/src/main/resources/support/http/resources/websession-detail.html +++ b/src/main/resources/support/http/resources/websession-detail.html @@ -50,6 +50,10 @@ RequestTimeMillisTotal + + RequestInterval + + RunningCount