From 31aa93a5682b3f5db9c4f66568094623f0feea5c Mon Sep 17 00:00:00 2001 From: wenshao Date: Thu, 13 Jul 2017 01:30:33 +0800 Subject: [PATCH] improved WebURIStat. for issue #1816 --- .../druid/support/http/stat/WebURIStat.java | 26 +++++++++++++++ .../support/http/stat/WebURIStatValue.java | 33 +++++++++++++++++++ .../support/http/resources/weburi.html | 2 ++ 3 files changed, 61 insertions(+) diff --git a/src/main/java/com/alibaba/druid/support/http/stat/WebURIStat.java b/src/main/java/com/alibaba/druid/support/http/stat/WebURIStat.java index 97f4604e52..654d188936 100644 --- a/src/main/java/com/alibaba/druid/support/http/stat/WebURIStat.java +++ b/src/main/java/com/alibaba/druid/support/http/stat/WebURIStat.java @@ -32,6 +32,9 @@ public class WebURIStat { private volatile int concurrentMax; private volatile long requestCount; private volatile long requestTimeNano; + private volatile long requestTimeNanoMax; + private volatile long requestTimeNanoMaxOccurTime; + final static AtomicIntegerFieldUpdater runningCountUpdater = AtomicIntegerFieldUpdater.newUpdater(WebURIStat.class, "runningCount"); final static AtomicIntegerFieldUpdater concurrentMaxUpdater = AtomicIntegerFieldUpdater.newUpdater(WebURIStat.class, @@ -40,6 +43,11 @@ public class WebURIStat { "requestCount"); final static AtomicLongFieldUpdater requestTimeNanoUpdater = AtomicLongFieldUpdater.newUpdater(WebURIStat.class, "requestTimeNano"); + final static AtomicLongFieldUpdater requestTimeNanoMaxUpdater = AtomicLongFieldUpdater.newUpdater(WebURIStat.class, + "requestTimeNanoMax"); + + final static AtomicLongFieldUpdater requestTimeNanoMaxOccurTimeUpdater = AtomicLongFieldUpdater.newUpdater(WebURIStat.class, + "requestTimeNanoMaxOccurTime"); private volatile long jdbcFetchRowCount; private volatile long jdbcFetchRowPeak; // 单次请求读取行数的峰值 @@ -169,6 +177,22 @@ public void afterInvoke(Throwable error, long nanos) { runningCountUpdater.decrementAndGet(this); requestTimeNanoUpdater.addAndGet(this, nanos); + for (;;) { + long current = requestTimeNanoUpdater.get(this); + if (current < nanos) { + if (requestTimeNanoUpdater.compareAndSet(this, current, nanos)) { + // 可能不准确,但是绝大多数情况下都会正确,性能换取一致性 + requestTimeNanoMaxOccurTime = System.currentTimeMillis(); + + break; + } else { + continue; + } + } else { + break; + } + } + histogramRecord(nanos); if (error != null) { @@ -435,6 +459,8 @@ public WebURIStatValue getValue(boolean reset) { val.setConcurrentMax(get(this, concurrentMaxUpdater, reset)); val.setRequestCount(get(this, requestCountUpdater, reset)); val.setRequestTimeNano(get(this, requestTimeNanoUpdater, reset)); + val.setRequestTimeNanoMax(get(this, requestTimeNanoMaxUpdater, reset)); + val.setRequestTimeNanoMaxOccurTime(get(this, requestTimeNanoMaxOccurTimeUpdater, reset)); val.setJdbcFetchRowCount(get(this, jdbcFetchRowCountUpdater, reset)); val.setJdbcFetchRowPeak(get(this, jdbcFetchRowPeakUpdater, reset)); diff --git a/src/main/java/com/alibaba/druid/support/http/stat/WebURIStatValue.java b/src/main/java/com/alibaba/druid/support/http/stat/WebURIStatValue.java index 729bbb77df..1aaf259b0c 100644 --- a/src/main/java/com/alibaba/druid/support/http/stat/WebURIStatValue.java +++ b/src/main/java/com/alibaba/druid/support/http/stat/WebURIStatValue.java @@ -44,6 +44,12 @@ public class WebURIStatValue { @MField(aggregate = AggregateType.Sum) protected long requestTimeNano; + @MField(aggregate = AggregateType.Max) + protected long requestTimeNanoMax; + + @MField(aggregate = AggregateType.Last) + protected Date requestTimeNanoMaxOccurTime; + @MField(aggregate = AggregateType.Sum) protected long jdbcFetchRowCount; @@ -177,6 +183,26 @@ public void setRequestTimeNano(long requestTimeNano) { this.requestTimeNano = requestTimeNano; } + public long getRequestTimeNanoMax() { + return requestTimeNanoMax; + } + + public void setRequestTimeNanoMax(long requestTimeNanoMax) { + this.requestTimeNanoMax = requestTimeNanoMax; + } + + public Date getRequestTimeNanoMaxOccurTime() { + return requestTimeNanoMaxOccurTime; + } + + public void setRequestTimeNanoMaxOccurTime(long requestTimeNanoMaxOccurTime) { + if (requestTimeNanoMaxOccurTime > 0) { + this.requestTimeNanoMaxOccurTime = new Date(requestTimeNanoMaxOccurTime); + } else { + this.requestTimeNanoMaxOccurTime = null; + } + } + public long getJdbcFetchRowCount() { return jdbcFetchRowCount; } @@ -309,6 +335,10 @@ public long getRequestTimeMillis() { return getRequestTimeNano() / (1000 * 1000); } + public long getRequestTimeMillisMax() { + return getRequestTimeNanoMax() / (1000 * 1000); + } + public Date getLastAccessTime() { return lastAccessTime; } @@ -358,6 +388,9 @@ public Map getStatData() { data.put("Profiles", profileDataList); } + data.put("RequestTimeMillisMax", this.getRequestTimeMillisMax()); + data.put("RequestTimeMillisMaxOccurTime", this.getRequestTimeNanoMaxOccurTime()); + return data; } } diff --git a/src/main/resources/support/http/resources/weburi.html b/src/main/resources/support/http/resources/weburi.html index 0bb79588c2..b9491d5127 100644 --- a/src/main/resources/support/http/resources/weburi.html +++ b/src/main/resources/support/http/resources/weburi.html @@ -37,6 +37,7 @@

URI RequestCount RequestTimeMillis + RequestTimeMillisMax RunningCount ConcurrentMax JdbcExecuteCount @@ -124,6 +125,7 @@

html += "" + '' + druid.common.subSqlString(stat.URI, 64) + '' + ""; html += "" + replace(stat.RequestCount) + ""; html += "" + replace(stat.RequestTimeMillis) + ""; + html += "" + replace(stat.RequestTimeMillisMax) + ""; html += "" + replace(stat.RunningCount) + ""; html += "" + replace(stat.ConcurrentMax) + ""; html += "" + replace(stat.JdbcExecuteCount) + "";