mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
improved WebURIStat. for issue #1816
This commit is contained in:
@@ -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<WebURIStat> runningCountUpdater = AtomicIntegerFieldUpdater.newUpdater(WebURIStat.class,
|
||||
"runningCount");
|
||||
final static AtomicIntegerFieldUpdater<WebURIStat> concurrentMaxUpdater = AtomicIntegerFieldUpdater.newUpdater(WebURIStat.class,
|
||||
@@ -40,6 +43,11 @@ public class WebURIStat {
|
||||
"requestCount");
|
||||
final static AtomicLongFieldUpdater<WebURIStat> requestTimeNanoUpdater = AtomicLongFieldUpdater.newUpdater(WebURIStat.class,
|
||||
"requestTimeNano");
|
||||
final static AtomicLongFieldUpdater<WebURIStat> requestTimeNanoMaxUpdater = AtomicLongFieldUpdater.newUpdater(WebURIStat.class,
|
||||
"requestTimeNanoMax");
|
||||
|
||||
final static AtomicLongFieldUpdater<WebURIStat> requestTimeNanoMaxOccurTimeUpdater = AtomicLongFieldUpdater.newUpdater(WebURIStat.class,
|
||||
"requestTimeNanoMaxOccurTime");
|
||||
|
||||
private volatile long jdbcFetchRowCount;
|
||||
private volatile long jdbcFetchRowPeak; // 单次请求读取行数的峰值
|
||||
@@ -169,6 +177,22 @@ public class WebURIStat {
|
||||
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 class WebURIStat {
|
||||
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));
|
||||
|
||||
@@ -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 class WebURIStatValue {
|
||||
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 class WebURIStatValue {
|
||||
return getRequestTimeNano() / (1000 * 1000);
|
||||
}
|
||||
|
||||
public long getRequestTimeMillisMax() {
|
||||
return getRequestTimeNanoMax() / (1000 * 1000);
|
||||
}
|
||||
|
||||
public Date getLastAccessTime() {
|
||||
return lastAccessTime;
|
||||
}
|
||||
@@ -358,6 +388,9 @@ public class WebURIStatValue {
|
||||
data.put("Profiles", profileDataList);
|
||||
}
|
||||
|
||||
data.put("RequestTimeMillisMax", this.getRequestTimeMillisMax());
|
||||
data.put("RequestTimeMillisMaxOccurTime", this.getRequestTimeNanoMaxOccurTime());
|
||||
|
||||
return data;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user