in tooling/prometheus-rules/main.go [83:162]
func (o *options) complete() error {
o.ruleFiles = make([]alertingRuleFile, 0)
cfgRaw, err := os.ReadFile(o.configFile)
if err != nil {
return fmt.Errorf("error reading configuration file %v", err)
}
baseDirectory := path.Dir(o.configFile)
config := &cliConfig{}
err = yaml.Unmarshal(cfgRaw, config)
if err != nil {
return fmt.Errorf("error unmarshaling configFile %s file %v", o.configFile, err)
}
o.outputBicep = path.Join(baseDirectory, config.PrometheusRules.OutputBicep)
for _, untestedRules := range config.PrometheusRules.UntestedRules {
filePath := path.Join(baseDirectory, untestedRules)
rules, err := readRulesFile(filePath)
if err != nil {
return fmt.Errorf("error reading rules file %v", err)
}
o.ruleFiles = append(o.ruleFiles, alertingRuleFile{
fileBaseName: filePath,
rules: *rules,
})
}
for _, rulesDir := range config.PrometheusRules.RulesFolders {
err = filepath.WalkDir(path.Join(baseDirectory, rulesDir), func(path string, d fs.DirEntry, err error) error {
if err != nil {
return fmt.Errorf("error reading rules directory %s, %v", path, err)
}
if d.Type().IsRegular() {
if strings.Contains(path, "_test") {
return nil
}
folderName := filepath.Dir(path)
fileBaseName := filepath.Base(path)
rules, err := readRulesFile(path)
if err != nil {
return fmt.Errorf("error reading rules file %v", err)
}
fileNameParts := strings.Split(fileBaseName, ".")
if len(fileNameParts) != 2 {
return fmt.Errorf("missing filename extension or using '.' in filename")
}
testFile := filepath.Join(folderName, fmt.Sprintf("%s_test.%s", fileNameParts[0], fileNameParts[1]))
_, err = os.Stat(testFile)
if err != nil {
return fmt.Errorf("missing testfile %s for rule file %s", testFile, path)
}
testFileContent, err := os.ReadFile(testFile)
if err != nil {
return fmt.Errorf("error reading testfile %s: %v", testFile, err)
}
o.ruleFiles = append(o.ruleFiles, alertingRuleFile{
folderName: folderName,
fileBaseName: fileBaseName,
testFileBaseName: filepath.Base(testFile),
testFileContent: testFileContent,
rules: *rules,
})
}
return nil
})
if err != nil {
return fmt.Errorf("error reading rules dir %v", err)
}
}
return nil
}