From ff33de199ab165827bf83a4a894bcfed95aeb731 Mon Sep 17 00:00:00 2001 From: "Lin.Liang" <546648227@qq.com> Date: Mon, 8 Jul 2019 19:06:55 +0800 Subject: [PATCH] Support arbitrary configuration properties file path for Sentinel (#804) - Support customized log and configuration properties directory --- .../csp/sentinel/config/SentinelConfig.java | 55 ++----- .../sentinel/config/SentinelConfigLoader.java | 95 +++++++++++ .../com/alibaba/csp/sentinel/log/LogBase.java | 125 +++++++++------ .../csp/sentinel/log/LogConfigLoader.java | 78 ++++++++++ .../csp/sentinel/util/AppNameUtil.java | 4 +- .../alibaba/csp/sentinel/util/ConfigUtil.java | 147 ++++++++++++++++++ .../sentinel/config/SentinelConfigTest.java | 57 ++++++- .../alibaba/csp/sentinel/log/LogBaseTest.java | 79 ++++++++++ .../csp/sentinel/util/ConfigUtilTest.java | 84 ++++++++++ 9 files changed, 629 insertions(+), 95 deletions(-) create mode 100644 sentinel-core/src/main/java/com/alibaba/csp/sentinel/config/SentinelConfigLoader.java create mode 100644 sentinel-core/src/main/java/com/alibaba/csp/sentinel/log/LogConfigLoader.java create mode 100644 sentinel-core/src/main/java/com/alibaba/csp/sentinel/util/ConfigUtil.java create mode 100644 sentinel-core/src/test/java/com/alibaba/csp/sentinel/log/LogBaseTest.java create mode 100644 sentinel-core/src/test/java/com/alibaba/csp/sentinel/util/ConfigUtilTest.java 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 90c43c8b..10ca6ae9 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 @@ -15,17 +15,13 @@ */ package com.alibaba.csp.sentinel.config; -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 java.io.File; -import java.io.FileInputStream; import java.util.Map; import java.util.Properties; import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.CopyOnWriteArraySet; /** * The universal local config center of Sentinel. The config is retrieved from command line arguments @@ -64,7 +60,6 @@ public class SentinelConfig { try { initialize(); loadProps(); - resolveAppType(); RecordLog.info("[SentinelConfig] Application type resolved: " + appType); } catch (Throwable ex) { @@ -91,49 +86,19 @@ public class SentinelConfig { private static void initialize() { // Init default properties. - 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(DEFAULT_COLD_FACTOR)); - SentinelConfig.setConfig(STATISTIC_MAX_RT, String.valueOf(DEFAULT_STATISTIC_MAX_RT)); + setConfig(CHARSET, DEFAULT_CHARSET); + setConfig(SINGLE_METRIC_FILE_SIZE, String.valueOf(DEFAULT_SINGLE_METRIC_FILE_SIZE)); + setConfig(TOTAL_METRIC_FILE_COUNT, String.valueOf(DEFAULT_TOTAL_METRIC_FILE_COUNT)); + setConfig(COLD_FACTOR, String.valueOf(DEFAULT_COLD_FACTOR)); + setConfig(STATISTIC_MAX_RT, String.valueOf(DEFAULT_STATISTIC_MAX_RT)); } private static void loadProps() { - // Resolve app name. - AppNameUtil.resolveAppName(); - try { - String appName = AppNameUtil.getAppName(); - if (appName == null) { - appName = ""; - } - // We first retrieve the properties from the property file. - String fileName = LogBase.getLogBaseDir() + appName + ".properties"; - File file = new File(fileName); - if (file.exists()) { - RecordLog.info("[SentinelConfig] Reading config from " + fileName); - FileInputStream fis = new FileInputStream(fileName); - Properties fileProps = new Properties(); - fileProps.load(fis); - fis.close(); - - for (Object key : fileProps.keySet()) { - SentinelConfig.setConfig((String)key, (String)fileProps.get(key)); - } - } - } catch (Throwable ioe) { - RecordLog.info(ioe.getMessage(), ioe); + Properties properties = SentinelConfigLoader.getProperties(); + for (Object key : properties.keySet()) { + setConfig((String) key, (String) properties.get(key)); } - // JVM parameter override file config. - for (Map.Entry entry : new CopyOnWriteArraySet<>(System.getProperties().entrySet())) { - String configKey = entry.getKey().toString(); - String configValue = entry.getValue().toString(); - String configValueOld = getConfig(configKey); - SentinelConfig.setConfig(configKey, configValue); - if (configValueOld != null) { - RecordLog.info("[SentinelConfig] JVM parameter overrides {0}: {1} -> {2}", configKey, configValueOld, configValue); - } - } } /** @@ -190,7 +155,7 @@ public class SentinelConfig { return Long.parseLong(props.get(SINGLE_METRIC_FILE_SIZE)); } catch (Throwable throwable) { RecordLog.warn("[SentinelConfig] Parse singleMetricFileSize fail, use default value: " - + DEFAULT_SINGLE_METRIC_FILE_SIZE, throwable); + + DEFAULT_SINGLE_METRIC_FILE_SIZE, throwable); return DEFAULT_SINGLE_METRIC_FILE_SIZE; } } @@ -200,7 +165,7 @@ public class SentinelConfig { return Integer.parseInt(props.get(TOTAL_METRIC_FILE_COUNT)); } catch (Throwable throwable) { RecordLog.warn("[SentinelConfig] Parse totalMetricFileCount fail, use default value: " - + DEFAULT_TOTAL_METRIC_FILE_COUNT, throwable); + + DEFAULT_TOTAL_METRIC_FILE_COUNT, throwable); return DEFAULT_TOTAL_METRIC_FILE_COUNT; } } diff --git a/sentinel-core/src/main/java/com/alibaba/csp/sentinel/config/SentinelConfigLoader.java b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/config/SentinelConfigLoader.java new file mode 100644 index 00000000..481d2279 --- /dev/null +++ b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/config/SentinelConfigLoader.java @@ -0,0 +1,95 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.csp.sentinel.config; + +import com.alibaba.csp.sentinel.log.RecordLog; +import com.alibaba.csp.sentinel.util.AppNameUtil; +import com.alibaba.csp.sentinel.util.ConfigUtil; +import com.alibaba.csp.sentinel.util.StringUtil; + +import java.io.File; +import java.util.Map; +import java.util.Properties; +import java.util.concurrent.CopyOnWriteArraySet; + +import static com.alibaba.csp.sentinel.util.ConfigUtil.addSeparator; + +/** + *

+ * class responsible for loading the Sentinel Core configuration + *

+ * + * @author lianglin + * @since 1.7.0 + */ +public class SentinelConfigLoader { + + + private static final String DIR_NAME = "logs" + File.separator + "csp"; + private static final String USER_HOME = "user.home"; + + public static final String SENTINEL_CONFIG = "csp.sentinel.config.file"; + private static String DEFAULT_SENTINEL_CONFIG_FILE = "classpath:sentinel.properties"; + + + private static Properties properties = new Properties(); + + static { + load(); + } + + + private static void load() { + + String fileName = System.getProperty(SENTINEL_CONFIG); + if (StringUtil.isBlank(fileName)) { + fileName = DEFAULT_SENTINEL_CONFIG_FILE; + } + + Properties p = ConfigUtil.loadProperties(fileName); + + //old version config file + if (p == null) { + String path = addSeparator(System.getProperty(USER_HOME)) + DIR_NAME + File.separator; + fileName = path + AppNameUtil.getAppName() + ".properties"; + File file = new File(fileName); + if (file.exists()) { + p = ConfigUtil.loadProperties(fileName); + } + } + + if (p != null && !p.isEmpty()) { + properties.putAll(p); + } + + for (Map.Entry entry : new CopyOnWriteArraySet<>(System.getProperties().entrySet())) { + String configKey = entry.getKey().toString(); + String newConfigValue = entry.getValue().toString(); + String oldConfigValue = properties.getProperty(configKey); + properties.put(configKey, newConfigValue); + if (oldConfigValue != null) { + RecordLog.info("[SentinelConfig] JVM parameter overrides {0}: {1} -> {2}", configKey, oldConfigValue, newConfigValue); + } + } + } + + + public static Properties getProperties() { + return properties; + } + + +} diff --git a/sentinel-core/src/main/java/com/alibaba/csp/sentinel/log/LogBase.java b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/log/LogBase.java index 9d8b990d..1b6de9c2 100755 --- a/sentinel-core/src/main/java/com/alibaba/csp/sentinel/log/LogBase.java +++ b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/log/LogBase.java @@ -15,14 +15,16 @@ */ package com.alibaba.csp.sentinel.log; +import com.alibaba.csp.sentinel.util.PidUtil; + import java.io.File; import java.io.IOException; +import java.util.Properties; import java.util.logging.Handler; import java.util.logging.Level; import java.util.logging.Logger; -import com.alibaba.csp.sentinel.util.PidUtil; -import com.alibaba.csp.sentinel.util.StringUtil; +import static com.alibaba.csp.sentinel.util.ConfigUtil.addSeparator; /** * Default log base dir is ${user.home}/logs/csp/, we can use {@link #LOG_DIR} System property to override it. @@ -34,67 +36,81 @@ import com.alibaba.csp.sentinel.util.StringUtil; */ public class LogBase { - public static final String LOG_CHARSET = "utf-8"; - - // Output biz log(RecordLog,CommandCenterLog) to file - public static final String LOG_OUTPUT_TYPE_FILE = "file"; - // Output biz log(RecordLog,CommandCenterLog) to console - public static final String LOG_OUTPUT_TYPE_CONSOLE = "console"; private static final String DIR_NAME = "logs" + File.separator + "csp"; - private static final String USER_HOME = "user.home"; - - // Output type of biz log(RecordLog,CommandCenterLog) - public static final String LOG_OUTPUT_TYPE = "csp.sentinel.log.output.type"; public static final String LOG_DIR = "csp.sentinel.log.dir"; public static final String LOG_NAME_USE_PID = "csp.sentinel.log.use.pid"; + public static final String LOG_OUTPUT_TYPE = "csp.sentinel.log.output.type"; + public static final String LOG_CHARSET = "csp.sentinel.log.charset"; + public static final String USER_HOME = "user.home"; + /** + * Output biz log(RecordLog,CommandCenterLog) to file + */ + public static final String LOG_OUTPUT_TYPE_FILE = "file"; + /** + * Output biz log(RecordLog,CommandCenterLog) to console + */ + public static final String LOG_OUTPUT_TYPE_CONSOLE = "console"; + public static final String LOG_CHARSET_UTF8 = "utf-8"; + + private static boolean logNameUsePid; private static String logOutputType; private static String logBaseDir; - private static boolean logNameUsePid = false; + private static String logCharSet; + static { try { - init(); + initialize(); + loadProperties(); } catch (Throwable t) { System.err.println("[LogBase] FATAL ERROR when initializing log class"); t.printStackTrace(); } } - private static void init() { - logOutputType = System.getProperty(LOG_OUTPUT_TYPE); + private static void initialize() { + logNameUsePid = false; + logOutputType = LOG_OUTPUT_TYPE_FILE; + logBaseDir = addSeparator(System.getProperty(USER_HOME)) + DIR_NAME + File.separator; + logCharSet = LOG_CHARSET_UTF8; + } - // By default, output biz log(RecordLog,CommandCenterLog) to file - if (StringUtil.isBlank(logOutputType)) { - logOutputType = LOG_OUTPUT_TYPE_FILE; - } else if (!LOG_OUTPUT_TYPE_FILE.equalsIgnoreCase(logOutputType) && !LOG_OUTPUT_TYPE_CONSOLE.equalsIgnoreCase(logOutputType)) { + private static void loadProperties() { + + Properties properties = LogConfigLoader.getProperties(); + + logOutputType = properties.get(LOG_OUTPUT_TYPE) == null ? logOutputType : properties.getProperty(LOG_OUTPUT_TYPE); + if (!LOG_OUTPUT_TYPE_FILE.equalsIgnoreCase(logOutputType) && !LOG_OUTPUT_TYPE_CONSOLE.equalsIgnoreCase(logOutputType)) { logOutputType = LOG_OUTPUT_TYPE_FILE; } + System.out.println("INFO: log out type is: " + logOutputType); - // first use -D, then use user home. - String logDir = System.getProperty(LOG_DIR); - if (logDir == null || logDir.isEmpty()) { - logDir = System.getProperty(USER_HOME); - logDir = addSeparator(logDir) + DIR_NAME + File.separator; - } - logDir = addSeparator(logDir); - File dir = new File(logDir); + logCharSet = properties.getProperty(LOG_CHARSET) == null ? logCharSet : properties.getProperty(LOG_CHARSET); + System.out.println("INFO: log charset is: " + logCharSet); + + + logBaseDir = properties.getProperty(LOG_DIR) == null ? logBaseDir : properties.getProperty(LOG_DIR); + addSeparator(logBaseDir); + File dir = new File(logBaseDir); if (!dir.exists()) { if (!dir.mkdirs()) { - System.err.println("ERROR: create log base dir error: " + logDir); + System.err.println("ERROR: create log base dir error: " + logBaseDir); } } - // logBaseDir must end with File.separator - logBaseDir = logDir; System.out.println("INFO: log base dir is: " + logBaseDir); - String usePid = System.getProperty(LOG_NAME_USE_PID, ""); + + String usePid = properties.getProperty(LOG_NAME_USE_PID); logNameUsePid = "true".equalsIgnoreCase(usePid); System.out.println("INFO: log name use pid is: " + logNameUsePid); + + } + /** * Whether log file name should contain pid. This switch is configured by {@link #LOG_NAME_USE_PID} System property. * @@ -104,13 +120,34 @@ public class LogBase { return logNameUsePid; } - private static String addSeparator(String logDir) { - if (!logDir.endsWith(File.separator)) { - logDir += File.separator; - } - return logDir; + /** + * Get log file base directory path, the returned path is guaranteed end with {@link File#separator} + * + * @return log file base directory path. + */ + public static String getLogBaseDir() { + return logBaseDir; + } + + /** + * Get log file output type the default value is "file" + * + * @return + */ + public static String getLogOutputType() { + return logOutputType; + } + + /** + * Get log file charSet the default value is utf-8 + * + * @return + */ + public static String getLogCharset() { + return logCharSet; } + protected static void log(Logger logger, Handler handler, Level level, String detail, Object... params) { if (detail == null) { return; @@ -131,14 +168,6 @@ public class LogBase { logger.log(level, detail, throwable); } - /** - * Get log file base directory path, the returned path is guaranteed end with {@link File#separator} - * - * @return log file base directory path. - */ - public static String getLogBaseDir() { - return logBaseDir; - } protected static Handler makeLogger(String logName, Logger heliumRecordLog) { CspFormatter formatter = new CspFormatter(); @@ -155,7 +184,7 @@ public class LogBase { try { handler = new DateFileLogHandler(fileName + ".%d", 1024 * 1024 * 200, 4, true); handler.setFormatter(formatter); - handler.setEncoding(LOG_CHARSET); + handler.setEncoding(logCharSet); } catch (IOException e) { e.printStackTrace(); } @@ -164,7 +193,7 @@ public class LogBase { try { handler = new ConsoleHandler(); handler.setFormatter(formatter); - handler.setEncoding(LOG_CHARSET); + handler.setEncoding(logCharSet); } catch (IOException e) { e.printStackTrace(); } @@ -179,4 +208,6 @@ public class LogBase { heliumRecordLog.setLevel(Level.ALL); return handler; } + + } diff --git a/sentinel-core/src/main/java/com/alibaba/csp/sentinel/log/LogConfigLoader.java b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/log/LogConfigLoader.java new file mode 100644 index 00000000..aca288cf --- /dev/null +++ b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/log/LogConfigLoader.java @@ -0,0 +1,78 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.csp.sentinel.log; + +import com.alibaba.csp.sentinel.util.ConfigUtil; +import com.alibaba.csp.sentinel.util.StringUtil; + +import java.util.Map; +import java.util.Properties; +import java.util.concurrent.CopyOnWriteArraySet; + +/** + *

+ * class responsible for loading the Log configuration. + *

+ * + * @author lianglin + * @since 1.7.0 + */ +public class LogConfigLoader { + + + public static final String LOG_CONFIG = "csp.sentinel.config.file"; + + private static final String DEFAULT_LOG_CONFIG_FILE = "classpath:sentinel.properties"; + + + private static final Properties properties = new Properties(); + + static { + load(); + } + + private static void load() { + + String file = System.getProperty(LOG_CONFIG); + if (StringUtil.isBlank(file)) { + file = DEFAULT_LOG_CONFIG_FILE; + } + + Properties p = ConfigUtil.loadProperties(file); + if (p != null && !p.isEmpty()) { + properties.putAll(p); + } + + CopyOnWriteArraySet> copy = new CopyOnWriteArraySet<>(System.getProperties().entrySet()); + for (Map.Entry entry : copy) { + String configKey = entry.getKey().toString(); + String newConfigValue = entry.getValue().toString(); + String oldConfigValue = properties.getProperty(configKey); + properties.put(configKey, newConfigValue); + if (oldConfigValue != null) { + System.out.println("[LogConfig] JVM parameter overrides: " + configKey + " " + oldConfigValue + " -> " + newConfigValue); + } + } + + + } + + public static Properties getProperties() { + return properties; + } + + +} diff --git a/sentinel-core/src/main/java/com/alibaba/csp/sentinel/util/AppNameUtil.java b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/util/AppNameUtil.java index 0cde3e85..5cfa766e 100755 --- a/sentinel-core/src/main/java/com/alibaba/csp/sentinel/util/AppNameUtil.java +++ b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/util/AppNameUtil.java @@ -15,10 +15,10 @@ */ package com.alibaba.csp.sentinel.util; -import java.io.File; - import com.alibaba.csp.sentinel.log.RecordLog; +import java.io.File; + /** * Util class for getting application name. This class uses the flowing order to get app's name: * diff --git a/sentinel-core/src/main/java/com/alibaba/csp/sentinel/util/ConfigUtil.java b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/util/ConfigUtil.java new file mode 100644 index 00000000..55d9a78b --- /dev/null +++ b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/util/ConfigUtil.java @@ -0,0 +1,147 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.csp.sentinel.util; + +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStream; +import java.net.URL; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.List; +import java.util.Properties; + +/** + *

+ * util for loading config + *

+ * + * @author lianglin + * @since 1.7.0 + */ +public final class ConfigUtil { + + + public static final String CLASSPATH_FILE_FLAG = "classpath:"; + + /** + * Return null if the file not exist + * + * @param fileName + * @return + */ + public static Properties loadProperties(String fileName) { + if (StringUtil.isNotBlank(fileName)) { + if (fileName.startsWith(File.separator)) { + return loadPropertiesFromAbsoluteFile(fileName); + } else if (fileName.startsWith(CLASSPATH_FILE_FLAG)) { + return loadPropertiesFromClasspathFile(fileName); + } else { + return loadPropertiesFromRelativeFile(fileName); + } + } else { + return null; + } + } + + private static Properties loadPropertiesFromAbsoluteFile(String fileName) { + Properties properties = null; + try { + + File file = new File(fileName); + if (!file.exists()) { + return null; + } + + FileInputStream input = new FileInputStream(file); + try { + properties = new Properties(); + properties.load(input); + } finally { + input.close(); + } + } catch (Throwable e) { + e.printStackTrace(); + } + return properties; + } + + + private static Properties loadPropertiesFromClasspathFile(String fileName) { + + fileName = fileName.substring(CLASSPATH_FILE_FLAG.length()).trim(); + + List list = new ArrayList(); + try { + Enumeration urls = getClassLoader().getResources(fileName); + list = new ArrayList(); + while (urls.hasMoreElements()) { + list.add(urls.nextElement()); + } + } catch (Throwable e) { + e.printStackTrace(); + } + + if (list.isEmpty()) { + return null; + } + + Properties properties = new Properties(); + for (URL url : list) { + try { + Properties p = new Properties(); + InputStream input = url.openStream(); + if (input != null) { + try { + p.load(input); + properties.putAll(p); + } finally { + try { + input.close(); + } catch (Throwable t) { + } + } + } + } catch (Throwable e) { + e.printStackTrace(); + } + } + return properties; + } + + private static Properties loadPropertiesFromRelativeFile(String fileName) { + String userDir = System.getProperty("user.dir"); + String realFilePath = addSeparator(userDir) + fileName; + return loadPropertiesFromAbsoluteFile(realFilePath); + } + + private static ClassLoader getClassLoader() { + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + if (classLoader == null) { + classLoader = ConfigUtil.class.getClassLoader(); + } + return classLoader; + } + + public static String addSeparator(String dir) { + if (!dir.endsWith(File.separator)) { + dir += File.separator; + } + return dir; + } + + +} 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 index 51ecb9a7..3108a08d 100644 --- 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 @@ -1,7 +1,15 @@ package com.alibaba.csp.sentinel.config; +import org.junit.Assert; import org.junit.Test; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; + +import static com.alibaba.csp.sentinel.config.SentinelConfig.*; +import static com.alibaba.csp.sentinel.util.ConfigUtil.addSeparator; import static org.junit.Assert.assertEquals; /** @@ -20,7 +28,7 @@ public class SentinelConfigTest { assertEquals(SentinelConfig.DEFAULT_STATISTIC_MAX_RT, SentinelConfig.statisticMaxRt()); } -// add JVM parameter + // add JVM parameter // -Dcsp.sentinel.charset=gbk // -Dcsp.sentinel.metric.file.single.size=104857600 // -Dcsp.sentinel.metric.file.total.count=10 @@ -58,4 +66,51 @@ public class SentinelConfigTest { SentinelConfig.setConfig(SentinelConfig.COLD_FACTOR, "4"); assertEquals(4, SentinelConfig.coldFactor()); } + + + //add Jvm parameter + //-Dcsp.sentinel.config.file=sentinel-propertiesTest.properties + //-Dcsp.sentinel.flow.cold.factor=5 + //-Dcsp.sentinel.statistic.max.rt=1000 + //@Test + public void testLoadProperties() throws IOException { + + File file = null; + String fileName = "sentinel-propertiesTest.properties"; + try { + file = new File(addSeparator(System.getProperty("user.dir")) + "target/classes/" + fileName); + if (!file.exists()) { + file.createNewFile(); + } + BufferedWriter out = new BufferedWriter(new FileWriter(file)); + out.write(buildPropertyStr(CHARSET, "utf-8")); + out.write("\n"); + out.write(buildPropertyStr(SINGLE_METRIC_FILE_SIZE, "1000")); + out.write("\n"); + out.write(buildPropertyStr(TOTAL_METRIC_FILE_COUNT, "20")); + out.write("\n"); + out.write(buildPropertyStr(COLD_FACTOR, "123")); + out.write("\n"); + out.write(buildPropertyStr(STATISTIC_MAX_RT, "6000")); + out.flush(); + out.close(); + + Assert.assertTrue(SentinelConfig.getConfig(CHARSET).equals("utf-8")); + Assert.assertTrue(SentinelConfig.getConfig(SINGLE_METRIC_FILE_SIZE).equals("1000")); + Assert.assertTrue(SentinelConfig.getConfig(TOTAL_METRIC_FILE_COUNT).equals("20")); + Assert.assertTrue(SentinelConfig.getConfig(COLD_FACTOR).equals("5")); + Assert.assertTrue(SentinelConfig.getConfig(STATISTIC_MAX_RT).equals("1000")); + + } finally { + if (file != null) { + file.delete(); + } + } + + + } + + private String buildPropertyStr(String key, String value) { + return key + "=" + value; + } } \ No newline at end of file diff --git a/sentinel-core/src/test/java/com/alibaba/csp/sentinel/log/LogBaseTest.java b/sentinel-core/src/test/java/com/alibaba/csp/sentinel/log/LogBaseTest.java new file mode 100644 index 00000000..5a380956 --- /dev/null +++ b/sentinel-core/src/test/java/com/alibaba/csp/sentinel/log/LogBaseTest.java @@ -0,0 +1,79 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.csp.sentinel.log; + +import org.junit.Assert; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; + +import static com.alibaba.csp.sentinel.log.LogBase.*; +import static com.alibaba.csp.sentinel.util.ConfigUtil.addSeparator; + +/** + * @author lianglin + * @since 1.7.0 + */ +public class LogBaseTest { + + + + //add Jvm parameter + //-Dcsp.sentinel.config.file=log-propertiesTest.properties + //-Dcsp.sentinel.log.charset="utf-8" + //-Dcsp.sentinel.log.output.type="file" + //@Test + public void testLoadProperties() throws IOException { + + File file = null; + String fileName = "log-propertiesTest.properties"; + try { + file = new File(addSeparator(System.getProperty("user.dir")) + "target/classes/" + fileName); + if (!file.exists()) { + file.createNewFile(); + } + BufferedWriter out = new BufferedWriter(new FileWriter(file)); + out.write(buildPropertyStr(LOG_DIR, "/data/logs/")); + out.write("\n"); + out.write(buildPropertyStr(LOG_NAME_USE_PID, "true")); + out.write("\n"); + out.write(buildPropertyStr(LOG_OUTPUT_TYPE, "console")); + out.write("\n"); + out.write(buildPropertyStr(LOG_CHARSET, "gbk")); + out.flush(); + out.close(); + + //test will make dir + //Assert.assertTrue(LogBase.getLogBaseDir().equals("/data/logs/")); + Assert.assertTrue(LogBase.isLogNameUsePid()); + Assert.assertTrue(LogBase.getLogOutputType().equals("file")); + Assert.assertTrue(LogBase.getLogCharset().equals("utf-8")); + } finally { + if (file != null) { + file.delete(); + } + } + + + } + + + private String buildPropertyStr(String key, String value) { + return key + "=" + value; + } +} diff --git a/sentinel-core/src/test/java/com/alibaba/csp/sentinel/util/ConfigUtilTest.java b/sentinel-core/src/test/java/com/alibaba/csp/sentinel/util/ConfigUtilTest.java new file mode 100644 index 00000000..69ddd2de --- /dev/null +++ b/sentinel-core/src/test/java/com/alibaba/csp/sentinel/util/ConfigUtilTest.java @@ -0,0 +1,84 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.csp.sentinel.util; + +import org.junit.Assert; +import org.junit.Test; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.util.Properties; + +import static com.alibaba.csp.sentinel.log.LogBase.LOG_DIR; +import static com.alibaba.csp.sentinel.log.LogBase.LOG_OUTPUT_TYPE; +import static com.alibaba.csp.sentinel.util.ConfigUtil.addSeparator; + +/** + * @author lianglin + * @since 1.7.0 + */ +public class ConfigUtilTest { + + @Test + public void testLoadProperties() throws IOException { + + File file = null; + String logOutputType = "utf-8", + dir = "/data/logs/", + fileName = "propertiesTest.properties"; + try { + String userDir = System.getProperty("user.dir"); + file = new File(addSeparator(userDir) + "target/classes/" + fileName); + if (!file.exists()) { + file.createNewFile(); + } + BufferedWriter out = new BufferedWriter(new FileWriter(file)); + out.write(LOG_OUTPUT_TYPE + "=" + logOutputType); + out.write("\n"); + out.write(LOG_DIR + "=" + dir); + out.flush(); + out.close(); + + //Load from absolutePath + Properties properties = ConfigUtil.loadProperties(file.getAbsolutePath()); + Assert.assertTrue(logOutputType.equals(properties.getProperty(LOG_OUTPUT_TYPE))); + Assert.assertTrue(dir.equals(properties.getProperty(LOG_DIR))); + + + //Load from classPath + properties = ConfigUtil.loadProperties(ConfigUtil.CLASSPATH_FILE_FLAG + fileName); + Assert.assertTrue(logOutputType.equals(properties.getProperty(LOG_OUTPUT_TYPE))); + Assert.assertTrue(dir.equals(properties.getProperty(LOG_DIR))); + + + //Load from relativePath + properties = ConfigUtil.loadProperties("target/classes/" + fileName); + Assert.assertTrue(logOutputType.equals(properties.getProperty(LOG_OUTPUT_TYPE))); + Assert.assertTrue(dir.equals(properties.getProperty(LOG_DIR))); + + } finally { + if (file != null) { + file.delete(); + } + } + + } + + + +}