2021-03-30 11:37:56 -05:00
|
|
|
package schedule
|
|
|
|
|
|
|
|
import (
|
2021-06-16 05:04:12 -05:00
|
|
|
"fmt"
|
|
|
|
"net/url"
|
|
|
|
"path"
|
2021-05-19 15:15:09 -05:00
|
|
|
"time"
|
|
|
|
|
2021-04-02 10:11:33 -05:00
|
|
|
"github.com/go-openapi/strfmt"
|
2021-06-24 02:15:49 -05:00
|
|
|
"github.com/grafana/grafana-plugin-sdk-go/data"
|
2021-04-19 13:26:04 -05:00
|
|
|
apimodels "github.com/grafana/grafana/pkg/services/ngalert/api/tooling/definitions"
|
2021-04-19 01:58:44 -05:00
|
|
|
"github.com/prometheus/alertmanager/api/v2/models"
|
|
|
|
|
2021-06-16 05:04:12 -05:00
|
|
|
ngModels "github.com/grafana/grafana/pkg/services/ngalert/models"
|
2021-03-30 11:37:56 -05:00
|
|
|
"github.com/grafana/grafana/pkg/services/ngalert/state"
|
|
|
|
)
|
|
|
|
|
2021-09-30 11:51:20 -05:00
|
|
|
func FromAlertStateToPostableAlerts(firingStates []*state.State, stateManager *state.Manager, appURL *url.URL) apimodels.PostableAlerts {
|
2021-04-19 01:58:44 -05:00
|
|
|
alerts := apimodels.PostableAlerts{PostableAlerts: make([]models.PostableAlert, 0, len(firingStates))}
|
2021-05-19 15:15:09 -05:00
|
|
|
var sentAlerts []*state.State
|
|
|
|
ts := time.Now()
|
2021-06-16 05:04:12 -05:00
|
|
|
|
2021-04-02 10:11:33 -05:00
|
|
|
for _, alertState := range firingStates {
|
2021-07-29 13:29:17 -05:00
|
|
|
if !alertState.NeedsSending(stateManager.ResendDelay) {
|
|
|
|
continue
|
2021-04-02 10:11:33 -05:00
|
|
|
}
|
2021-07-29 13:29:17 -05:00
|
|
|
nL := alertState.Labels.Copy()
|
|
|
|
nA := data.Labels(alertState.Annotations).Copy()
|
|
|
|
|
|
|
|
if len(alertState.Results) > 0 {
|
|
|
|
nA["__value_string__"] = alertState.Results[0].EvaluationString
|
|
|
|
}
|
|
|
|
|
2021-09-30 11:51:20 -05:00
|
|
|
var urlStr string
|
|
|
|
if uid := nL[ngModels.RuleUIDLabel]; len(uid) > 0 && appURL != nil {
|
|
|
|
u := *appURL
|
2021-07-29 13:29:17 -05:00
|
|
|
u.Path = path.Join(u.Path, fmt.Sprintf("/alerting/%s/edit", uid))
|
2021-09-30 11:51:20 -05:00
|
|
|
urlStr = u.String()
|
|
|
|
} else if appURL != nil {
|
|
|
|
urlStr = appURL.String()
|
|
|
|
} else {
|
|
|
|
urlStr = ""
|
2021-07-29 13:29:17 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
alerts.PostableAlerts = append(alerts.PostableAlerts, models.PostableAlert{
|
|
|
|
Annotations: models.LabelSet(nA),
|
|
|
|
StartsAt: strfmt.DateTime(alertState.StartsAt),
|
|
|
|
EndsAt: strfmt.DateTime(alertState.EndsAt),
|
|
|
|
Alert: models.Alert{
|
|
|
|
Labels: models.LabelSet(nL),
|
2021-09-30 11:51:20 -05:00
|
|
|
GeneratorURL: strfmt.URI(urlStr),
|
2021-07-29 13:29:17 -05:00
|
|
|
},
|
|
|
|
})
|
|
|
|
alertState.LastSentAt = ts
|
|
|
|
sentAlerts = append(sentAlerts, alertState)
|
2021-03-30 11:37:56 -05:00
|
|
|
}
|
2021-05-19 15:15:09 -05:00
|
|
|
stateManager.Put(sentAlerts)
|
2021-03-30 11:37:56 -05:00
|
|
|
return alerts
|
|
|
|
}
|