fix(notify/victorops): Catch routing_key templating errors (#2467)
* test(notify/victorops): Add test for templating errors Signed-off-by: Jack Baldry <jack.baldry@grafana.com> * fix(notify/victorops): Catch routing_key templating errors Signed-off-by: Jack Baldry <jack.baldry@grafana.com>
This commit is contained in:
parent
e6824a3110
commit
bf94d58d56
|
@ -72,6 +72,9 @@ func (n *Notifier) Notify(ctx context.Context, as ...*types.Alert) (bool, error)
|
||||||
apiURL = n.conf.APIURL.Copy()
|
apiURL = n.conf.APIURL.Copy()
|
||||||
)
|
)
|
||||||
apiURL.Path += fmt.Sprintf("%s/%s", n.conf.APIKey, tmpl(n.conf.RoutingKey))
|
apiURL.Path += fmt.Sprintf("%s/%s", n.conf.APIKey, tmpl(n.conf.RoutingKey))
|
||||||
|
if err != nil {
|
||||||
|
return false, fmt.Errorf("templating error: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
buf, err := n.createVictorOpsPayload(ctx, as...)
|
buf, err := n.createVictorOpsPayload(ctx, as...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -17,6 +17,8 @@ import (
|
||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
"net/http/httptest"
|
||||||
"net/url"
|
"net/url"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
@ -116,3 +118,90 @@ func TestVictorOpsRedactedURL(t *testing.T) {
|
||||||
|
|
||||||
test.AssertNotifyLeaksNoSecret(t, ctx, notifier, secret)
|
test.AssertNotifyLeaksNoSecret(t, ctx, notifier, secret)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestVictorOpsTemplating(t *testing.T) {
|
||||||
|
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
dec := json.NewDecoder(r.Body)
|
||||||
|
out := make(map[string]interface{})
|
||||||
|
err := dec.Decode(&out)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
}))
|
||||||
|
defer srv.Close()
|
||||||
|
u, _ := url.Parse(srv.URL)
|
||||||
|
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
cfg *config.VictorOpsConfig
|
||||||
|
errMsg string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "default valid templates",
|
||||||
|
cfg: &config.VictorOpsConfig{},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "invalid message_type",
|
||||||
|
cfg: &config.VictorOpsConfig{
|
||||||
|
MessageType: "{{ .CommonLabels.alertname }",
|
||||||
|
},
|
||||||
|
errMsg: "templating error",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "invalid entity_display_name",
|
||||||
|
cfg: &config.VictorOpsConfig{
|
||||||
|
EntityDisplayName: "{{ .CommonLabels.alertname }",
|
||||||
|
},
|
||||||
|
errMsg: "templating error",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "invalid state_message",
|
||||||
|
cfg: &config.VictorOpsConfig{
|
||||||
|
StateMessage: "{{ .CommonLabels.alertname }",
|
||||||
|
},
|
||||||
|
errMsg: "templating error",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "invalid monitoring tool",
|
||||||
|
cfg: &config.VictorOpsConfig{
|
||||||
|
MonitoringTool: "{{ .CommonLabels.alertname }",
|
||||||
|
},
|
||||||
|
errMsg: "templating error",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "invalid routing_key",
|
||||||
|
cfg: &config.VictorOpsConfig{
|
||||||
|
RoutingKey: "{{ .CommonLabels.alertname }",
|
||||||
|
},
|
||||||
|
errMsg: "templating error",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tc := range tests {
|
||||||
|
t.Run(tc.name, func(t *testing.T) {
|
||||||
|
tc.cfg.HTTPConfig = &commoncfg.HTTPClientConfig{}
|
||||||
|
tc.cfg.APIURL = &config.URL{URL: u}
|
||||||
|
vo, err := New(tc.cfg, test.CreateTmpl(t), log.NewNopLogger())
|
||||||
|
require.NoError(t, err)
|
||||||
|
ctx := context.Background()
|
||||||
|
ctx = notify.WithGroupKey(ctx, "1")
|
||||||
|
|
||||||
|
_, err = vo.Notify(ctx, []*types.Alert{{
|
||||||
|
Alert: model.Alert{
|
||||||
|
Labels: model.LabelSet{
|
||||||
|
"lbl1": "val1",
|
||||||
|
},
|
||||||
|
StartsAt: time.Now(),
|
||||||
|
EndsAt: time.Now().Add(time.Hour),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}...)
|
||||||
|
if tc.errMsg == "" {
|
||||||
|
require.NoError(t, err)
|
||||||
|
} else {
|
||||||
|
require.Contains(t, err.Error(), tc.errMsg)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue