grafana/pkg/services/ngalert/models/admin_configuration.go
Santiago 04d93751b8
Alerting: send alerts to external, internal, or both alertmanagers (#40341)
* (WIP) send alerts to external, internal, or both alertmanagers

* Modify admin configuration endpoint, update swagger docs

* Integration test for admin config updated

* Code review changes

* Fix alertmanagers choice not changing bug, add unit test

* Add AlertmanagersChoice as enum in swagger, code review changes

* Fix API and tests errors

* Change enum from int to string, use 'SendAlertsTo' instead of 'AlertmanagerChoice' where necessary

* Fix tests to reflect last changes

* Keep senders running when alerts are handled just internally

* Check if any external AM has been discovered before sending alerts, update tests

* remove duplicate data from logs

* update comment

* represent alertmanagers choice as an int instead of a string

* default alertmanagers choice to all alertmanagers, test cases

* update definitions and generate spec
2022-02-01 20:36:55 -03:00

73 lines
1.5 KiB
Go

package models
import (
"crypto/sha256"
"errors"
"fmt"
"net/url"
)
type AlertmanagersChoice int
const (
AllAlertmanagers AlertmanagersChoice = iota
InternalAlertmanager
ExternalAlertmanagers
)
var alertmanagersChoiceMap = map[AlertmanagersChoice]string{
AllAlertmanagers: "all",
InternalAlertmanager: "internal",
ExternalAlertmanagers: "external",
}
// AdminConfiguration represents the ngalert administration configuration settings.
type AdminConfiguration struct {
ID int64 `xorm:"pk autoincr 'id'"`
OrgID int64 `xorm:"org_id"`
// List of Alertmanager(s) URL to push alerts to.
Alertmanagers []string
// SendAlertsTo indicates which set of alertmanagers will handle the alert.
SendAlertsTo AlertmanagersChoice `xorm:"send_alerts_to"`
CreatedAt int64 `xorm:"created"`
UpdatedAt int64 `xorm:"updated"`
}
func (ac *AdminConfiguration) AsSHA256() string {
h := sha256.New()
_, _ = h.Write([]byte(fmt.Sprintf("%v", ac.Alertmanagers)))
return fmt.Sprintf("%x", h.Sum(nil))
}
func (ac *AdminConfiguration) Validate() error {
for _, u := range ac.Alertmanagers {
_, err := url.Parse(u)
if err != nil {
return err
}
}
return nil
}
// String implements the Stringer interface
func (amc AlertmanagersChoice) String() string {
return alertmanagersChoiceMap[amc]
}
func StringToAlertmanagersChoice(str string) (AlertmanagersChoice, error) {
if str == "" {
return AllAlertmanagers, nil
}
for k, v := range alertmanagersChoiceMap {
if str == v {
return k, nil
}
}
return 0, errors.New("invalid alertmanager choice")
}