Browse Source

Bug fix: fix probability of metric lose

master
Carpenter Lee 6 years ago
parent
commit
b5b3f6edee
1 changed files with 14 additions and 4 deletions
  1. +14
    -4
      sentinel-core/src/main/java/com/alibaba/csp/sentinel/node/StatisticNode.java

+ 14
- 4
sentinel-core/src/main/java/com/alibaba/csp/sentinel/node/StatisticNode.java View File

@@ -34,6 +34,10 @@ public class StatisticNode implements Node {
private transient Metric rollingCounterInSecond = new ArrayMetric(1000 / SampleCountProperty.sampleCount,
IntervalProperty.INTERVAL);

/**
* Holds statistics of the recent 120 seconds. The windowLengthInMs is deliberately set to 1000 milliseconds,
* meaning each bucket per second, in this way we can get accurate statistics of each second.
*/
private transient Metric rollingCounterInMinute = new ArrayMetric(1000, 2 * 60);

private AtomicInteger curThreadNum = new AtomicInteger(0);
@@ -45,15 +49,21 @@ public class StatisticNode implements Node {
long currentTime = TimeUtil.currentTimeMillis();
currentTime = currentTime - currentTime % 1000;
Map<Long, MetricNode> metrics = new ConcurrentHashMap<Long, MetricNode>();
List<MetricNode> minutes = rollingCounterInMinute.details();
for (MetricNode node : minutes) {
List<MetricNode> nodesOfEverySecond = rollingCounterInMinute.details();
long newLastFetchTime = lastFetchTime;
for (MetricNode node : nodesOfEverySecond) {
if (node.getTimestamp() > lastFetchTime && node.getTimestamp() < currentTime) {
if (node.getPassedQps() != 0 || node.getBlockedQps() != 0) {
if (node.getPassedQps() != 0
|| node.getBlockedQps() != 0
|| node.getSuccessQps() != 0
|| node.getException() != 0
|| node.getRt() != 0) {
metrics.put(node.getTimestamp(), node);
lastFetchTime = node.getTimestamp();
newLastFetchTime = Math.max(newLastFetchTime, node.getTimestamp());
}
}
}
lastFetchTime = newLastFetchTime;

return metrics;
}


Loading…
Cancel
Save