mirror of
https://github.com/grafana/grafana.git
synced 2025-02-20 11:48:34 -06:00
* update GetAlertRulesForSchedulingQuery to have result AlertRule * update fetcher utils and registry to support AlertRule * alertRuleInfo to use alert rule instead of version * update updateCh hanlder of ruleRoutine to just clean up the state. The updated rule will be provided at the next evaluation * update evalCh handler of ruleRoutine to use rule from the message and clear state as well as update extra labels * remove unused function in ruleRoutine * remove unused model SchedulableAlertRule * store rule version in ruleRoutine instead of rule * do not call the sender if nothing to send
54 lines
1.5 KiB
Go
54 lines
1.5 KiB
Go
package schedule
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"hash/fnv"
|
|
"sort"
|
|
"time"
|
|
|
|
"github.com/grafana/grafana/pkg/services/ngalert/models"
|
|
)
|
|
|
|
// hashUIDs returns a fnv64 hash of the UIDs for all alert rules.
|
|
// The order of the alert rules does not matter as hashUIDs sorts
|
|
// the UIDs in increasing order.
|
|
func hashUIDs(alertRules []*models.AlertRule) uint64 {
|
|
h := fnv.New64()
|
|
for _, uid := range sortedUIDs(alertRules) {
|
|
// We can ignore err as fnv64 does not return an error
|
|
// nolint:errcheck,gosec
|
|
h.Write([]byte(uid))
|
|
}
|
|
return h.Sum64()
|
|
}
|
|
|
|
// sortedUIDs returns a slice of sorted UIDs.
|
|
func sortedUIDs(alertRules []*models.AlertRule) []string {
|
|
uids := make([]string, 0, len(alertRules))
|
|
for _, alertRule := range alertRules {
|
|
uids = append(uids, alertRule.UID)
|
|
}
|
|
sort.Strings(uids)
|
|
return uids
|
|
}
|
|
|
|
// updateSchedulableAlertRules updates the alert rules for the scheduler.
|
|
// It returns an error if the database is unavailable or the query returned
|
|
// an error.
|
|
func (sch *schedule) updateSchedulableAlertRules(ctx context.Context) error {
|
|
start := time.Now()
|
|
defer func() {
|
|
sch.metrics.UpdateSchedulableAlertRulesDuration.Observe(
|
|
time.Since(start).Seconds())
|
|
}()
|
|
|
|
q := models.GetAlertRulesForSchedulingQuery{}
|
|
if err := sch.ruleStore.GetAlertRulesForScheduling(ctx, &q); err != nil {
|
|
return fmt.Errorf("failed to get alert rules: %w", err)
|
|
}
|
|
sch.log.Debug("alert rules fetched", "count", len(q.Result))
|
|
sch.schedulableAlertRules.set(q.Result)
|
|
return nil
|
|
}
|