2021-03-08 22:19:21 +02:00
|
|
|
package schedule
|
|
|
|
|
|
|
|
|
|
import (
|
2022-02-08 08:52:03 +00:00
|
|
|
"context"
|
2022-06-07 16:20:06 +01:00
|
|
|
"fmt"
|
2022-01-31 16:56:43 +00:00
|
|
|
"time"
|
|
|
|
|
|
2021-03-08 22:19:21 +02:00
|
|
|
"github.com/grafana/grafana/pkg/services/ngalert/models"
|
|
|
|
|
)
|
|
|
|
|
|
2022-06-07 16:20:06 +01:00
|
|
|
// updateSchedulableAlertRules updates the alert rules for the scheduler.
|
2023-03-14 18:02:51 -04:00
|
|
|
// It returns diff that contains rule keys that were updated since the last poll,
|
|
|
|
|
// and an error if the database query encountered problems.
|
|
|
|
|
func (sch *schedule) updateSchedulableAlertRules(ctx context.Context) (diff, error) {
|
2022-01-31 16:56:43 +00:00
|
|
|
start := time.Now()
|
|
|
|
|
defer func() {
|
2022-06-07 16:20:06 +01:00
|
|
|
sch.metrics.UpdateSchedulableAlertRulesDuration.Observe(
|
|
|
|
|
time.Since(start).Seconds())
|
2022-01-31 16:56:43 +00:00
|
|
|
}()
|
|
|
|
|
|
2022-08-31 11:08:19 -04:00
|
|
|
if !sch.schedulableAlertRules.isEmpty() {
|
|
|
|
|
keys, err := sch.ruleStore.GetAlertRulesKeysForScheduling(ctx)
|
|
|
|
|
if err != nil {
|
2023-03-14 18:02:51 -04:00
|
|
|
return diff{}, err
|
2022-08-31 11:08:19 -04:00
|
|
|
}
|
|
|
|
|
if !sch.schedulableAlertRules.needsUpdate(keys) {
|
2022-10-19 16:00:47 -04:00
|
|
|
sch.log.Debug("No changes detected. Skip updating")
|
2023-03-14 18:02:51 -04:00
|
|
|
return diff{}, nil
|
2022-08-31 11:08:19 -04:00
|
|
|
}
|
|
|
|
|
}
|
2023-03-14 18:02:51 -04:00
|
|
|
// At this point, we know we need to re-fetch rules as there are changes.
|
2022-08-31 11:08:19 -04:00
|
|
|
q := models.GetAlertRulesForSchedulingQuery{
|
|
|
|
|
PopulateFolders: !sch.disableGrafanaFolder,
|
|
|
|
|
}
|
2022-06-07 16:20:06 +01:00
|
|
|
if err := sch.ruleStore.GetAlertRulesForScheduling(ctx, &q); err != nil {
|
2023-03-14 18:02:51 -04:00
|
|
|
return diff{}, fmt.Errorf("failed to get alert rules: %w", err)
|
2021-03-08 22:19:21 +02:00
|
|
|
}
|
2023-03-14 18:02:51 -04:00
|
|
|
d := sch.schedulableAlertRules.set(q.ResultRules, q.ResultFoldersTitles)
|
|
|
|
|
sch.log.Debug("Alert rules fetched", "rulesCount", len(q.ResultRules), "foldersCount", len(q.ResultFoldersTitles), "updatedRules", len(d.updated))
|
|
|
|
|
return d, nil
|
2021-03-08 22:19:21 +02:00
|
|
|
}
|