kezhenxu94 commented on code in PR #9822:
URL: https://github.com/apache/skywalking/pull/9822#discussion_r1002458358
##########
oap-server/analyzer/meter-analyzer/src/main/java/org/apache/skywalking/oap/meter/analyzer/prometheus/rule/Rules.java:
##########
@@ -47,29 +50,72 @@ public static List<Rule> loadRules(final String path)
throws ModuleStartExceptio
public static List<Rule> loadRules(final String path, List<String>
enabledRules) throws ModuleStartException {
File[] rules;
try {
- rules = ResourceUtils.getPathFiles(path);
+ rules = ResourceUtils.getAllPathFiles(path);
} catch (FileNotFoundException e) {
throw new ModuleStartException("Load fetcher rules failed", e);
}
+ final List<String> formedEnabledRules =
+ enabledRules
+ .stream()
+ .map(rule -> {
+ if (rule.startsWith("/")) {
+ rule = rule.substring(1);
+ }
+ if (rule.endsWith(".yaml")) {
+ return rule;
+ } else if (rule.endsWith(".yml")) {
+ return rule.substring(0, rule.length() - 2) +
"aml";
+ } else {
+ return rule + ".yaml";
+ }
+ })
+ .collect(Collectors.toList());
+
return Arrays.stream(rules)
- .filter(File::isFile)
- .map(f -> {
- try (Reader r = new FileReader(f)) {
- String fileName = f.getName();
- int dotIndex = fileName.lastIndexOf('.');
- fileName = (dotIndex == -1) ? fileName :
fileName.substring(0, dotIndex);
- if (!enabledRules.contains(fileName)) {
- return null;
+ .flatMap(f -> {
+ if (f.isDirectory()) {
+ return
Arrays.stream(Objects.requireNonNull(f.listFiles()))
+ .filter(File::isFile)
+ .map(file ->
getRulesFromFile(formedEnabledRules, f, file));
+ } else {
+ return Stream.of(getRulesFromFile(formedEnabledRules,
null, f));
}
- Rule rule = new Yaml().loadAs(r, Rule.class);
- rule.setName(fileName);
- return rule;
- } catch (IOException e) {
- LOG.debug("Reading file {} failed", f, e);
+ })
+ .filter(Objects::nonNull)
+ .collect(Collectors.toList());
+ }
+
+ private static Rule getRulesFromFile(List<String> formedEnabledRules, File
directory, File file) {
+ try (Reader r = new FileReader(file)) {
+ String fileName = file.getName();
+ int dotIndex = fileName.lastIndexOf('.');
+ if (fileName.endsWith(".yml")) {
+ fileName = fileName.substring(0, fileName.length() - 2) +
"aml";
+ }
+ if (dotIndex == -1 || !"yaml".equals(fileName.substring(dotIndex +
1))) {
+ return null;
+ }
+ String ruleName = fileName.substring(0, dotIndex);
+ if (directory != null) {
+ fileName = directory.getName() + "/" + ruleName;
+ if (!formedEnabledRules.contains(fileName) &&
!formedEnabledRules.contains(directory.getName() + "/*.yaml")) {
+ return null;
+ }
+ } else {
+ if (!formedEnabledRules.contains(fileName)) {
+ return null;
}
+ }
+
+ Rule rule = new Yaml().loadAs(r, Rule.class);
+ if (rule == null) {
return null;
- })
- .filter(Objects::nonNull)
- .collect(Collectors.toList());
+ }
+ rule.setName(ruleName);
+ return rule;
+ } catch (IOException e) {
+ LOG.debug("Reading file {} failed", file, e);
Review Comment:
This is a fatal exception and we should propagate to the caller, and stop
the OAP from starting
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]