improved WebURIStat. for issue #1816

This commit is contained in:
wenshao
2017-07-13 01:30:33 +08:00
parent efccb6ccde
commit 31aa93a568
3 changed files with 61 additions and 0 deletions
@@ -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;
}
}