in cmd/rule-evaluator/main.go [1012:1065]
func (e *ruleEvaluator) ApplyConfig(cfg *config.Config, evaluatorOpts *evaluatorOptions) error {
if evaluatorOpts != nil && !reflect.DeepEqual(evaluatorOpts, e.lastEvaluatorOpts) {
e.lastEvaluatorOpts = evaluatorOpts
v1api, err := newAPI(e.ctx, evaluatorOpts, e.version)
if err != nil {
return fmt.Errorf("query client: %w", err)
}
queryFunc := newQueryFunc(e.logger, v1api)
rulesManager := rules.NewManager(&rules.ManagerOptions{
ExternalURL: getExternalURL(evaluatorOpts.GeneratorURL, evaluatorOpts.ProjectID),
QueryFunc: queryFunc,
Context: e.ctx,
Appendable: e.appendable,
Queryable: &queryStorage{
api: v1api,
},
Logger: e.logger,
NotifyFunc: sendAlerts(e.notifierManager, evaluatorOpts.ProjectID, evaluatorOpts.GeneratorURL),
Metrics: e.rulesMetrics,
})
// Set new rule-manager and flag before stopping, so we can rerun with the new one.
e.mtx.Lock()
oldRuleManager := e.rulesManager
e.rulesManager = rulesManager
oldRuleManager.Stop()
e.queryFunc = queryFunc
e.mtx.Unlock()
_, err = queryFunc(e.ctx, "vector(1)", time.Now())
if err != nil {
_ = level.Error(e.logger).Log("msg", "Error querying Prometheus instance", "err", err)
}
}
// Get all rule files matching the configuration paths.
var files []string
for _, pat := range cfg.RuleFiles {
fs, err := filepath.Glob(pat)
if fs == nil || err != nil {
return fmt.Errorf("retrieving rule file: %s", pat)
}
files = append(files, fs...)
}
return e.rulesManager.Update(
time.Duration(cfg.GlobalConfig.EvaluationInterval),
files,
cfg.GlobalConfig.ExternalLabels,
"",
nil,
)
}