Alerting: Fill the empty GeneratorURL (#35740)

Signed-off-by: Ganesh Vernekar <ganeshvern@gmail.com>
This commit is contained in:
Ganesh Vernekar
2021-06-16 15:34:12 +05:30
committed by GitHub
parent 16850630bf
commit dcd4bf1615
7 changed files with 52 additions and 27 deletions

View File

@@ -44,7 +44,7 @@ const (
)
const (
UIDLabel = "__alert_rule_uid__"
RuleUIDLabel = "__alert_rule_uid__"
NamespaceUIDLabel = "__alert_rule_namespace_uid__"
)

View File

@@ -89,7 +89,7 @@ func (ng *AlertNG) Init() error {
Notifier: ng.Alertmanager,
Metrics: ng.Metrics,
}
ng.schedule = schedule.NewScheduler(schedCfg, ng.DataService)
ng.schedule = schedule.NewScheduler(schedCfg, ng.DataService, ng.Cfg.AppURL)
api := api.API{
Cfg: ng.Cfg,

View File

@@ -1,31 +1,53 @@
package schedule
import (
"fmt"
"net/url"
"path"
"time"
"github.com/go-openapi/strfmt"
apimodels "github.com/grafana/grafana/pkg/services/ngalert/api/tooling/definitions"
"github.com/prometheus/alertmanager/api/v2/models"
"github.com/grafana/grafana/pkg/infra/log"
ngModels "github.com/grafana/grafana/pkg/services/ngalert/models"
"github.com/grafana/grafana/pkg/services/ngalert/state"
)
func FromAlertStateToPostableAlerts(firingStates []*state.State, stateManager *state.Manager) apimodels.PostableAlerts {
func FromAlertStateToPostableAlerts(logger log.Logger, firingStates []*state.State, stateManager *state.Manager, appURL string) apimodels.PostableAlerts {
alerts := apimodels.PostableAlerts{PostableAlerts: make([]models.PostableAlert, 0, len(firingStates))}
var sentAlerts []*state.State
ts := time.Now()
u, err := url.Parse(appURL)
if err != nil {
logger.Debug("failed to parse URL while joining URL", "url", appURL, "err", err.Error())
u = nil
}
for _, alertState := range firingStates {
if alertState.NeedsSending(stateManager.ResendDelay) {
nL := alertState.Labels.Copy()
if len(alertState.Results) > 0 {
nL["__value__"] = alertState.Results[0].EvaluationString
}
genURL := appURL
if uid := nL[ngModels.RuleUIDLabel]; len(uid) > 0 && u != nil {
oldPath := u.Path
u.Path = path.Join(u.Path, fmt.Sprintf("/alerting/%s/edit", uid))
genURL = u.String()
u.Path = oldPath
}
alerts.PostableAlerts = append(alerts.PostableAlerts, models.PostableAlert{
Annotations: alertState.Annotations,
StartsAt: strfmt.DateTime(alertState.StartsAt),
EndsAt: strfmt.DateTime(alertState.EndsAt),
Alert: models.Alert{
Labels: models.LabelSet(nL),
Labels: models.LabelSet(nL),
GeneratorURL: strfmt.URI(genURL),
},
})
alertState.LastSentAt = ts

View File

@@ -88,7 +88,7 @@ func (sch *schedule) ruleRoutine(grafanaCtx context.Context, key models.AlertRul
processedStates := stateManager.ProcessEvalResults(alertRule, results)
sch.saveAlertStates(processedStates)
alerts := FromAlertStateToPostableAlerts(processedStates, stateManager)
alerts := FromAlertStateToPostableAlerts(sch.log, processedStates, stateManager, sch.appURL)
sch.log.Debug("sending alerts to notifier", "count", len(alerts.PostableAlerts), "alerts", alerts.PostableAlerts)
err = sch.sendAlerts(alerts)
if err != nil {
@@ -160,6 +160,8 @@ type schedule struct {
dataService *tsdb.Service
appURL string
notifier Notifier
metrics *metrics.Metrics
}
@@ -180,7 +182,7 @@ type SchedulerCfg struct {
}
// NewScheduler returns a new schedule.
func NewScheduler(cfg SchedulerCfg, dataService *tsdb.Service) *schedule {
func NewScheduler(cfg SchedulerCfg, dataService *tsdb.Service, appURL string) *schedule {
ticker := alerting.NewTicker(cfg.C.Now(), time.Second*0, cfg.C, int64(cfg.BaseInterval.Seconds()))
sch := schedule{
registry: alertRuleRegistry{alertRuleInfo: make(map[models.AlertRuleKey]alertRuleInfo)},
@@ -197,6 +199,7 @@ func NewScheduler(cfg SchedulerCfg, dataService *tsdb.Service) *schedule {
dataService: dataService,
notifier: cfg.Notifier,
metrics: cfg.Metrics,
appURL: appURL,
}
return &sch
}

View File

@@ -107,7 +107,7 @@ func TestWarmStateCache(t *testing.T) {
InstanceStore: dbstore,
Metrics: metrics.NewMetrics(prometheus.NewRegistry()),
}
sched := schedule.NewScheduler(schedCfg, nil)
sched := schedule.NewScheduler(schedCfg, nil, "http://localhost")
st := state.NewManager(schedCfg.Logger, nilMetrics)
sched.WarmStateCache(st)
@@ -153,7 +153,7 @@ func TestAlertingTicker(t *testing.T) {
Logger: log.New("ngalert schedule test"),
Metrics: metrics.NewMetrics(prometheus.NewRegistry()),
}
sched := schedule.NewScheduler(schedCfg, nil)
sched := schedule.NewScheduler(schedCfg, nil, "http://localhost")
ctx := context.Background()

View File

@@ -84,7 +84,7 @@ func (c *cache) getOrCreate(alertRule *ngModels.AlertRule, result eval.Result) *
}
func attachRuleLabels(m map[string]string, alertRule *ngModels.AlertRule) {
m[ngModels.UIDLabel] = alertRule.UID
m[ngModels.RuleUIDLabel] = alertRule.UID
m[ngModels.NamespaceUIDLabel] = alertRule.NamespaceUID
m[prometheusModel.AlertNameLabel] = alertRule.Title
}