mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Alerting: scheduler to use short version of model for alert rule (#48916)
* scheduler to use a short version of alert rule model
This commit is contained in:
@@ -113,6 +113,13 @@ type AlertRule struct {
|
|||||||
Labels map[string]string
|
Labels map[string]string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type SchedulableAlertRule struct {
|
||||||
|
UID string `xorm:"uid"`
|
||||||
|
OrgID int64 `xorm:"org_id"`
|
||||||
|
IntervalSeconds int64
|
||||||
|
Version int64
|
||||||
|
}
|
||||||
|
|
||||||
type LabelOption func(map[string]string)
|
type LabelOption func(map[string]string)
|
||||||
|
|
||||||
func WithoutInternalLabels() LabelOption {
|
func WithoutInternalLabels() LabelOption {
|
||||||
@@ -169,6 +176,11 @@ func (alertRule *AlertRule) GetKey() AlertRuleKey {
|
|||||||
return AlertRuleKey{OrgID: alertRule.OrgID, UID: alertRule.UID}
|
return AlertRuleKey{OrgID: alertRule.OrgID, UID: alertRule.UID}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetKey returns the alert definitions identifier
|
||||||
|
func (alertRule *SchedulableAlertRule) GetKey() AlertRuleKey {
|
||||||
|
return AlertRuleKey{OrgID: alertRule.OrgID, UID: alertRule.UID}
|
||||||
|
}
|
||||||
|
|
||||||
// PreSave sets default values and loads the updated model for each alert query.
|
// PreSave sets default values and loads the updated model for each alert query.
|
||||||
func (alertRule *AlertRule) PreSave(timeNow func() time.Time) error {
|
func (alertRule *AlertRule) PreSave(timeNow func() time.Time) error {
|
||||||
for i, q := range alertRule.Data {
|
for i, q := range alertRule.Data {
|
||||||
@@ -242,6 +254,12 @@ type ListAlertRulesQuery struct {
|
|||||||
Result []*AlertRule
|
Result []*AlertRule
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type GetAlertRulesForSchedulingQuery struct {
|
||||||
|
ExcludeOrgIDs []int64
|
||||||
|
|
||||||
|
Result []*SchedulableAlertRule
|
||||||
|
}
|
||||||
|
|
||||||
// ListNamespaceAlertRulesQuery is the query for listing namespace alert rules
|
// ListNamespaceAlertRulesQuery is the query for listing namespace alert rules
|
||||||
type ListNamespaceAlertRulesQuery struct {
|
type ListNamespaceAlertRulesQuery struct {
|
||||||
OrgID int64
|
OrgID int64
|
||||||
|
|||||||
@@ -7,14 +7,14 @@ import (
|
|||||||
"github.com/grafana/grafana/pkg/services/ngalert/models"
|
"github.com/grafana/grafana/pkg/services/ngalert/models"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (sch *schedule) getAlertRules(ctx context.Context, disabledOrgs []int64) []*models.AlertRule {
|
func (sch *schedule) getAlertRules(ctx context.Context, disabledOrgs []int64) []*models.SchedulableAlertRule {
|
||||||
start := time.Now()
|
start := time.Now()
|
||||||
defer func() {
|
defer func() {
|
||||||
sch.metrics.GetAlertRulesDuration.Observe(time.Since(start).Seconds())
|
sch.metrics.GetAlertRulesDuration.Observe(time.Since(start).Seconds())
|
||||||
}()
|
}()
|
||||||
|
|
||||||
q := models.ListAlertRulesQuery{
|
q := models.GetAlertRulesForSchedulingQuery{
|
||||||
ExcludeOrgs: disabledOrgs,
|
ExcludeOrgIDs: disabledOrgs,
|
||||||
}
|
}
|
||||||
err := sch.ruleStore.GetAlertRulesForScheduling(ctx, &q)
|
err := sch.ruleStore.GetAlertRulesForScheduling(ctx, &q)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ type RuleStore interface {
|
|||||||
DeleteAlertRulesByUID(ctx context.Context, orgID int64, ruleUID ...string) error
|
DeleteAlertRulesByUID(ctx context.Context, orgID int64, ruleUID ...string) error
|
||||||
DeleteAlertInstancesByRuleUID(ctx context.Context, orgID int64, ruleUID string) error
|
DeleteAlertInstancesByRuleUID(ctx context.Context, orgID int64, ruleUID string) error
|
||||||
GetAlertRuleByUID(ctx context.Context, query *ngmodels.GetAlertRuleByUIDQuery) error
|
GetAlertRuleByUID(ctx context.Context, query *ngmodels.GetAlertRuleByUIDQuery) error
|
||||||
GetAlertRulesForScheduling(ctx context.Context, query *ngmodels.ListAlertRulesQuery) error
|
GetAlertRulesForScheduling(ctx context.Context, query *ngmodels.GetAlertRulesForSchedulingQuery) error
|
||||||
ListAlertRules(ctx context.Context, query *ngmodels.ListAlertRulesQuery) error
|
ListAlertRules(ctx context.Context, query *ngmodels.ListAlertRulesQuery) error
|
||||||
// GetRuleGroups returns the unique rule groups across all organizations.
|
// GetRuleGroups returns the unique rule groups across all organizations.
|
||||||
GetRuleGroups(ctx context.Context, query *ngmodels.ListRuleGroupsQuery) error
|
GetRuleGroups(ctx context.Context, query *ngmodels.ListRuleGroupsQuery) error
|
||||||
@@ -344,16 +344,19 @@ func (st DBstore) GetNamespaceByTitle(ctx context.Context, namespace string, org
|
|||||||
return folder, nil
|
return folder, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetAlertRulesForScheduling returns alert rule info (identifier, interval, version state)
|
// GetAlertRulesForScheduling returns a short version of all alert rules except those that belong to an excluded list of organizations
|
||||||
// that is useful for it's scheduling.
|
func (st DBstore) GetAlertRulesForScheduling(ctx context.Context, query *ngmodels.GetAlertRulesForSchedulingQuery) error {
|
||||||
func (st DBstore) GetAlertRulesForScheduling(ctx context.Context, query *ngmodels.ListAlertRulesQuery) error {
|
|
||||||
return st.SQLStore.WithDbSession(ctx, func(sess *sqlstore.DBSession) error {
|
return st.SQLStore.WithDbSession(ctx, func(sess *sqlstore.DBSession) error {
|
||||||
alerts := make([]*ngmodels.AlertRule, 0)
|
alerts := make([]*ngmodels.SchedulableAlertRule, 0)
|
||||||
q := "SELECT uid, org_id, interval_seconds, version FROM alert_rule"
|
q := sess.Table("alert_rule")
|
||||||
if len(query.ExcludeOrgs) > 0 {
|
if len(query.ExcludeOrgIDs) > 0 {
|
||||||
q = fmt.Sprintf("%s WHERE org_id NOT IN (%s)", q, strings.Join(strings.Split(strings.Trim(fmt.Sprint(query.ExcludeOrgs), "[]"), " "), ","))
|
excludeOrgs := make([]interface{}, 0, len(query.ExcludeOrgIDs))
|
||||||
|
for _, orgID := range query.ExcludeOrgIDs {
|
||||||
|
excludeOrgs = append(excludeOrgs, orgID)
|
||||||
|
}
|
||||||
|
q = q.NotIn("org_id", excludeOrgs...)
|
||||||
}
|
}
|
||||||
if err := sess.SQL(q).Find(&alerts); err != nil {
|
if err := q.Find(&alerts); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
query.Result = alerts
|
query.Result = alerts
|
||||||
|
|||||||
@@ -153,7 +153,7 @@ func (f *FakeRuleStore) GetAlertRuleByUID(_ context.Context, q *models.GetAlertR
|
|||||||
}
|
}
|
||||||
|
|
||||||
// For now, we're not implementing namespace filtering.
|
// For now, we're not implementing namespace filtering.
|
||||||
func (f *FakeRuleStore) GetAlertRulesForScheduling(_ context.Context, q *models.ListAlertRulesQuery) error {
|
func (f *FakeRuleStore) GetAlertRulesForScheduling(_ context.Context, q *models.GetAlertRulesForSchedulingQuery) error {
|
||||||
f.mtx.Lock()
|
f.mtx.Lock()
|
||||||
defer f.mtx.Unlock()
|
defer f.mtx.Unlock()
|
||||||
f.RecordedOps = append(f.RecordedOps, *q)
|
f.RecordedOps = append(f.RecordedOps, *q)
|
||||||
@@ -161,7 +161,14 @@ func (f *FakeRuleStore) GetAlertRulesForScheduling(_ context.Context, q *models.
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
for _, rules := range f.Rules {
|
for _, rules := range f.Rules {
|
||||||
q.Result = append(q.Result, rules...)
|
for _, rule := range rules {
|
||||||
|
q.Result = append(q.Result, &models.SchedulableAlertRule{
|
||||||
|
UID: rule.UID,
|
||||||
|
OrgID: rule.OrgID,
|
||||||
|
IntervalSeconds: rule.IntervalSeconds,
|
||||||
|
Version: rule.Version,
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user