Search in sources :

Example 1 with ExponentialBackoffRetryPolicy

use of com.uber.profiling.util.ExponentialBackoffRetryPolicy in project jvm-profiler by uber-common.

the class YamlConfigProvider method getConfig.

private static Map<String, Map<String, List<String>>> getConfig(String configFilePathOrUrl) {
    if (configFilePathOrUrl == null || configFilePathOrUrl.isEmpty()) {
        logger.warn("Empty YAML config file path");
        return new HashMap<>();
    }
    byte[] bytes;
    try {
        bytes = new ExponentialBackoffRetryPolicy<byte[]>(3, 100).attempt(() -> {
            String filePathLowerCase = configFilePathOrUrl.toLowerCase();
            if (filePathLowerCase.startsWith("http://") || filePathLowerCase.startsWith("https://")) {
                return getHttp(configFilePathOrUrl);
            } else {
                return Files.readAllBytes(Paths.get(configFilePathOrUrl));
            }
        });
        logger.info("Read YAML config from: " + configFilePathOrUrl);
    } catch (Throwable e) {
        logger.warn("Failed to read file: " + configFilePathOrUrl, e);
        return new HashMap<>();
    }
    if (bytes == null || bytes.length == 0) {
        return new HashMap<>();
    }
    Map<String, Map<String, List<String>>> result = new HashMap<>();
    try {
        try (ByteArrayInputStream stream = new ByteArrayInputStream(bytes)) {
            Yaml yaml = new Yaml();
            Object yamlObj = yaml.load(stream);
            if (!(yamlObj instanceof Map)) {
                logger.warn("Invalid YAML config content: " + yamlObj);
                return result;
            }
            Map yamlMap = (Map) yamlObj;
            Map overrideMap = null;
            for (Object key : yamlMap.keySet()) {
                String configKey = key.toString();
                Object valueObj = yamlMap.get(key);
                if (valueObj == null) {
                    continue;
                }
                if (configKey.equals(OVERRIDE_KEY)) {
                    if (valueObj instanceof Map) {
                        overrideMap = (Map) valueObj;
                    } else {
                        logger.warn("Invalid override property: " + valueObj);
                    }
                } else {
                    addConfig(result, "", configKey, valueObj);
                }
            }
            if (overrideMap != null) {
                for (Object key : overrideMap.keySet()) {
                    String overrideKey = key.toString();
                    Object valueObj = overrideMap.get(key);
                    if (valueObj == null) {
                        continue;
                    }
                    if (!(valueObj instanceof Map)) {
                        logger.warn("Invalid override section: " + key + ": " + valueObj);
                        continue;
                    }
                    Map<Object, Object> overrideValues = (Map<Object, Object>) valueObj;
                    for (Map.Entry<Object, Object> entry : overrideValues.entrySet()) {
                        if (entry.getValue() == null) {
                            continue;
                        }
                        String configKey = entry.getKey().toString();
                        addConfig(result, overrideKey, configKey, entry.getValue());
                    }
                }
            }
            return result;
        }
    } catch (Throwable e) {
        logger.warn("Failed to read config file: " + configFilePathOrUrl, e);
        return new HashMap<>();
    }
}
Also used : ExponentialBackoffRetryPolicy(com.uber.profiling.util.ExponentialBackoffRetryPolicy) HashMap(java.util.HashMap) Yaml(org.yaml.snakeyaml.Yaml) ByteArrayInputStream(java.io.ByteArrayInputStream) HashMap(java.util.HashMap) Map(java.util.Map)

Aggregations

ExponentialBackoffRetryPolicy (com.uber.profiling.util.ExponentialBackoffRetryPolicy)1 ByteArrayInputStream (java.io.ByteArrayInputStream)1 HashMap (java.util.HashMap)1 Map (java.util.Map)1 Yaml (org.yaml.snakeyaml.Yaml)1