diff --git a/pkg/services/ngalert/notifier/alertmanager.go b/pkg/services/ngalert/notifier/alertmanager.go index c286e015891..faf5a8e6be4 100644 --- a/pkg/services/ngalert/notifier/alertmanager.go +++ b/pkg/services/ngalert/notifier/alertmanager.go @@ -432,8 +432,6 @@ func (am *Alertmanager) buildReceiverIntegrations(receiver *apimodels.PostableAp n, err = channels.NewSensuGoNotifier(cfg, tmpl) case "discord": n, err = channels.NewDiscordNotifier(cfg, tmpl) - case "alertmanager": - n, err = channels.NewAlertmanagerNotifier(cfg, tmpl) case "googlechat": n, err = channels.NewGoogleChatNotifier(cfg, tmpl) case "line": diff --git a/pkg/services/ngalert/notifier/channels/kafka.go b/pkg/services/ngalert/notifier/channels/kafka.go index f6a99657498..0bf662c5fa2 100644 --- a/pkg/services/ngalert/notifier/channels/kafka.go +++ b/pkg/services/ngalert/notifier/channels/kafka.go @@ -3,6 +3,7 @@ package channels import ( "context" "fmt" + "strings" gokit_log "github.com/go-kit/kit/log" "github.com/prometheus/alertmanager/notify" @@ -103,7 +104,7 @@ func (kn *KafkaNotifier) Notify(ctx context.Context, as ...*types.Alert) (bool, return false, err } - topicURL := kn.Endpoint + "/topics/" + kn.Topic + topicURL := strings.TrimRight(kn.Endpoint, "/") + "/topics/" + kn.Topic cmd := &models.SendWebhookSync{ Url: topicURL, diff --git a/pkg/services/ngalert/notifier/channels/line.go b/pkg/services/ngalert/notifier/channels/line.go index 3a4c5d415d9..46dbf4ba691 100644 --- a/pkg/services/ngalert/notifier/channels/line.go +++ b/pkg/services/ngalert/notifier/channels/line.go @@ -18,7 +18,7 @@ import ( old_notifiers "github.com/grafana/grafana/pkg/services/alerting/notifiers" ) -const ( +var ( LineNotifyURL string = "https://notify-api.line.me/api/notify" ) diff --git a/pkg/services/ngalert/notifier/channels/pushover.go b/pkg/services/ngalert/notifier/channels/pushover.go index 8729b7a7621..d74340fec09 100644 --- a/pkg/services/ngalert/notifier/channels/pushover.go +++ b/pkg/services/ngalert/notifier/channels/pushover.go @@ -20,16 +20,10 @@ import ( "github.com/prometheus/common/model" ) -const ( - PUSHOVERENDPOINT = "https://api.pushover.net/1/messages.json" +var ( + PushoverEndpoint = "https://api.pushover.net/1/messages.json" ) -// getBoundary is used for overriding the behaviour for tests -// and set a boundary -var getBoundary = func() string { - return "" -} - // PushoverNotifier is responsible for sending // alert notifications to Pushover type PushoverNotifier struct { @@ -51,6 +45,10 @@ type PushoverNotifier struct { // NewSlackNotifier is the constructor for the Slack notifier func NewPushoverNotifier(model *NotificationChannelConfig, t *template.Template) (*PushoverNotifier, error) { + if model.Settings == nil { + return nil, alerting.ValidationError{Reason: "No settings supplied"} + } + userKey := model.DecryptedValue("userKey", model.Settings.Get("userKey").MustString()) APIToken := model.DecryptedValue("apiToken", model.Settings.Get("apiToken").MustString()) device := model.Settings.Get("device").MustString() @@ -108,7 +106,7 @@ func (pn *PushoverNotifier) Notify(ctx context.Context, as ...*types.Alert) (boo } cmd := &models.SendWebhookSync{ - Url: PUSHOVERENDPOINT, + Url: PushoverEndpoint, HttpMethod: "POST", HttpHeader: headers, Body: uploadBody.String(), @@ -140,7 +138,7 @@ func (pn *PushoverNotifier) genPushoverBody(ctx context.Context, as ...*types.Al tmpl := notify.TmplText(pn.tmpl, data, &tmplErr) w := multipart.NewWriter(&b) - boundary := getBoundary() + boundary := GetBoundary() if boundary != "" { err = w.SetBoundary(boundary) if err != nil { diff --git a/pkg/services/ngalert/notifier/channels/pushover_test.go b/pkg/services/ngalert/notifier/channels/pushover_test.go index 59d27741a7d..f6990e9109a 100644 --- a/pkg/services/ngalert/notifier/channels/pushover_test.go +++ b/pkg/services/ngalert/notifier/channels/pushover_test.go @@ -133,13 +133,13 @@ func TestPushoverNotifier(t *testing.T) { } for _, c := range cases { - origGetBoundary := getBoundary + origGetBoundary := GetBoundary boundary := "abcd" - getBoundary = func() string { + GetBoundary = func() string { return boundary } t.Cleanup(func() { - getBoundary = origGetBoundary + GetBoundary = origGetBoundary }) t.Run(c.name, func(t *testing.T) { diff --git a/pkg/services/ngalert/notifier/channels/telegram.go b/pkg/services/ngalert/notifier/channels/telegram.go index 0ecad93407e..addce0536a6 100644 --- a/pkg/services/ngalert/notifier/channels/telegram.go +++ b/pkg/services/ngalert/notifier/channels/telegram.go @@ -82,6 +82,13 @@ func (tn *TelegramNotifier) Notify(ctx context.Context, as ...*types.Alert) (boo tn.log.Warn("Failed to close writer", "err", err) } }() + boundary := GetBoundary() + if boundary != "" { + err = w.SetBoundary(boundary) + if err != nil { + return false, err + } + } for k, v := range msg { if err := writeField(w, k, v); err != nil { diff --git a/pkg/services/ngalert/notifier/channels/utils.go b/pkg/services/ngalert/notifier/channels/utils.go index 44164582d31..4089c620c8f 100644 --- a/pkg/services/ngalert/notifier/channels/utils.go +++ b/pkg/services/ngalert/notifier/channels/utils.go @@ -122,3 +122,9 @@ func joinUrlPath(base, additionalPath string) (string, error) { return u.String(), nil } + +// GetBoundary is used for overriding the behaviour for tests +// and set a boundary for multipart body. DO NOT set this outside tests. +var GetBoundary = func() string { + return "" +} diff --git a/pkg/tests/api/alerting/api_notification_channel_test.go b/pkg/tests/api/alerting/api_notification_channel_test.go index 885d681c84c..ce76fd052a6 100644 --- a/pkg/tests/api/alerting/api_notification_channel_test.go +++ b/pkg/tests/api/alerting/api_notification_channel_test.go @@ -39,9 +39,21 @@ func TestNotificationChannels(t *testing.T) { amConfig := getAlertmanagerConfig(mockChannel.server.Addr) // Overriding some URLs to send to the mock channel. + os, opa, ot, opu, ogb, ol, oth := channels.SlackAPIEndpoint, channels.PagerdutyEventAPIURL, + channels.TelegramAPIURL, channels.PushoverEndpoint, channels.GetBoundary, + channels.LineNotifyURL, channels.ThreemaGwBaseURL + t.Cleanup(func() { + channels.SlackAPIEndpoint, channels.PagerdutyEventAPIURL, + channels.TelegramAPIURL, channels.PushoverEndpoint, channels.GetBoundary, + channels.LineNotifyURL, channels.ThreemaGwBaseURL = os, opa, ot, opu, ogb, ol, oth + }) channels.SlackAPIEndpoint = fmt.Sprintf("http://%s/slack_recvX/slack_testX", mockChannel.server.Addr) channels.PagerdutyEventAPIURL = fmt.Sprintf("http://%s/pagerduty_recvX/pagerduty_testX", mockChannel.server.Addr) channels.TelegramAPIURL = fmt.Sprintf("http://%s/telegram_recv/bot%%s", mockChannel.server.Addr) + channels.PushoverEndpoint = fmt.Sprintf("http://%s/pushover_recv/pushover_test", mockChannel.server.Addr) + channels.LineNotifyURL = fmt.Sprintf("http://%s/line_recv/line_test", mockChannel.server.Addr) + channels.ThreemaGwBaseURL = fmt.Sprintf("http://%s/threema_recv/threema_test", mockChannel.server.Addr) + channels.GetBoundary = func() string { return "abcd" } // Create a user to make authenticated requests require.NoError(t, createUser(t, s, models.ROLE_EDITOR, "grafana", "password")) @@ -111,7 +123,25 @@ func getExpAlertmanagerConfigFromAPI(channelAddr string) string { // the routes that we define in Alertmanager config. // EmailAlert and TelegramAlert are missing because they don't // send a JSON. Email and POST body are yet to be supported in the tests. -var alertNames = []string{"DingDingAlert", "SlackAlert1", "SlackAlert2", "PagerdutyAlert", "TeamsAlert", "WebhookAlert"} +var alertNames = []string{ + "AlertmanagerAlert", + "OpsGenieAlert", + "VictorOpsAlert", + "ThreemaAlert", + "LineAlert", + "DiscordAlert", + "KafkaAlert", + "GoogleChatAlert", + "PushoverAlert", + "SensuGoAlert", + "TelegramAlert", + "DingDingAlert", + "SlackAlert1", + "SlackAlert2", + "PagerdutyAlert", + "TeamsAlert", + "WebhookAlert", +} func getRulesConfig(t *testing.T) string { t.Helper() @@ -220,31 +250,60 @@ func (nc *mockNotificationChannel) matchesExpNotifications(exp map[string][]stri } for i := range expVals { expVal := expVals[i] - var r *regexp.Regexp + var r1, r2 *regexp.Regexp switch expKey { case "webhook_recv/webhook_test": // It has a time component "startsAt". - r = regexp.MustCompile(`.*"startsAt"\s*:\s*"([^"]+)"`) + r1 = regexp.MustCompile(`.*"startsAt"\s*:\s*"([^"]+)"`) case "slack_recvX/slack_testX": fallthrough case "slack_recv1/slack_test_without_token": // It has a time component "ts". - r = regexp.MustCompile(`.*"ts"\s*:\s*([0-9]{10})`) + r1 = regexp.MustCompile(`.*"ts"\s*:\s*([0-9]{10})`) + case "sensugo/events": + // It has a time component "ts". + r1 = regexp.MustCompile(`.*"issued"\s*:\s*([0-9]{10})`) case "pagerduty_recvX/pagerduty_testX": // It has a changing "source". - r = regexp.MustCompile(`.*"source"\s*:\s*"([^"]+)"`) + r1 = regexp.MustCompile(`.*"source"\s*:\s*"([^"]+)"`) + case "googlechat_recv/googlechat_test": + // "Grafana v | 25 May 21 17:44 IST" + r1 = regexp.MustCompile(`.*"text"\s*:\s*"(Grafana v[^"]+)"`) + case "victorops_recv/victorops_test": + // It has a time component "timestamp". + r1 = regexp.MustCompile(`.*"timestamp"\s*:\s*([0-9]{10})`) + case "v1/alerts": + // It has a changing time fields. + r1 = regexp.MustCompile(`.*"startsAt"\s*:\s*"([^"]+)"`) + r2 = regexp.MustCompile(`.*"UpdatedAt"\s*:\s*"([^"]+)"`) } - if r != nil { - parts := r.FindStringSubmatch(actVals[i]) + if r1 != nil { + parts := r1.FindStringSubmatch(actVals[i]) require.Equal(nc.t, 2, len(parts)) - expVal = fmt.Sprintf(expVal, parts[1]) + if expKey == "v1/alerts" { + // 2 fields for Prometheus Alertmanager. + parts2 := r2.FindStringSubmatch(actVals[i]) + require.Equal(nc.t, 2, len(parts2)) + expVal = fmt.Sprintf(expVal, parts[1], parts2[1]) + } else { + expVal = fmt.Sprintf(expVal, parts[1]) + } } - var expJson, actJson interface{} - require.NoError(nc.t, json.Unmarshal([]byte(expVal), &expJson)) - require.NoError(nc.t, json.Unmarshal([]byte(actVals[i]), &actJson)) - if !assert.ObjectsAreEqual(expJson, actJson) { - return false + switch expKey { + case "pushover_recv/pushover_test", "telegram_recv/bot6sh027hs034h", + "line_recv/line_test", "threema_recv/threema_test": + // Multipart data or POST parameters. + if expVal != actVals[i] { + return false + } + default: + var expJson, actJson interface{} + require.NoError(nc.t, json.Unmarshal([]byte(expVal), &expJson)) + require.NoError(nc.t, json.Unmarshal([]byte(actVals[i]), &actJson)) + if !assert.ObjectsAreEqual(expJson, actJson) { + return false + } } } } @@ -320,6 +379,106 @@ const alertmanagerConfig = ` "alertname=\"DingDingAlert\"" ] }, + { + "receiver": "discord_recv", + "group_wait": "0s", + "group_by": [ + "alertname" + ], + "matchers": [ + "alertname=\"DiscordAlert\"" + ] + }, + { + "receiver": "sensugo_recv", + "group_wait": "0s", + "group_by": [ + "alertname" + ], + "matchers": [ + "alertname=\"SensuGoAlert\"" + ] + }, + { + "receiver": "pushover_recv", + "group_wait": "0s", + "group_by": [ + "alertname" + ], + "matchers": [ + "alertname=\"PushoverAlert\"" + ] + }, + { + "receiver": "googlechat_recv", + "group_wait": "0s", + "group_by": [ + "alertname" + ], + "matchers": [ + "alertname=\"GoogleChatAlert\"" + ] + }, + { + "receiver": "kafka_recv", + "group_wait": "0s", + "group_by": [ + "alertname" + ], + "matchers": [ + "alertname=\"KafkaAlert\"" + ] + }, + { + "receiver": "line_recv", + "group_wait": "0s", + "group_by": [ + "alertname" + ], + "matchers": [ + "alertname=\"LineAlert\"" + ] + }, + { + "receiver": "threema_recv", + "group_wait": "0s", + "group_by": [ + "alertname" + ], + "matchers": [ + "alertname=\"ThreemaAlert\"" + ] + }, + { + "receiver": "opsgenie_recv", + "group_wait": "0s", + "group_by": [ + "alertname" + ], + "matchers": [ + "alertname=\"OpsGenieAlert\"" + ] + }, + { + "receiver": "alertmanager_recv", + "group_wait": "0s", + "group_by": [ + "alertname" + ], + "matchers": [ + "alertname=\"AlertmanagerAlert\"" + ] + }, + { + "receiver": "victorops_recv", + "group_wait": "0s", + "group_by": [ + "alertname" + ], + "matchers": [ + "alertname=\"VictorOpsAlert\"" + ] + }, { "receiver": "teams_recv", "group_wait": "0s", @@ -378,6 +537,55 @@ const alertmanagerConfig = ` } ] }, + { + "name": "discord_recv", + "grafana_managed_receiver_configs": [ + { + "name": "discord_test", + "type": "discord", + "settings": { + "url": "http://CHANNEL_ADDR/discord_recv/discord_test" + } + } + ] + }, + { + "name": "googlechat_recv", + "grafana_managed_receiver_configs": [ + { + "name": "googlechat_test", + "type": "googlechat", + "settings": { + "url": "http://CHANNEL_ADDR/googlechat_recv/googlechat_test" + } + } + ] + }, + { + "name": "kafka_recv", + "grafana_managed_receiver_configs": [ + { + "name": "kafka_test", + "type": "kafka", + "settings": { + "kafkaRestProxy": "http://CHANNEL_ADDR", + "kafkaTopic": "my_kafka_topic" + } + } + ] + }, + { + "name": "victorops_recv", + "grafana_managed_receiver_configs": [ + { + "name": "victorops_test", + "type": "victorops", + "settings": { + "url": "http://CHANNEL_ADDR/victorops_recv/victorops_test" + } + } + ] + }, { "name": "teams_recv", "grafana_managed_receiver_configs": [ @@ -408,6 +616,93 @@ const alertmanagerConfig = ` } ] }, + { + "name": "sensugo_recv", + "grafana_managed_receiver_configs": [ + { + "name": "sensugo_test", + "type": "sensugo", + "settings": { + "url": "http://CHANNEL_ADDR/sensugo_recv/sensugo_test", + "namespace": "sensugo" + }, + "secureSettings": { + "apikey": "mysecretkey" + } + } + ] + }, + { + "name": "pushover_recv", + "grafana_managed_receiver_configs": [ + { + "name": "pushover_test", + "type": "pushover", + "settings": {}, + "secureSettings": { + "userKey": "mysecretkey", + "apiToken": "mysecrettoken" + } + } + ] + }, + { + "name": "line_recv", + "grafana_managed_receiver_configs": [ + { + "name": "line_test", + "type": "line", + "settings": {}, + "secureSettings": { + "token": "mysecrettoken" + } + } + ] + }, + { + "name": "threema_recv", + "grafana_managed_receiver_configs": [ + { + "name": "threema_test", + "type": "threema", + "settings": { + "gateway_id": "*1234567", + "recipient_id": "abcdefgh" + }, + "secureSettings": { + "api_secret": "myapisecret" + } + } + ] + }, + { + "name": "opsgenie_recv", + "grafana_managed_receiver_configs": [ + { + "name": "opsgenie_test", + "type": "opsgenie", + "settings": { + "apiUrl": "http://CHANNEL_ADDR/opsgenie_recv/opsgenie_test" + }, + "secureSettings": { + "apiKey": "mysecretkey" + } + } + ] + }, + { + "name": "alertmanager_recv", + "grafana_managed_receiver_configs": [ + { + "name": "alertmanager_test", + "type": "prometheus-alertmanager", + "settings": { + "url": "http://CHANNEL_ADDR/alertmanager_recv/alertmanager_test" + }, + "secureSettings": {} + } + ] + }, { "name": "telegram_recv", "grafana_managed_receiver_configs": [ @@ -549,6 +844,106 @@ var expAlertmanagerConfigFromAPI = ` "alertname=\"DingDingAlert\"" ] }, + { + "receiver": "discord_recv", + "group_wait": "0s", + "group_by": [ + "alertname" + ], + "matchers": [ + "alertname=\"DiscordAlert\"" + ] + }, + { + "receiver": "sensugo_recv", + "group_wait": "0s", + "group_by": [ + "alertname" + ], + "matchers": [ + "alertname=\"SensuGoAlert\"" + ] + }, + { + "receiver": "pushover_recv", + "group_wait": "0s", + "group_by": [ + "alertname" + ], + "matchers": [ + "alertname=\"PushoverAlert\"" + ] + }, + { + "receiver": "googlechat_recv", + "group_wait": "0s", + "group_by": [ + "alertname" + ], + "matchers": [ + "alertname=\"GoogleChatAlert\"" + ] + }, + { + "receiver": "kafka_recv", + "group_wait": "0s", + "group_by": [ + "alertname" + ], + "matchers": [ + "alertname=\"KafkaAlert\"" + ] + }, + { + "receiver": "line_recv", + "group_wait": "0s", + "group_by": [ + "alertname" + ], + "matchers": [ + "alertname=\"LineAlert\"" + ] + }, + { + "receiver": "threema_recv", + "group_wait": "0s", + "group_by": [ + "alertname" + ], + "matchers": [ + "alertname=\"ThreemaAlert\"" + ] + }, + { + "receiver": "opsgenie_recv", + "group_wait": "0s", + "group_by": [ + "alertname" + ], + "matchers": [ + "alertname=\"OpsGenieAlert\"" + ] + }, + { + "receiver": "alertmanager_recv", + "group_wait": "0s", + "group_by": [ + "alertname" + ], + "matchers": [ + "alertname=\"AlertmanagerAlert\"" + ] + }, + { + "receiver": "victorops_recv", + "group_wait": "0s", + "group_by": [ + "alertname" + ], + "matchers": [ + "alertname=\"VictorOpsAlert\"" + ] + }, { "receiver": "teams_recv", "group_wait": "0s", @@ -614,6 +1009,67 @@ var expAlertmanagerConfigFromAPI = ` } ] }, + { + "name": "discord_recv", + "grafana_managed_receiver_configs": [ + { + "uid": "", + "name": "discord_test", + "type": "discord", + "disableResolveMessage": false, + "settings": { + "url": "http://CHANNEL_ADDR/discord_recv/discord_test" + }, + "secureFields": {} + } + ] + }, + { + "name": "googlechat_recv", + "grafana_managed_receiver_configs": [ + { + "uid": "", + "name": "googlechat_test", + "type": "googlechat", + "disableResolveMessage": false, + "settings": { + "url": "http://CHANNEL_ADDR/googlechat_recv/googlechat_test" + }, + "secureFields": {} + } + ] + }, + { + "name": "kafka_recv", + "grafana_managed_receiver_configs": [ + { + "uid": "", + "name": "kafka_test", + "type": "kafka", + "disableResolveMessage": false, + "settings": { + "kafkaRestProxy": "http://CHANNEL_ADDR", + "kafkaTopic": "my_kafka_topic" + }, + "secureFields": {} + } + ] + }, + { + "name": "victorops_recv", + "grafana_managed_receiver_configs": [ + { + "uid": "", + "name": "victorops_test", + "type": "victorops", + "disableResolveMessage": false, + "settings": { + "url": "http://CHANNEL_ADDR/victorops_recv/victorops_test" + }, + "secureFields": {} + } + ] + }, { "name": "teams_recv", "grafana_managed_receiver_configs": [ @@ -649,6 +1105,105 @@ var expAlertmanagerConfigFromAPI = ` } ] }, + { + "name": "sensugo_recv", + "grafana_managed_receiver_configs": [ + { + "uid": "", + "name": "sensugo_test", + "type": "sensugo", + "disableResolveMessage": false, + "settings": { + "url": "http://CHANNEL_ADDR/sensugo_recv/sensugo_test", + "namespace": "sensugo" + }, + "secureFields": { + "apikey": true + } + } + ] + }, + { + "name": "pushover_recv", + "grafana_managed_receiver_configs": [ + { + "uid": "", + "name": "pushover_test", + "type": "pushover", + "disableResolveMessage": false, + "settings": {}, + "secureFields": { + "userKey": true, + "apiToken": true + } + } + ] + }, + { + "name": "line_recv", + "grafana_managed_receiver_configs": [ + { + "uid": "", + "name": "line_test", + "type": "line", + "disableResolveMessage": false, + "settings": {}, + "secureFields": { + "token": true + } + } + ] + }, + { + "name": "threema_recv", + "grafana_managed_receiver_configs": [ + { + "uid": "", + "name": "threema_test", + "type": "threema", + "disableResolveMessage": false, + "settings": { + "gateway_id": "*1234567", + "recipient_id": "abcdefgh" + }, + "secureFields": { + "api_secret": true + } + } + ] + }, + { + "name": "opsgenie_recv", + "grafana_managed_receiver_configs": [ + { + "uid": "", + "name": "opsgenie_test", + "type": "opsgenie", + "disableResolveMessage": false, + "settings": { + "apiUrl": "http://CHANNEL_ADDR/opsgenie_recv/opsgenie_test" + }, + "secureFields": { + "apiKey": true + } + } + ] + }, + { + "name": "alertmanager_recv", + "grafana_managed_receiver_configs": [ + { + "uid": "", + "name": "alertmanager_test", + "type": "prometheus-alertmanager", + "disableResolveMessage": false, + "settings": { + "url": "http://CHANNEL_ADDR/alertmanager_recv/alertmanager_test" + }, + "secureFields": {} + } + ] + }, { "name": "telegram_recv", "grafana_managed_receiver_configs": [ @@ -898,4 +1453,157 @@ var expNotifications = map[string][]string{ "message": "\n**Firing**\nLabels:\n - alertname = WebhookAlert\n - __alert_rule_uid__ = UID_WebhookAlert\nAnnotations:\nSource: \n\n\n\n\n" }`, }, + "discord_recv/discord_test": { + `{ + "content": "\n**Firing**\nLabels:\n - alertname = DiscordAlert\n - __alert_rule_uid__ = UID_DiscordAlert\nAnnotations:\nSource: \n\n\n\n\n", + "embeds": [ + { + "color": 14037554, + "footer": { + "icon_url": "https://grafana.com/assets/img/fav32.png", + "text": "Grafana v" + }, + "title": "[FIRING:1] DiscordAlert (UID_DiscordAlert)", + "type": "rich", + "url": "http://localhost:3000/alerting/list" + } + ], + "username": "Grafana" + }`, + }, + "sensugo/events": { + `{ + "check": { + "handlers": null, + "interval": 86400, + "issued": %s, + "metadata": { + "labels": { + "ruleURL": "http://localhost:3000/alerting/list" + }, + "name": "default" + }, + "output": "\n**Firing**\nLabels:\n - alertname = SensuGoAlert\n - __alert_rule_uid__ = UID_SensuGoAlert\nAnnotations:\nSource: \n\n\n\n\n", + "status": 2 + }, + "entity": { + "metadata": { + "name": "default", + "namespace": "sensugo" + } + }, + "ruleUrl": "http://localhost:3000/alerting/list" + }`, + }, + "pushover_recv/pushover_test": { + "--abcd\r\nContent-Disposition: form-data; name=\"user\"\r\n\r\nmysecretkey\r\n--abcd\r\nContent-Disposition: form-data; name=\"token\"\r\n\r\nmysecrettoken\r\n--abcd\r\nContent-Disposition: form-data; name=\"priority\"\r\n\r\n0\r\n--abcd\r\nContent-Disposition: form-data; name=\"sound\"\r\n\r\n\r\n--abcd\r\nContent-Disposition: form-data; name=\"title\"\r\n\r\n[FIRING:1] PushoverAlert (UID_PushoverAlert)\r\n--abcd\r\nContent-Disposition: form-data; name=\"url\"\r\n\r\nhttp://localhost:3000/alerting/list\r\n--abcd\r\nContent-Disposition: form-data; name=\"url_title\"\r\n\r\nShow alert rule\r\n--abcd\r\nContent-Disposition: form-data; name=\"message\"\r\n\r\n\n**Firing**\nLabels:\n - alertname = PushoverAlert\n - __alert_rule_uid__ = UID_PushoverAlert\nAnnotations:\nSource: \n\n\n\n\n\r\n--abcd\r\nContent-Disposition: form-data; name=\"html\"\r\n\r\n1\r\n--abcd--\r\n", + }, + "telegram_recv/bot6sh027hs034h": { + "--abcd\r\nContent-Disposition: form-data; name=\"chat_id\"\r\n\r\ntelegram_chat_id\r\n--abcd\r\nContent-Disposition: form-data; name=\"parse_mode\"\r\n\r\nhtml\r\n--abcd\r\nContent-Disposition: form-data; name=\"text\"\r\n\r\n\n**Firing**\nLabels:\n - alertname = TelegramAlert\n - __alert_rule_uid__ = UID_TelegramAlert\nAnnotations:\nSource: \n\n\n\n\n\r\n--abcd--\r\n", + }, + "googlechat_recv/googlechat_test": { + `{ + "previewText": "[FIRING:1] GoogleChatAlert (UID_GoogleChatAlert)", + "fallbackText": "[FIRING:1] GoogleChatAlert (UID_GoogleChatAlert)", + "cards": [ + { + "header": { + "title": "[FIRING:1] GoogleChatAlert (UID_GoogleChatAlert)" + }, + "sections": [ + { + "widgets": [ + { + "textParagraph": { + "text": "\n**Firing**\nLabels:\n - alertname = GoogleChatAlert\n - __alert_rule_uid__ = UID_GoogleChatAlert\nAnnotations:\nSource: \n\n\n\n\n" + } + }, + { + "buttons": [ + { + "textButton": { + "text": "OPEN IN GRAFANA", + "onClick": { + "openLink": { + "url": "http://localhost:3000/alerting/list" + } + } + } + } + ] + }, + { + "textParagraph": { + "text": "%s" + } + } + ] + } + ] + } + ] + }`, + }, + "topics/my_kafka_topic": { + `{ + "records": [ + { + "value": { + "alert_state": "alerting", + "client": "Grafana", + "client_url": "http://localhost:3000/alerting/list", + "description": "[FIRING:1] KafkaAlert (UID_KafkaAlert)", + "details": "\n**Firing**\nLabels:\n - alertname = KafkaAlert\n - __alert_rule_uid__ = UID_KafkaAlert\nAnnotations:\nSource: \n\n\n\n\n", + "incident_key": "35c0bdb1715f9162a20d7b2a01cb2e3a4c5b1dc663571701e3f67212b696332f" + } + } + ] + }`, + }, + "line_recv/line_test": { + `message=%5BFIRING%3A1%5D+LineAlert+%28UID_LineAlert%29%0Ahttp%3A%2Flocalhost%3A3000%2Falerting%2Flist%0A%0A%0A%2A%2AFiring%2A%2A%0ALabels%3A%0A+-+alertname+%3D+LineAlert%0A+-+__alert_rule_uid__+%3D+UID_LineAlert%0AAnnotations%3A%0ASource%3A+%0A%0A%0A%0A%0A`, + }, + "threema_recv/threema_test": { + `from=%2A1234567&secret=myapisecret&text=%E2%9A%A0%EF%B8%8F+%5BFIRING%3A1%5D+ThreemaAlert+%28UID_ThreemaAlert%29%0A%0A%2AMessage%3A%2A%0A%0A%2A%2AFiring%2A%2A%0ALabels%3A%0A+-+alertname+%3D+ThreemaAlert%0A+-+__alert_rule_uid__+%3D+UID_ThreemaAlert%0AAnnotations%3A%0ASource%3A+%0A%0A%0A%0A%0A%0A%2AURL%3A%2A+http%3A%2Flocalhost%3A3000%2Falerting%2Flist%0A&to=abcdefgh`, + }, + "victorops_recv/victorops_test": { + `{ + "alert_url": "http://localhost:3000/alerting/list", + "entity_display_name": "[FIRING:1] VictorOpsAlert (UID_VictorOpsAlert)", + "entity_id": "633ae988fa7074bcb51f3d1c5fef2ba1c5c4ccb45b3ecbf681f7d507b078b1ae", + "message_type": "CRITICAL", + "monitoring_tool": "Grafana v", + "state_message": "\n**Firing**\nLabels:\n - alertname = VictorOpsAlert\n - __alert_rule_uid__ = UID_VictorOpsAlert\nAnnotations:\nSource: \n\n\n\n\n", + "timestamp": %s + }`, + }, + "opsgenie_recv/opsgenie_test": { + `{ + "alias": "47e92f0f6ef9fe99f3954e0d6155f8d09c4b9a038d8c3105e82c0cee4c62956e", + "description": "[FIRING:1] OpsGenieAlert (UID_OpsGenieAlert)\nhttp://localhost:3000/alerting/list\n\n\n**Firing**\nLabels:\n - alertname = OpsGenieAlert\n - __alert_rule_uid__ = UID_OpsGenieAlert\nAnnotations:\nSource: \n\n\n\n\n", + "details": { + "url": "http://localhost:3000/alerting/list" + }, + "message": "[FIRING:1] OpsGenieAlert (UID_OpsGenieAlert)", + "source": "Grafana", + "tags": [] + }`, + }, + // Prometheus Alertmanager. + "v1/alerts": { + `[ + { + "labels": { + "__alert_rule_uid__": "UID_AlertmanagerAlert", + "alertname": "AlertmanagerAlert" + }, + "annotations": {}, + "startsAt": "%s", + "endsAt": "0001-01-01T00:00:00Z", + "generatorURL": "", + "UpdatedAt": "%s", + "Timeout": false + } + ]`, + }, }