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<>();
}
}
Aggregations