2020-02-16 18:59:02 +00:00
|
|
|
package provider
|
|
|
|
|
2020-03-13 10:19:31 +00:00
|
|
|
import (
|
|
|
|
"sort"
|
|
|
|
"time"
|
|
|
|
|
|
|
|
"github.com/VictoriaMetrics/VictoriaMetrics/app/vmalert/config"
|
|
|
|
"github.com/VictoriaMetrics/VictoriaMetrics/app/vmalert/datasource"
|
|
|
|
)
|
2020-02-16 18:59:02 +00:00
|
|
|
|
|
|
|
// AlertProvider is common interface for alert manager provider
|
|
|
|
type AlertProvider interface {
|
2020-03-13 10:19:31 +00:00
|
|
|
Send(alerts []Alert) error
|
|
|
|
}
|
|
|
|
|
|
|
|
// Alert the triggered alert
|
|
|
|
type Alert struct {
|
|
|
|
Group string
|
|
|
|
Name string
|
|
|
|
Labels []datasource.Label
|
|
|
|
Annotations map[string]string
|
|
|
|
|
|
|
|
Start time.Time
|
|
|
|
End time.Time
|
|
|
|
Value float64
|
|
|
|
}
|
|
|
|
|
|
|
|
// AlertsFromMetrics converts metrics to alerts by alert Rule
|
|
|
|
func AlertsFromMetrics(metrics []datasource.Metric, group string, rule config.Rule) []Alert {
|
|
|
|
alerts := make([]Alert, 0, len(metrics))
|
|
|
|
for i, m := range metrics {
|
|
|
|
a := Alert{
|
|
|
|
Group: group,
|
|
|
|
Name: rule.Name,
|
|
|
|
Labels: metrics[i].Labels,
|
|
|
|
// todo eval template in annotations
|
|
|
|
Annotations: rule.Annotations,
|
|
|
|
Start: time.Unix(m.Timestamp, 0),
|
|
|
|
}
|
|
|
|
for k, v := range rule.Labels {
|
|
|
|
a.Labels = append(a.Labels, datasource.Label{
|
|
|
|
Name: k,
|
|
|
|
Value: v,
|
|
|
|
})
|
|
|
|
}
|
|
|
|
a.Labels = removeDuplicated(a.Labels)
|
|
|
|
alerts = append(alerts, a)
|
|
|
|
}
|
|
|
|
return alerts
|
|
|
|
}
|
|
|
|
|
|
|
|
func removeDuplicated(l []datasource.Label) []datasource.Label {
|
|
|
|
sort.Slice(l, func(i, j int) bool {
|
|
|
|
return l[i].Name < l[j].Name
|
|
|
|
})
|
|
|
|
j := 0
|
|
|
|
for i := 1; i < len(l); i++ {
|
|
|
|
if l[j] == l[i] {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
j++
|
|
|
|
l[j] = l[i]
|
|
|
|
}
|
|
|
|
return l[:j+1]
|
2020-02-16 18:59:02 +00:00
|
|
|
}
|