diff --git a/sentinel-core/src/main/java/com/alibaba/csp/sentinel/node/StatisticNode.java b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/node/StatisticNode.java index 4f6eb275..a3e5418b 100755 --- a/sentinel-core/src/main/java/com/alibaba/csp/sentinel/node/StatisticNode.java +++ b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/node/StatisticNode.java @@ -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 metrics = new ConcurrentHashMap(); - List minutes = rollingCounterInMinute.details(); - for (MetricNode node : minutes) { + List 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; }