Alerting Unification: Use the errors from grafana/alerting in Alerts (#61425)

This commit is contained in:
gotjosh
2023-01-12 15:23:34 -04:00
committed by GitHub
parent 24c3c3a0ef
commit fd6f107ded
2 changed files with 11 additions and 16 deletions

View File

@@ -146,7 +146,7 @@ func (srv AlertmanagerSrv) RouteGetAMAlertGroups(c *models.ReqContext) response.
c.Query("receiver"), c.Query("receiver"),
) )
if err != nil { if err != nil {
if errors.Is(err, notifier.ErrGetAlertGroupsBadPayload) { if errors.Is(err, alerting.ErrGetAlertGroupsBadPayload) {
return ErrResp(http.StatusBadRequest, err, "") return ErrResp(http.StatusBadRequest, err, "")
} }
// any other error here should be an unexpected failure and thus an internal error // any other error here should be an unexpected failure and thus an internal error
@@ -170,10 +170,10 @@ func (srv AlertmanagerSrv) RouteGetAMAlerts(c *models.ReqContext) response.Respo
c.Query("receiver"), c.Query("receiver"),
) )
if err != nil { if err != nil {
if errors.Is(err, notifier.ErrGetAlertsBadPayload) { if errors.Is(err, alerting.ErrGetAlertsBadPayload) {
return ErrResp(http.StatusBadRequest, err, "") return ErrResp(http.StatusBadRequest, err, "")
} }
if errors.Is(err, notifier.ErrGetAlertsUnavailable) { if errors.Is(err, alerting.ErrGetAlertsUnavailable) {
return ErrResp(http.StatusServiceUnavailable, err, "") return ErrResp(http.StatusServiceUnavailable, err, "")
} }
// any other error here should be an unexpected failure and thus an internal error // any other error here should be an unexpected failure and thus an internal error

View File

@@ -6,6 +6,8 @@ import (
"sort" "sort"
"time" "time"
"github.com/grafana/alerting/alerting"
apimodels "github.com/grafana/grafana/pkg/services/ngalert/api/tooling/definitions" apimodels "github.com/grafana/grafana/pkg/services/ngalert/api/tooling/definitions"
v2 "github.com/prometheus/alertmanager/api/v2" v2 "github.com/prometheus/alertmanager/api/v2"
"github.com/prometheus/alertmanager/dispatch" "github.com/prometheus/alertmanager/dispatch"
@@ -14,13 +16,6 @@ import (
prometheus_model "github.com/prometheus/common/model" prometheus_model "github.com/prometheus/common/model"
) )
var (
ErrGetAlertsInternal = fmt.Errorf("unable to retrieve alerts(s) due to an internal error")
ErrGetAlertsUnavailable = fmt.Errorf("unable to retrieve alerts(s) as alertmanager is not initialised yet")
ErrGetAlertsBadPayload = fmt.Errorf("unable to retrieve alerts")
ErrGetAlertGroupsBadPayload = fmt.Errorf("unable to retrieve alerts groups")
)
func (am *Alertmanager) GetAlerts(active, silenced, inhibited bool, filter []string, receivers string) (apimodels.GettableAlerts, error) { func (am *Alertmanager) GetAlerts(active, silenced, inhibited bool, filter []string, receivers string) (apimodels.GettableAlerts, error) {
var ( var (
// Initialize result slice to prevent api returning `null` when there // Initialize result slice to prevent api returning `null` when there
@@ -29,19 +24,19 @@ func (am *Alertmanager) GetAlerts(active, silenced, inhibited bool, filter []str
) )
if !am.Ready() { if !am.Ready() {
return res, ErrGetAlertsUnavailable return res, alerting.ErrGetAlertsUnavailable
} }
matchers, err := parseFilter(filter) matchers, err := parseFilter(filter)
if err != nil { if err != nil {
am.logger.Error("failed to parse matchers", "error", err) am.logger.Error("failed to parse matchers", "error", err)
return nil, fmt.Errorf("%s: %w", err.Error(), ErrGetAlertsBadPayload) return nil, fmt.Errorf("%s: %w", err.Error(), alerting.ErrGetAlertsBadPayload)
} }
receiverFilter, err := parseReceivers(receivers) receiverFilter, err := parseReceivers(receivers)
if err != nil { if err != nil {
am.logger.Error("failed to parse receiver regex", "error", err) am.logger.Error("failed to parse receiver regex", "error", err)
return nil, fmt.Errorf("%s: %w", err.Error(), ErrGetAlertsBadPayload) return nil, fmt.Errorf("%s: %w", err.Error(), alerting.ErrGetAlertsBadPayload)
} }
alerts := am.alerts.GetPending() alerts := am.alerts.GetPending()
@@ -78,7 +73,7 @@ func (am *Alertmanager) GetAlerts(active, silenced, inhibited bool, filter []str
if err != nil { if err != nil {
am.logger.Error("failed to iterate through the alerts", "error", err) am.logger.Error("failed to iterate through the alerts", "error", err)
return nil, fmt.Errorf("%s: %w", err.Error(), ErrGetAlertsInternal) return nil, fmt.Errorf("%s: %w", err.Error(), alerting.ErrGetAlertsInternal)
} }
sort.Slice(res, func(i, j int) bool { sort.Slice(res, func(i, j int) bool {
return *res[i].Fingerprint < *res[j].Fingerprint return *res[i].Fingerprint < *res[j].Fingerprint
@@ -91,13 +86,13 @@ func (am *Alertmanager) GetAlertGroups(active, silenced, inhibited bool, filter
matchers, err := parseFilter(filter) matchers, err := parseFilter(filter)
if err != nil { if err != nil {
am.logger.Error("msg", "failed to parse matchers", "error", err) am.logger.Error("msg", "failed to parse matchers", "error", err)
return nil, fmt.Errorf("%s: %w", err.Error(), ErrGetAlertGroupsBadPayload) return nil, fmt.Errorf("%s: %w", err.Error(), alerting.ErrGetAlertGroupsBadPayload)
} }
receiverFilter, err := parseReceivers(receivers) receiverFilter, err := parseReceivers(receivers)
if err != nil { if err != nil {
am.logger.Error("msg", "failed to compile receiver regex", "error", err) am.logger.Error("msg", "failed to compile receiver regex", "error", err)
return nil, fmt.Errorf("%s: %w", err.Error(), ErrGetAlertGroupsBadPayload) return nil, fmt.Errorf("%s: %w", err.Error(), alerting.ErrGetAlertGroupsBadPayload)
} }
rf := func(receiverFilter *regexp.Regexp) func(r *dispatch.Route) bool { rf := func(receiverFilter *regexp.Regexp) func(r *dispatch.Route) bool {