mirror of
https://github.com/VictoriaMetrics/VictoriaMetrics.git
synced 2025-01-10 15:14:09 +00:00
vmalert: update the order of service labels attaching (#1922)
Service labels like `alertname` or `alertgroup` were attached after template expanding for `labels` section. Because of this, labels `alertname` or `alertgroup` weren't available for templating in `labels` section of alert's definition. This commit changes the order of labels attaching and adds a test for verifying these labels availability. https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1921 Signed-off-by: hagen1778 <roman@victoriametrics.com>
This commit is contained in:
parent
b85e88e2db
commit
2851709745
2 changed files with 52 additions and 15 deletions
|
@ -153,6 +153,13 @@ func (ar *AlertingRule) ExecRange(ctx context.Context, start, end time.Time) ([]
|
||||||
return nil, fmt.Errorf("`query` template isn't supported in replay mode")
|
return nil, fmt.Errorf("`query` template isn't supported in replay mode")
|
||||||
}
|
}
|
||||||
for _, s := range series {
|
for _, s := range series {
|
||||||
|
// set additional labels to identify group and rule name
|
||||||
|
if ar.Name != "" {
|
||||||
|
s.SetLabel(alertNameLabel, ar.Name)
|
||||||
|
}
|
||||||
|
if !*disableAlertGroupLabel && ar.GroupName != "" {
|
||||||
|
s.SetLabel(alertGroupNameLabel, ar.GroupName)
|
||||||
|
}
|
||||||
// extra labels could contain templates, so we expand them first
|
// extra labels could contain templates, so we expand them first
|
||||||
labels, err := expandLabels(s, qFn, ar)
|
labels, err := expandLabels(s, qFn, ar)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -163,13 +170,6 @@ func (ar *AlertingRule) ExecRange(ctx context.Context, start, end time.Time) ([]
|
||||||
// so the hash key will be consistent on restore
|
// so the hash key will be consistent on restore
|
||||||
s.SetLabel(k, v)
|
s.SetLabel(k, v)
|
||||||
}
|
}
|
||||||
// set additional labels to identify group and rule name
|
|
||||||
if ar.Name != "" {
|
|
||||||
s.SetLabel(alertNameLabel, ar.Name)
|
|
||||||
}
|
|
||||||
if !*disableAlertGroupLabel && ar.GroupName != "" {
|
|
||||||
s.SetLabel(alertGroupNameLabel, ar.GroupName)
|
|
||||||
}
|
|
||||||
a, err := ar.newAlert(s, time.Time{}, qFn) // initial alert
|
a, err := ar.newAlert(s, time.Time{}, qFn) // initial alert
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("failed to create alert: %s", err)
|
return nil, fmt.Errorf("failed to create alert: %s", err)
|
||||||
|
@ -225,6 +225,13 @@ func (ar *AlertingRule) Exec(ctx context.Context) ([]prompbmarshal.TimeSeries, e
|
||||||
updated := make(map[uint64]struct{})
|
updated := make(map[uint64]struct{})
|
||||||
// update list of active alerts
|
// update list of active alerts
|
||||||
for _, m := range qMetrics {
|
for _, m := range qMetrics {
|
||||||
|
// set additional labels to identify group and rule name
|
||||||
|
if ar.Name != "" {
|
||||||
|
m.SetLabel(alertNameLabel, ar.Name)
|
||||||
|
}
|
||||||
|
if !*disableAlertGroupLabel && ar.GroupName != "" {
|
||||||
|
m.SetLabel(alertGroupNameLabel, ar.GroupName)
|
||||||
|
}
|
||||||
// extra labels could contain templates, so we expand them first
|
// extra labels could contain templates, so we expand them first
|
||||||
labels, err := expandLabels(m, qFn, ar)
|
labels, err := expandLabels(m, qFn, ar)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -235,14 +242,6 @@ func (ar *AlertingRule) Exec(ctx context.Context) ([]prompbmarshal.TimeSeries, e
|
||||||
// so the hash key will be consistent on restore
|
// so the hash key will be consistent on restore
|
||||||
m.SetLabel(k, v)
|
m.SetLabel(k, v)
|
||||||
}
|
}
|
||||||
// set additional labels to identify group and rule name
|
|
||||||
// set additional labels to identify group and rule name
|
|
||||||
if ar.Name != "" {
|
|
||||||
m.SetLabel(alertNameLabel, ar.Name)
|
|
||||||
}
|
|
||||||
if !*disableAlertGroupLabel && ar.GroupName != "" {
|
|
||||||
m.SetLabel(alertGroupNameLabel, ar.GroupName)
|
|
||||||
}
|
|
||||||
h := hash(m)
|
h := hash(m)
|
||||||
if _, ok := updated[h]; ok {
|
if _, ok := updated[h]; ok {
|
||||||
// duplicate may be caused by extra labels
|
// duplicate may be caused by extra labels
|
||||||
|
|
|
@ -715,6 +715,44 @@ func TestAlertingRule_Template(t *testing.T) {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
&AlertingRule{
|
||||||
|
Name: "ExtraTemplating",
|
||||||
|
GroupName: "Testing",
|
||||||
|
Labels: map[string]string{
|
||||||
|
"name": "alert_{{ $labels.alertname }}",
|
||||||
|
"group": "group_{{ $labels.alertgroup }}",
|
||||||
|
"instance": "{{ $labels.instance }}",
|
||||||
|
},
|
||||||
|
Annotations: map[string]string{
|
||||||
|
"summary": `Alert "{{ $labels.alertname }}({{ $labels.alertgroup }})" for instance {{ $labels.instance }}`,
|
||||||
|
"description": `Alert "{{ $labels.name }}({{ $labels.group }})" for instance {{ $labels.instance }}`,
|
||||||
|
},
|
||||||
|
alerts: make(map[uint64]*notifier.Alert),
|
||||||
|
},
|
||||||
|
[]datasource.Metric{
|
||||||
|
metricWithValueAndLabels(t, 1, "instance", "foo"),
|
||||||
|
},
|
||||||
|
map[uint64]*notifier.Alert{
|
||||||
|
hash(metricWithLabels(t, alertNameLabel, "ExtraTemplating",
|
||||||
|
"name", "alert_ExtraTemplating",
|
||||||
|
alertGroupNameLabel, "Testing",
|
||||||
|
"group", "group_Testing",
|
||||||
|
"instance", "foo")): {
|
||||||
|
Labels: map[string]string{
|
||||||
|
alertNameLabel: "ExtraTemplating",
|
||||||
|
"name": "alert_ExtraTemplating",
|
||||||
|
alertGroupNameLabel: "Testing",
|
||||||
|
"group": "group_Testing",
|
||||||
|
"instance": "foo",
|
||||||
|
},
|
||||||
|
Annotations: map[string]string{
|
||||||
|
"summary": `Alert "ExtraTemplating(Testing)" for instance foo`,
|
||||||
|
"description": `Alert "alert_ExtraTemplating(group_Testing)" for instance foo`,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
fakeGroup := Group{Name: "TestRule_Exec"}
|
fakeGroup := Group{Name: "TestRule_Exec"}
|
||||||
for _, tc := range testCases {
|
for _, tc := range testCases {
|
||||||
|
|
Loading…
Reference in a new issue