From a2b91a9030a10fefab2fa85a84f1d9c9ce8919a6 Mon Sep 17 00:00:00 2001
From: Eric Zhao
Date: Thu, 20 Dec 2018 17:09:25 +0800
Subject: [PATCH] Refactor the constructor and units of LeapArray and related
statistic class
- The constructor now accept `sampleCount` and `windowIntervalMs` so that it can match the two basic properties
Signed-off-by: Eric Zhao
---
.../csp/sentinel/node/IntervalProperty.java | 14 ++++----
.../csp/sentinel/node/StatisticNode.java | 16 +++++-----
.../sentinel/slots/block/RuleConstant.java | 3 ++
.../slots/statistic/base/LeapArray.java | 32 +++++++++++--------
.../slots/statistic/metric/ArrayMetric.java | 18 +++++++----
.../slots/statistic/metric/Metric.java | 4 +++
.../statistic/metric/MetricsLeapArray.java | 8 ++---
.../sentinel/base/metric/ArrayMetricTest.java | 1 -
.../base/metric/MetricsLeapArrayTest.java | 26 ++++++++-------
.../slots/statistic/base/LeapArrayTest.java | 6 ++--
.../flow/param/ParamFlowRuleManager.java | 1 -
.../block/flow/param/ParameterMetric.java | 19 +++++++++--
.../metric/HotParameterLeapArray.java | 15 +++------
.../metric/HotParameterLeapArrayTest.java | 6 ++--
14 files changed, 98 insertions(+), 71 deletions(-)
diff --git a/sentinel-core/src/main/java/com/alibaba/csp/sentinel/node/IntervalProperty.java b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/node/IntervalProperty.java
index ad877822..4f0dfa7b 100755
--- a/sentinel-core/src/main/java/com/alibaba/csp/sentinel/node/IntervalProperty.java
+++ b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/node/IntervalProperty.java
@@ -18,25 +18,27 @@ package com.alibaba.csp.sentinel.node;
import com.alibaba.csp.sentinel.log.RecordLog;
import com.alibaba.csp.sentinel.property.SentinelProperty;
import com.alibaba.csp.sentinel.property.SimplePropertyListener;
+import com.alibaba.csp.sentinel.slots.block.RuleConstant;
import com.alibaba.csp.sentinel.slots.clusterbuilder.ClusterBuilderSlot;
-/***
+/**
* QPS statistics interval.
*
* @author youji.zj
* @author jialiang.linjl
- * @author CarpenterLee
+ * @author Carpenter Lee
+ * @author Eric Zhao
*/
public class IntervalProperty {
/**
+ * Interval in milliseconds. This variable determines sensitivity of the QPS calculation.
*
- * Interval in seconds. This variable determines sensitivity of the QPS calculation.
- *
* DO NOT MODIFY this value directly, use {@link #updateInterval(int)}, otherwise the modification will not
* take effect.
+ *
*/
- public static volatile int INTERVAL = 1;
+ public static volatile int INTERVAL = RuleConstant.DEFAULT_WINDOW_INTERVAL_MS;
public static void register2Property(SentinelProperty property) {
property.addListener(new SimplePropertyListener() {
@@ -60,7 +62,7 @@ public class IntervalProperty {
INTERVAL = newInterval;
ClusterBuilderSlot.resetClusterNodes();
}
- RecordLog.info("INTERVAL updated to: " + INTERVAL);
+ RecordLog.info("[IntervalProperty] INTERVAL updated to: " + INTERVAL);
}
}
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 e12c7750..93621a0f 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
@@ -92,14 +92,14 @@ public class StatisticNode implements Node {
* Holds statistics of the recent {@code INTERVAL} seconds. The {@code INTERVAL} is divided into time spans
* by given {@code sampleCount}.
*/
- private transient volatile Metric rollingCounterInSecond = new ArrayMetric(1000 / SampleCountProperty.SAMPLE_COUNT,
+ private transient volatile Metric rollingCounterInSecond = new ArrayMetric(SampleCountProperty.SAMPLE_COUNT,
IntervalProperty.INTERVAL);
/**
* Holds statistics of the recent 60 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, 60);
+ private transient Metric rollingCounterInMinute = new ArrayMetric(60, 60 * 1000);
/**
* The counter for thread count.
@@ -142,7 +142,7 @@ public class StatisticNode implements Node {
@Override
public void reset() {
- rollingCounterInSecond = new ArrayMetric(1000 / SampleCountProperty.SAMPLE_COUNT, IntervalProperty.INTERVAL);
+ rollingCounterInSecond = new ArrayMetric(SampleCountProperty.SAMPLE_COUNT, IntervalProperty.INTERVAL);
}
@Override
@@ -158,7 +158,7 @@ public class StatisticNode implements Node {
@Override
public long blockQps() {
- return rollingCounterInSecond.block() / IntervalProperty.INTERVAL;
+ return rollingCounterInSecond.block() / (long) rollingCounterInSecond.getWindowIntervalInSec();
}
@Override
@@ -183,7 +183,7 @@ public class StatisticNode implements Node {
@Override
public long exceptionQps() {
- return rollingCounterInSecond.exception() / IntervalProperty.INTERVAL;
+ return rollingCounterInSecond.exception() / (long) rollingCounterInSecond.getWindowIntervalInSec();
}
@Override
@@ -193,17 +193,17 @@ public class StatisticNode implements Node {
@Override
public long passQps() {
- return rollingCounterInSecond.pass() / IntervalProperty.INTERVAL;
+ return rollingCounterInSecond.pass() / (long) rollingCounterInSecond.getWindowIntervalInSec();
}
@Override
public long successQps() {
- return rollingCounterInSecond.success() / IntervalProperty.INTERVAL;
+ return rollingCounterInSecond.success() / (long) rollingCounterInSecond.getWindowIntervalInSec();
}
@Override
public long maxSuccessQps() {
- return rollingCounterInSecond.maxSuccess() * SampleCountProperty.SAMPLE_COUNT;
+ return rollingCounterInSecond.maxSuccess() * rollingCounterInSecond.getSampleCount();
}
@Override
diff --git a/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/block/RuleConstant.java b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/block/RuleConstant.java
index 60e898a9..978b169f 100755
--- a/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/block/RuleConstant.java
+++ b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/block/RuleConstant.java
@@ -51,5 +51,8 @@ public final class RuleConstant {
public static final String LIMIT_APP_DEFAULT = "default";
public static final String LIMIT_APP_OTHER = "other";
+ public static final int DEFAULT_SAMPLE_COUNT = 2;
+ public static final int DEFAULT_WINDOW_INTERVAL_MS = 1000;
+
private RuleConstant() {}
}
diff --git a/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/statistic/base/LeapArray.java b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/statistic/base/LeapArray.java
index d3044f3c..2b089028 100755
--- a/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/statistic/base/LeapArray.java
+++ b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/statistic/base/LeapArray.java
@@ -54,20 +54,17 @@ public abstract class LeapArray {
/**
* The total bucket count is: {@code sampleCount = intervalInMs / windowLengthInMs}.
*
- * @param windowLengthInMs a single window bucket's time length in milliseconds.
- * @param intervalInSec the total time span of this {@link LeapArray} in seconds.
+ * @param sampleCount bucket count of the sliding window
+ * @param intervalInMs the total time interval of this {@link LeapArray} in milliseconds
*/
- public LeapArray(int windowLengthInMs, int intervalInSec) {
- // TODO: change `intervalInSec` to `intervalInMs`
- AssertUtil.isTrue(windowLengthInMs > 0, "bucket length is invalid: " + windowLengthInMs);
- int intervalInMs = intervalInSec * 1000;
- AssertUtil.isTrue(intervalInMs > windowLengthInMs,
- "total time span of the window should be greater than bucket length");
- AssertUtil.isTrue(intervalInMs % windowLengthInMs == 0, "time span needs to be evenly divided");
+ public LeapArray(int sampleCount, int intervalInMs) {
+ AssertUtil.isTrue(sampleCount > 0, "bucket count is invalid: " + sampleCount);
+ AssertUtil.isTrue(intervalInMs > 0, "total time interval of the sliding window should be positive");
+ AssertUtil.isTrue(intervalInMs % sampleCount == 0, "time span needs to be evenly divided");
- this.windowLengthInMs = windowLengthInMs;
+ this.windowLengthInMs = intervalInMs / sampleCount;
this.intervalInMs = intervalInMs;
- this.sampleCount = intervalInMs / windowLengthInMs;
+ this.sampleCount = sampleCount;
this.array = new AtomicReferenceArray>(sampleCount);
}
@@ -345,12 +342,21 @@ public abstract class LeapArray {
return sampleCount;
}
+ /**
+ * Get total interval length of the sliding window in milliseconds.
+ *
+ * @return interval in second
+ */
+ public int getIntervalInMs() {
+ return intervalInMs;
+ }
+
/**
* Get total interval length of the sliding window.
*
* @return interval in second
*/
- public int getIntervalInSecond() {
- return intervalInMs / 1000;
+ public double getIntervalInSecond() {
+ return intervalInMs / 1000.0;
}
}
diff --git a/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/statistic/metric/ArrayMetric.java b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/statistic/metric/ArrayMetric.java
index e0c75418..13c9748a 100755
--- a/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/statistic/metric/ArrayMetric.java
+++ b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/statistic/metric/ArrayMetric.java
@@ -33,12 +33,8 @@ public class ArrayMetric implements Metric {
private final MetricsLeapArray data;
- /**
- * @param windowLengthInMs a single window bucket's time length in milliseconds.
- * @param intervalInSec the total time span of this {@link ArrayMetric} in seconds.
- */
- public ArrayMetric(int windowLengthInMs, int intervalInSec) {
- this.data = new MetricsLeapArray(windowLengthInMs, intervalInSec);
+ public ArrayMetric(int sampleCount, int intervalInMs) {
+ this.data = new MetricsLeapArray(sampleCount, intervalInMs);
}
/**
@@ -229,4 +225,14 @@ public class ArrayMetric implements Metric {
}
return wrap.value().pass();
}
+
+ @Override
+ public double getWindowIntervalInSec() {
+ return data.getIntervalInSecond();
+ }
+
+ @Override
+ public int getSampleCount() {
+ return data.getSampleCount();
+ }
}
diff --git a/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/statistic/metric/Metric.java b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/statistic/metric/Metric.java
index 954614a3..2be447ac 100755
--- a/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/statistic/metric/Metric.java
+++ b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/statistic/metric/Metric.java
@@ -118,6 +118,10 @@ public interface Metric {
*/
void addRT(long rt);
+ double getWindowIntervalInSec();
+
+ int getSampleCount();
+
// Tool methods.
void debugQps();
diff --git a/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/statistic/metric/MetricsLeapArray.java b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/statistic/metric/MetricsLeapArray.java
index 2a1cda4b..1cee0dd6 100755
--- a/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/statistic/metric/MetricsLeapArray.java
+++ b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/statistic/metric/MetricsLeapArray.java
@@ -28,12 +28,8 @@ import com.alibaba.csp.sentinel.slots.statistic.base.WindowWrap;
*/
public class MetricsLeapArray extends LeapArray {
- /**
- * @param windowLengthInMs a single window bucket's time length in milliseconds.
- * @param intervalInSec the total time span of this {@link MetricsLeapArray} in seconds.
- */
- public MetricsLeapArray(int windowLengthInMs, int intervalInSec) {
- super(windowLengthInMs, intervalInSec);
+ public MetricsLeapArray(int sampleCount, int intervalInMs) {
+ super(sampleCount, intervalInMs);
}
@Override
diff --git a/sentinel-core/src/test/java/com/alibaba/csp/sentinel/base/metric/ArrayMetricTest.java b/sentinel-core/src/test/java/com/alibaba/csp/sentinel/base/metric/ArrayMetricTest.java
index 6df540cd..5b3eaac7 100755
--- a/sentinel-core/src/test/java/com/alibaba/csp/sentinel/base/metric/ArrayMetricTest.java
+++ b/sentinel-core/src/test/java/com/alibaba/csp/sentinel/base/metric/ArrayMetricTest.java
@@ -36,7 +36,6 @@ import static org.mockito.Mockito.*;
public class ArrayMetricTest {
private final int windowLengthInMs = 500;
- private final int intervalInSec = 1;
@Test
public void testOperateArrayMetric() {
diff --git a/sentinel-core/src/test/java/com/alibaba/csp/sentinel/base/metric/MetricsLeapArrayTest.java b/sentinel-core/src/test/java/com/alibaba/csp/sentinel/base/metric/MetricsLeapArrayTest.java
index 8998895c..b85ed68f 100755
--- a/sentinel-core/src/test/java/com/alibaba/csp/sentinel/base/metric/MetricsLeapArrayTest.java
+++ b/sentinel-core/src/test/java/com/alibaba/csp/sentinel/base/metric/MetricsLeapArrayTest.java
@@ -39,10 +39,12 @@ public class MetricsLeapArrayTest {
private final int windowLengthInMs = 1000;
private final int intervalInSec = 2;
+ private final int intervalInMs = intervalInSec * 1000;
+ private final int sampleCount = intervalInMs / windowLengthInMs;
@Test
public void testNewWindow() {
- MetricsLeapArray leapArray = new MetricsLeapArray(windowLengthInMs, intervalInSec);
+ MetricsLeapArray leapArray = new MetricsLeapArray(sampleCount, intervalInMs);
long time = TimeUtil.currentTimeMillis();
WindowWrap window = leapArray.currentWindow(time);
@@ -54,7 +56,7 @@ public class MetricsLeapArrayTest {
@Test
public void testLeapArrayWindowStart() {
- MetricsLeapArray leapArray = new MetricsLeapArray(windowLengthInMs, intervalInSec);
+ MetricsLeapArray leapArray = new MetricsLeapArray(sampleCount, intervalInMs);
long firstTime = TimeUtil.currentTimeMillis();
long previousWindowStart = firstTime - firstTime % windowLengthInMs;
@@ -66,7 +68,7 @@ public class MetricsLeapArrayTest {
@Test
public void testWindowAfterOneInterval() {
- MetricsLeapArray leapArray = new MetricsLeapArray(windowLengthInMs, intervalInSec);
+ MetricsLeapArray leapArray = new MetricsLeapArray(sampleCount, intervalInMs);
long firstTime = TimeUtil.currentTimeMillis();
long previousWindowStart = firstTime - firstTime % windowLengthInMs;
WindowWrap window = leapArray.currentWindow(previousWindowStart);
@@ -106,8 +108,8 @@ public class MetricsLeapArrayTest {
@Deprecated
public void testWindowDeprecatedRefresh() {
- MetricsLeapArray leapArray = new MetricsLeapArray(windowLengthInMs, intervalInSec);
- final int len = intervalInSec * 1000 / windowLengthInMs;
+ MetricsLeapArray leapArray = new MetricsLeapArray(sampleCount, intervalInMs);
+ final int len = sampleCount;
long firstTime = TimeUtil.currentTimeMillis();
List> firstIterWindowList = new ArrayList>(len);
for (int i = 0; i < len; i++) {
@@ -126,7 +128,7 @@ public class MetricsLeapArrayTest {
public void testMultiThreadUpdateEmptyWindow() throws Exception {
final long time = TimeUtil.currentTimeMillis();
final int nThreads = 16;
- final MetricsLeapArray leapArray = new MetricsLeapArray(windowLengthInMs, intervalInSec);
+ final MetricsLeapArray leapArray = new MetricsLeapArray(sampleCount, intervalInMs);
final CountDownLatch latch = new CountDownLatch(nThreads);
Runnable task = new Runnable() {
@Override
@@ -147,7 +149,7 @@ public class MetricsLeapArrayTest {
@Test
public void testGetPreviousWindow() {
- MetricsLeapArray leapArray = new MetricsLeapArray(windowLengthInMs, intervalInSec);
+ MetricsLeapArray leapArray = new MetricsLeapArray(sampleCount, intervalInMs);
long time = TimeUtil.currentTimeMillis();
WindowWrap previousWindow = leapArray.currentWindow(time);
assertNull(leapArray.getPreviousWindow(time));
@@ -162,10 +164,10 @@ public class MetricsLeapArrayTest {
@Test
public void testListWindowsResetOld() throws Exception {
final int windowLengthInMs = 100;
- final int intervalInSec = 1;
- final int intervalInMs = intervalInSec * 1000;
+ final int intervalInMs = 1000;
+ final int sampleCount = intervalInMs / windowLengthInMs;
- MetricsLeapArray leapArray = new MetricsLeapArray(windowLengthInMs, intervalInSec);
+ MetricsLeapArray leapArray = new MetricsLeapArray(sampleCount, intervalInMs);
long time = TimeUtil.currentTimeMillis();
Set> windowWraps = new HashSet>();
@@ -190,8 +192,10 @@ public class MetricsLeapArrayTest {
public void testListWindowsNewBucket() throws Exception {
final int windowLengthInMs = 100;
final int intervalInSec = 1;
+ final int intervalInMs = intervalInSec * 1000;
+ final int sampleCount = intervalInMs / windowLengthInMs;
- MetricsLeapArray leapArray = new MetricsLeapArray(windowLengthInMs, intervalInSec);
+ MetricsLeapArray leapArray = new MetricsLeapArray(sampleCount, intervalInMs);
long time = TimeUtil.currentTimeMillis();
Set> windowWraps = new HashSet>();
diff --git a/sentinel-core/src/test/java/com/alibaba/csp/sentinel/slots/statistic/base/LeapArrayTest.java b/sentinel-core/src/test/java/com/alibaba/csp/sentinel/slots/statistic/base/LeapArrayTest.java
index e5ccbda2..60a7dd8f 100644
--- a/sentinel-core/src/test/java/com/alibaba/csp/sentinel/slots/statistic/base/LeapArrayTest.java
+++ b/sentinel-core/src/test/java/com/alibaba/csp/sentinel/slots/statistic/base/LeapArrayTest.java
@@ -29,9 +29,9 @@ public class LeapArrayTest {
@Test
public void testGetValidHead() {
int windowLengthInMs = 100;
- int intervalInSec = 1;
- int sampleCount = intervalInSec * 1000 / windowLengthInMs;
- LeapArray leapArray = new LeapArray(windowLengthInMs, intervalInSec) {
+ int intervalInMs = 1000;
+ int sampleCount = intervalInMs / windowLengthInMs;
+ LeapArray leapArray = new LeapArray(sampleCount, intervalInMs) {
@Override
public AtomicInteger newEmptyBucket() {
return new AtomicInteger(0);
diff --git a/sentinel-extension/sentinel-parameter-flow-control/src/main/java/com/alibaba/csp/sentinel/slots/block/flow/param/ParamFlowRuleManager.java b/sentinel-extension/sentinel-parameter-flow-control/src/main/java/com/alibaba/csp/sentinel/slots/block/flow/param/ParamFlowRuleManager.java
index 3f60b840..dcd2c01f 100644
--- a/sentinel-extension/sentinel-parameter-flow-control/src/main/java/com/alibaba/csp/sentinel/slots/block/flow/param/ParamFlowRuleManager.java
+++ b/sentinel-extension/sentinel-parameter-flow-control/src/main/java/com/alibaba/csp/sentinel/slots/block/flow/param/ParamFlowRuleManager.java
@@ -16,7 +16,6 @@
package com.alibaba.csp.sentinel.slots.block.flow.param;
import java.util.ArrayList;
-import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
diff --git a/sentinel-extension/sentinel-parameter-flow-control/src/main/java/com/alibaba/csp/sentinel/slots/block/flow/param/ParameterMetric.java b/sentinel-extension/sentinel-parameter-flow-control/src/main/java/com/alibaba/csp/sentinel/slots/block/flow/param/ParameterMetric.java
index 2623eac4..028185f7 100644
--- a/sentinel-extension/sentinel-parameter-flow-control/src/main/java/com/alibaba/csp/sentinel/slots/block/flow/param/ParameterMetric.java
+++ b/sentinel-extension/sentinel-parameter-flow-control/src/main/java/com/alibaba/csp/sentinel/slots/block/flow/param/ParameterMetric.java
@@ -25,6 +25,7 @@ import com.alibaba.csp.sentinel.log.RecordLog;
import com.alibaba.csp.sentinel.node.IntervalProperty;
import com.alibaba.csp.sentinel.node.SampleCountProperty;
import com.alibaba.csp.sentinel.slots.statistic.metric.HotParameterLeapArray;
+import com.alibaba.csp.sentinel.util.AssertUtil;
/**
* Metrics for frequent ("hot spot") parameters.
@@ -34,6 +35,21 @@ import com.alibaba.csp.sentinel.slots.statistic.metric.HotParameterLeapArray;
*/
public class ParameterMetric {
+ private final int sampleCount;
+ private final int intervalMs;
+
+ public ParameterMetric() {
+ this(SampleCountProperty.SAMPLE_COUNT, IntervalProperty.INTERVAL);
+ }
+
+ public ParameterMetric(int sampleCount, int intervalInMs) {
+ AssertUtil.isTrue(sampleCount > 0, "sampleCount should be positive");
+ AssertUtil.isTrue(intervalInMs > 0, "window interval should be positive");
+ AssertUtil.isTrue(intervalInMs % sampleCount == 0, "time span needs to be evenly divided");
+ this.sampleCount = sampleCount;
+ this.intervalMs = intervalInMs;
+ }
+
private Map rollingParameters =
new ConcurrentHashMap();
@@ -50,8 +66,7 @@ public class ParameterMetric {
synchronized (this) {
// putIfAbsent
if (rollingParameters.get(index) == null) {
- rollingParameters.put(index, new HotParameterLeapArray(
- 1000 / SampleCountProperty.SAMPLE_COUNT, IntervalProperty.INTERVAL));
+ rollingParameters.put(index, new HotParameterLeapArray(sampleCount, intervalMs));
}
}
}
diff --git a/sentinel-extension/sentinel-parameter-flow-control/src/main/java/com/alibaba/csp/sentinel/slots/statistic/metric/HotParameterLeapArray.java b/sentinel-extension/sentinel-parameter-flow-control/src/main/java/com/alibaba/csp/sentinel/slots/statistic/metric/HotParameterLeapArray.java
index 1eab4402..b1fc7d94 100644
--- a/sentinel-extension/sentinel-parameter-flow-control/src/main/java/com/alibaba/csp/sentinel/slots/statistic/metric/HotParameterLeapArray.java
+++ b/sentinel-extension/sentinel-parameter-flow-control/src/main/java/com/alibaba/csp/sentinel/slots/statistic/metric/HotParameterLeapArray.java
@@ -37,15 +37,8 @@ import com.alibaba.csp.sentinel.slots.statistic.data.ParamMapBucket;
*/
public class HotParameterLeapArray extends LeapArray {
- private int intervalInSec;
-
- public HotParameterLeapArray(int windowLengthInMs, int intervalInSec) {
- super(windowLengthInMs, intervalInSec);
- this.intervalInSec = intervalInSec;
- }
-
- public int getIntervalInSec() {
- return intervalInSec;
+ public HotParameterLeapArray(int sampleCount, int intervalInMs) {
+ super(sampleCount, intervalInMs);
}
@Override
@@ -116,7 +109,7 @@ public class HotParameterLeapArray extends LeapArray {
if (x.getValue() == 0) {
break;
}
- doubleResult.put(x.getKey(), ((double)x.getValue()) / getIntervalInSec());
+ doubleResult.put(x.getKey(), ((double)x.getValue()) / getIntervalInSecond());
}
return doubleResult;
@@ -136,6 +129,6 @@ public class HotParameterLeapArray extends LeapArray {
}
public double getRollingAvg(RollingParamEvent event, Object value) {
- return ((double) getRollingSum(event, value)) / getIntervalInSec();
+ return ((double) getRollingSum(event, value)) / getIntervalInSecond();
}
}
diff --git a/sentinel-extension/sentinel-parameter-flow-control/src/test/java/com/alibaba/csp/sentinel/slots/statistic/metric/HotParameterLeapArrayTest.java b/sentinel-extension/sentinel-parameter-flow-control/src/test/java/com/alibaba/csp/sentinel/slots/statistic/metric/HotParameterLeapArrayTest.java
index b4056576..1ad029c3 100644
--- a/sentinel-extension/sentinel-parameter-flow-control/src/test/java/com/alibaba/csp/sentinel/slots/statistic/metric/HotParameterLeapArrayTest.java
+++ b/sentinel-extension/sentinel-parameter-flow-control/src/test/java/com/alibaba/csp/sentinel/slots/statistic/metric/HotParameterLeapArrayTest.java
@@ -60,7 +60,7 @@ public class HotParameterLeapArrayTest {
int a1 = 3, a2 = 5;
String paramPrefix = "param-";
HotParameterLeapArray leapArray = mock(HotParameterLeapArray.class);
- when(leapArray.getIntervalInSec()).thenReturn(intervalInSec);
+ when(leapArray.getIntervalInSecond()).thenReturn((double) intervalInSec);
final ParamMapBucket b1 = generateBucket(a1, paramPrefix);
final ParamMapBucket b2 = generateBucket(a2, paramPrefix);
@@ -122,8 +122,8 @@ public class HotParameterLeapArrayTest {
public void testGetRollingAvg() {
HotParameterLeapArray leapArray = mock(HotParameterLeapArray.class);
when(leapArray.getRollingSum(any(RollingParamEvent.class), any(Object.class))).thenReturn(15L);
- when(leapArray.getIntervalInSec()).thenReturn(1)
- .thenReturn(2);
+ when(leapArray.getIntervalInSecond()).thenReturn(1d)
+ .thenReturn(2d);
when(leapArray.getRollingAvg(any(RollingParamEvent.class), any(Object.class))).thenCallRealMethod();
assertEquals(15.0d, leapArray.getRollingAvg(RollingParamEvent.REQUEST_PASSED, "abc"), 0.001);