Skip to content

Commit

Permalink
test that Grafana templates are usable in alerts
Browse files Browse the repository at this point in the history
  • Loading branch information
santihernandezc committed Sep 30, 2024
1 parent a9a6969 commit a75e0dc
Showing 1 changed file with 78 additions and 1 deletion.
79 changes: 78 additions & 1 deletion pkg/alertmanager/alertmanager_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -589,7 +589,7 @@ route:
"alertname": model.LabelValue("Alert-1"),
"a": "b",
},
Annotations: model.LabelSet{"foo": "bar"},
Annotations: model.LabelSet{"templates": `{{ template "test" . }}`},
StartsAt: now,
EndsAt: now.Add(5 * time.Minute),
GeneratorURL: "http://example.com/prometheus",
Expand Down Expand Up @@ -621,3 +621,80 @@ route:
assert.Zero(t, result[1].Integrations[0].LastNotifyAttempt)
assert.Equal(t, "", result[1].Integrations[0].LastNotifyAttemptError)
}

func TestGrafanaAlertmanagerTemplates(t *testing.T) {
am, err := New(&Config{
UserID: "test",
Logger: log.NewNopLogger(),
Limits: &mockAlertManagerLimits{},
Features: featurecontrol.NoopFlags{},
TenantDataDir: t.TempDir(),
ExternalURL: &url.URL{Path: "/am"},
ShardingEnabled: true,
Store: prepareInMemoryAlertStore(),
Replicator: &stubReplicator{},
ReplicationFactor: 1,
// We have to set this interval non-zero, though we don't need the persister to do anything.
PersisterConfig: PersisterConfig{Interval: time.Hour},
}, prometheus.NewPedanticRegistry())
require.NoError(t, err)
defer am.StopAndWait()

// The webhook message should contain the executed Grafana template.
var got struct {
Message string `json:"message"`
}
s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
json.NewDecoder(r.Body).Decode(&got)
defer func() {
require.NoError(t, r.Body.Close())
}()
}))
defer s.Close()

cfgRaw := fmt.Sprintf(`{
"route": {
"receiver": "test_receiver",
"group_by": ["alertname"]
},
"receivers": [{
"name": "test_receiver",
"grafana_managed_receiver_configs": [{
"uid": "",
"name": "webhook test",
"type": "webhook",
"disableResolveMessage": true,
"settings": {
"url": %q,
"message": %q
},
}]
}],
}`, s.URL, `{{ template "test" . }}`)

cfg, err := definition.LoadCompat([]byte(cfgRaw))
require.NoError(t, err)
expMessage := "This is a test template"
testTemplate := alertingTemplates.TemplateDefinition{
Name: "test",
Template: fmt.Sprintf(`{{ define "test" -}} %s {{- end }}`, expMessage),
}
require.NoError(t, am.ApplyConfig(cfg, []alertingTemplates.TemplateDefinition{testTemplate}, cfgRaw, &url.URL{}, nil))

now := time.Now()
alert := types.Alert{
Alert: model.Alert{
Labels: model.LabelSet{
"alertname": model.LabelValue("test-alert"),
},
StartsAt: now.Add(-5 * time.Minute),
EndsAt: now.Add(5 * time.Minute),
},
UpdatedAt: now,
}
require.NoError(t, am.alerts.Put(&alert))
require.Equal(t, am.templates[0], testTemplate)
require.Eventually(t, func() bool {
return got.Message == expMessage
}, 5*time.Second, 100*time.Millisecond)
}

0 comments on commit a75e0dc

Please sign in to comment.