Alerting: Support for simplified notification settings in rule API (#81011)
* Add notification settings to storage\domain and API models. Settings are a slice to workaround XORM mapping * Support validation of notification settings when rules are updated * Implement route generator for Alertmanager configuration. That fetches all notification settings. * Update multi-tenant Alertmanager to run the generator before applying the configuration. * Add notification settings labels to state calculation * update the Multi-tenant Alertmanager to provide validation for notification settings * update GET API so only admins can see auto-gen
This commit is contained in:
@@ -97,6 +97,13 @@ func validateRuleNode(
|
||||
ExecErrState: errorState,
|
||||
}
|
||||
|
||||
if ruleNode.GrafanaManagedAlert.NotificationSettings != nil {
|
||||
newAlertRule.NotificationSettings, err = validateNotificationSettings(ruleNode.GrafanaManagedAlert.NotificationSettings)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
newAlertRule.For, err = validateForInterval(ruleNode)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@@ -104,6 +111,10 @@ func validateRuleNode(
|
||||
|
||||
if ruleNode.ApiRuleNode != nil {
|
||||
newAlertRule.Annotations = ruleNode.ApiRuleNode.Annotations
|
||||
err = validateLabels(ruleNode.Labels)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
newAlertRule.Labels = ruleNode.ApiRuleNode.Labels
|
||||
|
||||
err = newAlertRule.SetDashboardAndPanelFromAnnotations()
|
||||
@@ -114,6 +125,15 @@ func validateRuleNode(
|
||||
return &newAlertRule, nil
|
||||
}
|
||||
|
||||
func validateLabels(l map[string]string) error {
|
||||
for key := range l {
|
||||
if _, ok := ngmodels.LabelsUserCannotSpecify[key]; ok {
|
||||
return fmt.Errorf("system reserved labels cannot be defined in the rule. Label %s is the reserved", key)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func validateCondition(condition string, queries []apimodels.AlertQuery) error {
|
||||
if condition == "" {
|
||||
return errors.New("condition cannot be empty")
|
||||
@@ -235,3 +255,21 @@ func validateRuleGroup(
|
||||
}
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func validateNotificationSettings(n *apimodels.AlertRuleNotificationSettings) ([]ngmodels.NotificationSettings, error) {
|
||||
s := ngmodels.NotificationSettings{
|
||||
Receiver: n.Receiver,
|
||||
GroupBy: n.GroupBy,
|
||||
GroupWait: n.GroupWait,
|
||||
GroupInterval: n.GroupInterval,
|
||||
RepeatInterval: n.RepeatInterval,
|
||||
MuteTimeIntervals: n.MuteTimeIntervals,
|
||||
}
|
||||
|
||||
if err := s.Validate(); err != nil {
|
||||
return nil, fmt.Errorf("invalid notification settings: %w", err)
|
||||
}
|
||||
return []ngmodels.NotificationSettings{
|
||||
s,
|
||||
}, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user