From 44409182aea366dbba4a216d50cfaf0f0c2e15c1 Mon Sep 17 00:00:00 2001 From: cdfive <31885791+cdfive@users.noreply.github.com> Date: Sat, 29 Dec 2018 09:52:18 +0800 Subject: [PATCH] Make the default statistic max RT value `TIME_DROP_VALVE` configurable (#292) @see https://github.com/alibaba/Sentinel/issues/276 --- .../com/alibaba/csp/sentinel/Constants.java | 6 +- .../csp/sentinel/config/SentinelConfig.java | 40 ++++++++++-- .../slots/block/flow/ColdFactorProperty.java | 21 +------ .../alibaba/csp/sentinel/ConstantsTest.java | 25 ++++++++ .../sentinel/config/SentinelConfigTest.java | 61 +++++++++++++++++++ 5 files changed, 127 insertions(+), 26 deletions(-) create mode 100644 sentinel-core/src/test/java/com/alibaba/csp/sentinel/ConstantsTest.java create mode 100644 sentinel-core/src/test/java/com/alibaba/csp/sentinel/config/SentinelConfigTest.java diff --git a/sentinel-core/src/main/java/com/alibaba/csp/sentinel/Constants.java b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/Constants.java index 124f5f29..db70ba67 100755 --- a/sentinel-core/src/main/java/com/alibaba/csp/sentinel/Constants.java +++ b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/Constants.java @@ -15,6 +15,7 @@ */ package com.alibaba.csp.sentinel; +import com.alibaba.csp.sentinel.config.SentinelConfig; import com.alibaba.csp.sentinel.node.ClusterNode; import com.alibaba.csp.sentinel.node.DefaultNode; import com.alibaba.csp.sentinel.node.EntranceNode; @@ -47,8 +48,11 @@ public final class Constants { /** * Response time that exceeds TIME_DROP_VALVE will be calculated as TIME_DROP_VALVE. + * Default value is 4900 ms + * It can be configured by property file or JVM parameter -Dcsp.sentinel.statistic.max.rt=xxx + * See {@link SentinelConfig#statisticMaxRt()} */ - public final static int TIME_DROP_VALVE = 4900; + public static int TIME_DROP_VALVE = SentinelConfig.statisticMaxRt(); /** * The global switch for Sentinel. diff --git a/sentinel-core/src/main/java/com/alibaba/csp/sentinel/config/SentinelConfig.java b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/config/SentinelConfig.java index 2874c1e1..e2971e79 100755 --- a/sentinel-core/src/main/java/com/alibaba/csp/sentinel/config/SentinelConfig.java +++ b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/config/SentinelConfig.java @@ -25,7 +25,6 @@ import com.alibaba.csp.sentinel.log.LogBase; import com.alibaba.csp.sentinel.log.RecordLog; import com.alibaba.csp.sentinel.util.AppNameUtil; import com.alibaba.csp.sentinel.util.AssertUtil; -import com.alibaba.csp.sentinel.util.StringUtil; /** * The universal config of Courier. The config is retrieved from @@ -41,9 +40,13 @@ public class SentinelConfig { public static final String SINGLE_METRIC_FILE_SIZE = "csp.sentinel.metric.file.single.size"; public static final String TOTAL_METRIC_FILE_COUNT = "csp.sentinel.metric.file.total.count"; public static final String COLD_FACTOR = "csp.sentinel.flow.cold.factor"; + public static final String STATISTIC_MAX_RT = "csp.sentinel.statistic.max.rt"; + static final String DEFAULT_CHARSET = "UTF-8"; static final long DEFAULT_SINGLE_METRIC_FILE_SIZE = 1024 * 1024 * 50; static final int DEFAULT_TOTAL_METRIC_FILE_COUNT = 6; + static final int DEFAULT_COLD_FACTOR = 3; + static final int DEFAULT_STATISTIC_MAX_RT = 4900; static { initialize(); @@ -52,10 +55,11 @@ public class SentinelConfig { private static void initialize() { // Init default properties. - SentinelConfig.setConfig(CHARSET, "UTF-8"); + SentinelConfig.setConfig(CHARSET, DEFAULT_CHARSET); SentinelConfig.setConfig(SINGLE_METRIC_FILE_SIZE, String.valueOf(DEFAULT_SINGLE_METRIC_FILE_SIZE)); SentinelConfig.setConfig(TOTAL_METRIC_FILE_COUNT, String.valueOf(DEFAULT_TOTAL_METRIC_FILE_COUNT)); - SentinelConfig.setConfig(COLD_FACTOR, String.valueOf(3)); + SentinelConfig.setConfig(COLD_FACTOR, String.valueOf(DEFAULT_COLD_FACTOR)); + SentinelConfig.setConfig(STATISTIC_MAX_RT, String.valueOf(DEFAULT_STATISTIC_MAX_RT)); } private static void loadProps() { @@ -139,7 +143,7 @@ public class SentinelConfig { try { return Long.parseLong(props.get(SINGLE_METRIC_FILE_SIZE)); } catch (Throwable throwable) { - RecordLog.info("[SentinelConfig] Parse singleMetricFileSize fail, use default value: " + RecordLog.warn("[SentinelConfig] Parse singleMetricFileSize fail, use default value: " + DEFAULT_SINGLE_METRIC_FILE_SIZE, throwable); return DEFAULT_SINGLE_METRIC_FILE_SIZE; } @@ -149,9 +153,35 @@ public class SentinelConfig { try { return Integer.parseInt(props.get(TOTAL_METRIC_FILE_COUNT)); } catch (Throwable throwable) { - RecordLog.info("[SentinelConfig] Parse totalMetricFileCount fail, use default value: " + RecordLog.warn("[SentinelConfig] Parse totalMetricFileCount fail, use default value: " + DEFAULT_TOTAL_METRIC_FILE_COUNT, throwable); return DEFAULT_TOTAL_METRIC_FILE_COUNT; } } + + public static int coldFactor() { + try { + int coldFactor = Integer.parseInt(props.get(COLD_FACTOR)); + if (coldFactor <= 1) {// check the cold factor larger than 1 + coldFactor = DEFAULT_COLD_FACTOR; + RecordLog.warn("cold factor=" + coldFactor + ", should be larger than 1, use default value: " + + DEFAULT_COLD_FACTOR); + } + return coldFactor; + } catch (Throwable throwable) { + RecordLog.warn("[SentinelConfig] Parse coldFactor fail, use default value: " + + DEFAULT_COLD_FACTOR, throwable); + return DEFAULT_COLD_FACTOR; + } + } + + public static int statisticMaxRt() { + try { + return Integer.parseInt(props.get(STATISTIC_MAX_RT)); + } catch (Throwable throwable) { + RecordLog.warn("[SentinelConfig] Parse statisticMaxRt fail, use default value: " + + DEFAULT_STATISTIC_MAX_RT, throwable); + return DEFAULT_STATISTIC_MAX_RT; + } + } } diff --git a/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/block/flow/ColdFactorProperty.java b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/block/flow/ColdFactorProperty.java index 679d86af..0a08baee 100755 --- a/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/block/flow/ColdFactorProperty.java +++ b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/block/flow/ColdFactorProperty.java @@ -16,30 +16,11 @@ package com.alibaba.csp.sentinel.slots.block.flow; import com.alibaba.csp.sentinel.config.SentinelConfig; -import com.alibaba.csp.sentinel.log.RecordLog; -import com.alibaba.csp.sentinel.util.StringUtil; /** * @author jialiang.linjl */ class ColdFactorProperty { - public static volatile int coldFactor = 3; - static { - String strConfig = SentinelConfig.getConfig(SentinelConfig.COLD_FACTOR); - if (StringUtil.isBlank(strConfig)) { - coldFactor = 3; - } else { - try { - coldFactor = Integer.valueOf(strConfig); - } catch (NumberFormatException e) { - RecordLog.info(e.getMessage(), e); - } - - if (coldFactor <= 1) { - coldFactor = 3; - RecordLog.info("cold factor should be larger than 3"); - } - } - } + public static volatile int coldFactor = SentinelConfig.coldFactor(); } diff --git a/sentinel-core/src/test/java/com/alibaba/csp/sentinel/ConstantsTest.java b/sentinel-core/src/test/java/com/alibaba/csp/sentinel/ConstantsTest.java new file mode 100644 index 00000000..03084270 --- /dev/null +++ b/sentinel-core/src/test/java/com/alibaba/csp/sentinel/ConstantsTest.java @@ -0,0 +1,25 @@ +package com.alibaba.csp.sentinel; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +/** + * Test cases for {@link Constants}. + * + * @author cdfive + */ +public class ConstantsTest { + + @Test + public void testDefaultTimeDropValue() { + assertEquals(4900, Constants.TIME_DROP_VALVE); + } + +// add JVM parameter +// -Dcsp.sentinel.statistic.max.rt=10000 +// @Test + public void testCustomTimeDropValue() { + assertEquals(10000, Constants.TIME_DROP_VALVE); + } +} \ No newline at end of file diff --git a/sentinel-core/src/test/java/com/alibaba/csp/sentinel/config/SentinelConfigTest.java b/sentinel-core/src/test/java/com/alibaba/csp/sentinel/config/SentinelConfigTest.java new file mode 100644 index 00000000..51ecb9a7 --- /dev/null +++ b/sentinel-core/src/test/java/com/alibaba/csp/sentinel/config/SentinelConfigTest.java @@ -0,0 +1,61 @@ +package com.alibaba.csp.sentinel.config; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +/** + * Test cases for {@link SentinelConfig}. + * + * @author cdfive + */ +public class SentinelConfigTest { + + @Test + public void testDefaultConfig() { + assertEquals(SentinelConfig.DEFAULT_CHARSET, SentinelConfig.charset()); + assertEquals(SentinelConfig.DEFAULT_SINGLE_METRIC_FILE_SIZE, SentinelConfig.singleMetricFileSize()); + assertEquals(SentinelConfig.DEFAULT_TOTAL_METRIC_FILE_COUNT, SentinelConfig.totalMetricFileCount()); + assertEquals(SentinelConfig.DEFAULT_COLD_FACTOR, SentinelConfig.coldFactor()); + assertEquals(SentinelConfig.DEFAULT_STATISTIC_MAX_RT, SentinelConfig.statisticMaxRt()); + } + +// add JVM parameter +// -Dcsp.sentinel.charset=gbk +// -Dcsp.sentinel.metric.file.single.size=104857600 +// -Dcsp.sentinel.metric.file.total.count=10 +// -Dcsp.sentinel.flow.cold.factor=5 +// -Dcsp.sentinel.statistic.max.rt=10000 +// @Test + public void testCustomConfig() { + assertEquals("gbk", SentinelConfig.charset()); + assertEquals(104857600L, SentinelConfig.singleMetricFileSize()); + assertEquals(10, SentinelConfig.totalMetricFileCount()); + assertEquals(5, SentinelConfig.coldFactor()); + assertEquals(10000, SentinelConfig.statisticMaxRt()); + } + + + /** + * when set code factor alue equal or smaller than 1, get value + * in SentinelConfig.coldFactor() will return DEFAULT_COLD_FACTOR + * see {@link SentinelConfig#coldFactor()} + */ + @Test + public void testColdFactorEqualOrSmallerThanOne() { + SentinelConfig.setConfig(SentinelConfig.COLD_FACTOR, "0.5"); + assertEquals(SentinelConfig.DEFAULT_COLD_FACTOR, SentinelConfig.coldFactor()); + + SentinelConfig.setConfig(SentinelConfig.COLD_FACTOR, "1"); + assertEquals(SentinelConfig.DEFAULT_COLD_FACTOR, SentinelConfig.coldFactor()); + } + + @Test + public void testColdFactoryLargerThanOne() { + SentinelConfig.setConfig(SentinelConfig.COLD_FACTOR, "2"); + assertEquals(2, SentinelConfig.coldFactor()); + + SentinelConfig.setConfig(SentinelConfig.COLD_FACTOR, "4"); + assertEquals(4, SentinelConfig.coldFactor()); + } +} \ No newline at end of file