func()

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,
	)
}