mirror of
https://github.com/grafana/grafana.git
synced 2025-02-16 18:34:52 -06:00
* [Alerting]: Add sensugo notification channel * Apply suggestions from code review Co-authored-by: Ganesh Vernekar <15064823+codesome@users.noreply.github.com> * Do not include labels with concatenated rule UID and names * Modifications after syncing with main Co-authored-by: Ganesh Vernekar <15064823+codesome@users.noreply.github.com>
807 lines
20 KiB
Go
807 lines
20 KiB
Go
package alerting
|
|
|
|
import (
|
|
"fmt"
|
|
"io/ioutil"
|
|
"net/http"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"github.com/grafana/grafana/pkg/bus"
|
|
"github.com/grafana/grafana/pkg/models"
|
|
"github.com/grafana/grafana/pkg/tests/testinfra"
|
|
)
|
|
|
|
func TestAvailableChannels(t *testing.T) {
|
|
dir, path := testinfra.CreateGrafDir(t, testinfra.GrafanaOpts{
|
|
EnableFeatureToggles: []string{"ngalert"},
|
|
DisableAnonymous: true,
|
|
})
|
|
|
|
store := testinfra.SetUpDatabase(t, dir)
|
|
store.Bus = bus.GetBus()
|
|
grafanaListedAddr := testinfra.StartGrafana(t, dir, path, store)
|
|
|
|
// Create a user to make authenticated requests
|
|
require.NoError(t, createUser(t, store, models.ROLE_EDITOR, "grafana", "password"))
|
|
|
|
alertsURL := fmt.Sprintf("http://grafana:password@%s/api/alert-notifiers", grafanaListedAddr)
|
|
// nolint:gosec
|
|
resp, err := http.Get(alertsURL)
|
|
require.NoError(t, err)
|
|
t.Cleanup(func() {
|
|
err := resp.Body.Close()
|
|
require.NoError(t, err)
|
|
})
|
|
b, err := ioutil.ReadAll(resp.Body)
|
|
require.NoError(t, err)
|
|
require.Equal(t, 200, resp.StatusCode)
|
|
require.JSONEq(t, expAvailableChannelJsonOutput, string(b))
|
|
}
|
|
|
|
var expAvailableChannelJsonOutput = `
|
|
[
|
|
{
|
|
"type": "dingding",
|
|
"name": "DingDing",
|
|
"heading": "DingDing settings",
|
|
"description": "Sends HTTP POST request to DingDing",
|
|
"info": "",
|
|
"options": [
|
|
{
|
|
"element": "input",
|
|
"inputType": "text",
|
|
"label": "Url",
|
|
"description": "",
|
|
"placeholder": "https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxxx",
|
|
"propertyName": "url",
|
|
"selectOptions": null,
|
|
"showWhen": {
|
|
"field": "",
|
|
"is": ""
|
|
},
|
|
"required": true,
|
|
"validationRule": "",
|
|
"secure": false
|
|
},
|
|
{
|
|
"element": "select",
|
|
"inputType": "",
|
|
"label": "Message Type",
|
|
"description": "",
|
|
"placeholder": "",
|
|
"propertyName": "msgType",
|
|
"selectOptions": [
|
|
{
|
|
"value": "link",
|
|
"label": "Link"
|
|
},
|
|
{
|
|
"value": "actionCard",
|
|
"label": "ActionCard"
|
|
}
|
|
],
|
|
"showWhen": {
|
|
"field": "",
|
|
"is": ""
|
|
},
|
|
"required": false,
|
|
"validationRule": "",
|
|
"secure": false
|
|
},
|
|
{
|
|
"element": "textarea",
|
|
"inputType": "",
|
|
"label": "Message",
|
|
"description": "",
|
|
"placeholder": "{{ template \"default.message\" . }}",
|
|
"propertyName": "message",
|
|
"selectOptions": null,
|
|
"showWhen": {
|
|
"field": "",
|
|
"is": ""
|
|
},
|
|
"required": false,
|
|
"validationRule": "",
|
|
"secure": false
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"type": "email",
|
|
"name": "Email",
|
|
"heading": "Email settings",
|
|
"description": "Sends notifications using Grafana server configured SMTP settings",
|
|
"info": "",
|
|
"options": [
|
|
{
|
|
"element": "checkbox",
|
|
"inputType": "",
|
|
"label": "Single email",
|
|
"description": "Send a single email to all recipients",
|
|
"placeholder": "",
|
|
"propertyName": "singleEmail",
|
|
"selectOptions": null,
|
|
"showWhen": {
|
|
"field": "",
|
|
"is": ""
|
|
},
|
|
"required": false,
|
|
"validationRule": "",
|
|
"secure": false
|
|
},
|
|
{
|
|
"element": "textarea",
|
|
"inputType": "",
|
|
"label": "Addresses",
|
|
"description": "You can enter multiple email addresses using a \";\" separator",
|
|
"placeholder": "",
|
|
"propertyName": "addresses",
|
|
"selectOptions": null,
|
|
"showWhen": {
|
|
"field": "",
|
|
"is": ""
|
|
},
|
|
"required": true,
|
|
"validationRule": "",
|
|
"secure": false
|
|
},
|
|
{
|
|
"element": "textarea",
|
|
"inputType": "",
|
|
"label": "Message",
|
|
"description": "Optional message to include with the email. You can use template variables",
|
|
"placeholder": "",
|
|
"propertyName": "message",
|
|
"selectOptions": null,
|
|
"showWhen": {
|
|
"field": "",
|
|
"is": ""
|
|
},
|
|
"required": false,
|
|
"validationRule": "",
|
|
"secure": false
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"type": "pagerduty",
|
|
"name": "PagerDuty",
|
|
"heading": "PagerDuty settings",
|
|
"description": "Sends notifications to PagerDuty",
|
|
"info": "",
|
|
"options": [
|
|
{
|
|
"element": "input",
|
|
"inputType": "text",
|
|
"label": "Integration Key",
|
|
"description": "",
|
|
"placeholder": "Pagerduty Integration Key",
|
|
"propertyName": "integrationKey",
|
|
"selectOptions": null,
|
|
"showWhen": {
|
|
"field": "",
|
|
"is": ""
|
|
},
|
|
"required": true,
|
|
"validationRule": "",
|
|
"secure": true
|
|
},
|
|
{
|
|
"element": "select",
|
|
"inputType": "",
|
|
"label": "Severity",
|
|
"description": "",
|
|
"placeholder": "",
|
|
"propertyName": "severity",
|
|
"selectOptions": [
|
|
{
|
|
"value": "critical",
|
|
"label": "Critical"
|
|
},
|
|
{
|
|
"value": "error",
|
|
"label": "Error"
|
|
},
|
|
{
|
|
"value": "warning",
|
|
"label": "Warning"
|
|
},
|
|
{
|
|
"value": "info",
|
|
"label": "Info"
|
|
}
|
|
],
|
|
"showWhen": {
|
|
"field": "",
|
|
"is": ""
|
|
},
|
|
"required": false,
|
|
"validationRule": "",
|
|
"secure": false
|
|
},
|
|
{
|
|
"element": "input",
|
|
"inputType": "text",
|
|
"label": "Class",
|
|
"description": "The class/type of the event, for example 'ping failure' or 'cpu load'",
|
|
"placeholder": "",
|
|
"propertyName": "class",
|
|
"selectOptions": null,
|
|
"showWhen": {
|
|
"field": "",
|
|
"is": ""
|
|
},
|
|
"required": false,
|
|
"validationRule": "",
|
|
"secure": false
|
|
},
|
|
{
|
|
"element": "input",
|
|
"inputType": "text",
|
|
"label": "Component",
|
|
"description": "Component of the source machine that is responsible for the event, for example mysql or eth0",
|
|
"placeholder": "Grafana",
|
|
"propertyName": "component",
|
|
"selectOptions": null,
|
|
"showWhen": {
|
|
"field": "",
|
|
"is": ""
|
|
},
|
|
"required": false,
|
|
"validationRule": "",
|
|
"secure": false
|
|
},
|
|
{
|
|
"element": "input",
|
|
"inputType": "text",
|
|
"label": "Group",
|
|
"description": "Logical grouping of components of a service, for example 'app-stack'",
|
|
"placeholder": "",
|
|
"propertyName": "group",
|
|
"selectOptions": null,
|
|
"showWhen": {
|
|
"field": "",
|
|
"is": ""
|
|
},
|
|
"required": false,
|
|
"validationRule": "",
|
|
"secure": false
|
|
},
|
|
{
|
|
"element": "textarea",
|
|
"inputType": "",
|
|
"label": "Summary",
|
|
"description": "You can use templates for summary",
|
|
"placeholder": "{{ template \"default.message\" . }}",
|
|
"propertyName": "summary",
|
|
"selectOptions": null,
|
|
"showWhen": {
|
|
"field": "",
|
|
"is": ""
|
|
},
|
|
"required": false,
|
|
"validationRule": "",
|
|
"secure": false
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"type": "slack",
|
|
"name": "Slack",
|
|
"heading": "Slack settings",
|
|
"description": "Sends notifications to Slack",
|
|
"info": "",
|
|
"options": [
|
|
{
|
|
"element": "input",
|
|
"inputType": "text",
|
|
"label": "Recipient",
|
|
"description": "Specify channel or user, use #channel-name, @username (has to be all lowercase, no whitespace), or user/channel Slack ID - required unless you provide a webhook",
|
|
"placeholder": "",
|
|
"propertyName": "recipient",
|
|
"selectOptions": null,
|
|
"showWhen": {
|
|
"field": "",
|
|
"is": ""
|
|
},
|
|
"required": false,
|
|
"validationRule": "",
|
|
"secure": false
|
|
},
|
|
{
|
|
"element": "input",
|
|
"inputType": "text",
|
|
"label": "Token",
|
|
"description": "Provide a Slack API token (starts with \"xoxb\") - required unless you provide a webhook",
|
|
"placeholder": "",
|
|
"propertyName": "token",
|
|
"selectOptions": null,
|
|
"showWhen": {
|
|
"field": "",
|
|
"is": ""
|
|
},
|
|
"required": false,
|
|
"validationRule": "",
|
|
"secure": true
|
|
},
|
|
{
|
|
"element": "input",
|
|
"inputType": "text",
|
|
"label": "Username",
|
|
"description": "Set the username for the bot's message",
|
|
"placeholder": "",
|
|
"propertyName": "username",
|
|
"selectOptions": null,
|
|
"showWhen": {
|
|
"field": "",
|
|
"is": ""
|
|
},
|
|
"required": false,
|
|
"validationRule": "",
|
|
"secure": false
|
|
},
|
|
{
|
|
"element": "input",
|
|
"inputType": "text",
|
|
"label": "Icon emoji",
|
|
"description": "Provide an emoji to use as the icon for the bot's message. Overrides the icon URL.",
|
|
"placeholder": "",
|
|
"propertyName": "icon_emoji",
|
|
"selectOptions": null,
|
|
"showWhen": {
|
|
"field": "",
|
|
"is": ""
|
|
},
|
|
"required": false,
|
|
"validationRule": "",
|
|
"secure": false
|
|
},
|
|
{
|
|
"element": "input",
|
|
"inputType": "text",
|
|
"label": "Icon URL",
|
|
"description": "Provide a URL to an image to use as the icon for the bot's message",
|
|
"placeholder": "",
|
|
"propertyName": "icon_url",
|
|
"selectOptions": null,
|
|
"showWhen": {
|
|
"field": "",
|
|
"is": ""
|
|
},
|
|
"required": false,
|
|
"validationRule": "",
|
|
"secure": false
|
|
},
|
|
{
|
|
"element": "input",
|
|
"inputType": "text",
|
|
"label": "Mention Users",
|
|
"description": "Mention one or more users (comma separated) when notifying in a channel, by ID (you can copy this from the user's Slack profile)",
|
|
"placeholder": "",
|
|
"propertyName": "mentionUsers",
|
|
"selectOptions": null,
|
|
"showWhen": {
|
|
"field": "",
|
|
"is": ""
|
|
},
|
|
"required": false,
|
|
"validationRule": "",
|
|
"secure": false
|
|
},
|
|
{
|
|
"element": "input",
|
|
"inputType": "text",
|
|
"label": "Mention Groups",
|
|
"description": "Mention one or more groups (comma separated) when notifying in a channel (you can copy this from the group's Slack profile URL)",
|
|
"placeholder": "",
|
|
"propertyName": "mentionGroups",
|
|
"selectOptions": null,
|
|
"showWhen": {
|
|
"field": "",
|
|
"is": ""
|
|
},
|
|
"required": false,
|
|
"validationRule": "",
|
|
"secure": false
|
|
},
|
|
{
|
|
"element": "select",
|
|
"inputType": "",
|
|
"label": "Mention Channel",
|
|
"description": "Mention whole channel or just active members when notifying",
|
|
"placeholder": "",
|
|
"propertyName": "mentionChannel",
|
|
"selectOptions": [
|
|
{
|
|
"value": "",
|
|
"label": "Disabled"
|
|
},
|
|
{
|
|
"value": "here",
|
|
"label": "Every active channel member"
|
|
},
|
|
{
|
|
"value": "channel",
|
|
"label": "Every channel member"
|
|
}
|
|
],
|
|
"showWhen": {
|
|
"field": "",
|
|
"is": ""
|
|
},
|
|
"required": false,
|
|
"validationRule": "",
|
|
"secure": false
|
|
},
|
|
{
|
|
"element": "input",
|
|
"inputType": "text",
|
|
"label": "Webhook URL",
|
|
"description": "Optionally provide a Slack incoming webhook URL for sending messages, in this case the token isn't necessary",
|
|
"placeholder": "Slack incoming webhook URL",
|
|
"propertyName": "url",
|
|
"selectOptions": null,
|
|
"showWhen": {
|
|
"field": "",
|
|
"is": ""
|
|
},
|
|
"required": false,
|
|
"validationRule": "",
|
|
"secure": true
|
|
},
|
|
{
|
|
"element": "input",
|
|
"inputType": "text",
|
|
"label": "Title",
|
|
"description": "Templated title of the slack message",
|
|
"placeholder": "{{ template \"slack.default.title\" . }}",
|
|
"propertyName": "title",
|
|
"selectOptions": null,
|
|
"showWhen": {
|
|
"field": "",
|
|
"is": ""
|
|
},
|
|
"required": false,
|
|
"validationRule": "",
|
|
"secure": false
|
|
},
|
|
{
|
|
"element": "textarea",
|
|
"inputType": "",
|
|
"label": "Text Body",
|
|
"description": "Body of the slack message",
|
|
"placeholder": "{{ template \"slack.default.text\" . }}",
|
|
"propertyName": "text",
|
|
"selectOptions": null,
|
|
"showWhen": {
|
|
"field": "",
|
|
"is": ""
|
|
},
|
|
"required": false,
|
|
"validationRule": "",
|
|
"secure": false
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"type": "sensugo",
|
|
"name": "Sensu Go",
|
|
"description": "Sends HTTP POST request to a Sensu Go API",
|
|
"heading": "Sensu Go Settings",
|
|
"info": "",
|
|
"options": [
|
|
{
|
|
"element": "input",
|
|
"inputType": "text",
|
|
"label": "Backend URL",
|
|
"description": "",
|
|
"placeholder": "http://sensu-api.local:8080",
|
|
"propertyName": "url",
|
|
"selectOptions": null,
|
|
"showWhen": {
|
|
"field": "",
|
|
"is": ""
|
|
},
|
|
"required": true,
|
|
"validationRule": "",
|
|
"secure": false
|
|
},
|
|
{
|
|
"element": "input",
|
|
"inputType": "password",
|
|
"label": "API Key",
|
|
"description": "API key to auth to Sensu Go backend",
|
|
"placeholder": "",
|
|
"propertyName": "apikey",
|
|
"selectOptions": null,
|
|
"showWhen": {
|
|
"field": "",
|
|
"is": ""
|
|
},
|
|
"required": true,
|
|
"validationRule": "",
|
|
"secure": true
|
|
},
|
|
{
|
|
"element": "input",
|
|
"inputType": "text",
|
|
"label": "Proxy entity name",
|
|
"description": "",
|
|
"placeholder": "default",
|
|
"propertyName": "entity",
|
|
"selectOptions": null,
|
|
"showWhen": {
|
|
"field": "",
|
|
"is": ""
|
|
},
|
|
"required": false,
|
|
"validationRule": "",
|
|
"secure": false
|
|
},
|
|
{
|
|
"element": "input",
|
|
"inputType": "text",
|
|
"label": "Check name",
|
|
"description": "",
|
|
"placeholder": "default",
|
|
"propertyName": "check",
|
|
"selectOptions": null,
|
|
"showWhen": {
|
|
"field": "",
|
|
"is": ""
|
|
},
|
|
"required": false,
|
|
"validationRule": "",
|
|
"secure": false
|
|
},
|
|
{
|
|
"element": "input",
|
|
"inputType": "text",
|
|
"label": "Handler",
|
|
"description": "",
|
|
"placeholder": "",
|
|
"propertyName": "handler",
|
|
"selectOptions": null,
|
|
"showWhen": {
|
|
"field": "",
|
|
"is": ""
|
|
},
|
|
"required": false,
|
|
"validationRule": "",
|
|
"secure": false
|
|
},
|
|
{
|
|
"element": "input",
|
|
"inputType": "text",
|
|
"label": "Namespace",
|
|
"description": "",
|
|
"placeholder": "default",
|
|
"propertyName": "namespace",
|
|
"selectOptions": null,
|
|
"showWhen": {
|
|
"field": "",
|
|
"is": ""
|
|
},
|
|
"required": false,
|
|
"validationRule": "",
|
|
"secure": false
|
|
},
|
|
{
|
|
"element": "textarea",
|
|
"inputType": "",
|
|
"label": "Message",
|
|
"description": "",
|
|
"placeholder": "{{ template \"default.message\" . }}",
|
|
"propertyName": "message",
|
|
"selectOptions": null,
|
|
"showWhen": {
|
|
"field": "",
|
|
"is": ""
|
|
},
|
|
"required": false,
|
|
"validationRule": "",
|
|
"secure": false
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"type": "teams",
|
|
"name": "Microsoft Teams",
|
|
"heading": "Teams settings",
|
|
"description": "Sends notifications using Incoming Webhook connector to Microsoft Teams",
|
|
"info": "",
|
|
"options": [
|
|
{
|
|
"element": "input",
|
|
"inputType": "text",
|
|
"label": "URL",
|
|
"description": "",
|
|
"placeholder": "Teams incoming webhook url",
|
|
"propertyName": "url",
|
|
"selectOptions": null,
|
|
"showWhen": {
|
|
"field": "",
|
|
"is": ""
|
|
},
|
|
"required": true,
|
|
"validationRule": "",
|
|
"secure": false
|
|
},
|
|
{
|
|
"element": "textarea",
|
|
"inputType": "",
|
|
"label": "Message",
|
|
"description": "",
|
|
"placeholder": "{{ template \"default.message\" . }}",
|
|
"propertyName": "message",
|
|
"selectOptions": null,
|
|
"showWhen": {
|
|
"field": "",
|
|
"is": ""
|
|
},
|
|
"required": false,
|
|
"validationRule": "",
|
|
"secure": false
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"type": "telegram",
|
|
"name": "Telegram",
|
|
"heading": "Telegram API settings",
|
|
"description": "Sends notifications to Telegram",
|
|
"info": "",
|
|
"options": [
|
|
{
|
|
"element": "input",
|
|
"inputType": "text",
|
|
"label": "BOT API Token",
|
|
"description": "",
|
|
"placeholder": "Telegram BOT API Token",
|
|
"propertyName": "bottoken",
|
|
"selectOptions": null,
|
|
"showWhen": {
|
|
"field": "",
|
|
"is": ""
|
|
},
|
|
"required": true,
|
|
"validationRule": "",
|
|
"secure": true
|
|
},
|
|
{
|
|
"element": "input",
|
|
"inputType": "text",
|
|
"label": "Chat ID",
|
|
"description": "Integer Telegram Chat Identifier",
|
|
"placeholder": "",
|
|
"propertyName": "chatid",
|
|
"selectOptions": null,
|
|
"showWhen": {
|
|
"field": "",
|
|
"is": ""
|
|
},
|
|
"required": true,
|
|
"validationRule": "",
|
|
"secure": false
|
|
},
|
|
{
|
|
"element": "textarea",
|
|
"inputType": "",
|
|
"label": "Message",
|
|
"description": "",
|
|
"placeholder": "{{ template \"default.message\" . }}",
|
|
"propertyName": "message",
|
|
"selectOptions": null,
|
|
"showWhen": {
|
|
"field": "",
|
|
"is": ""
|
|
},
|
|
"required": false,
|
|
"validationRule": "",
|
|
"secure": false
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"type": "webhook",
|
|
"name": "webhook",
|
|
"heading": "Webhook settings",
|
|
"description": "Sends HTTP POST request to a URL",
|
|
"info": "",
|
|
"options": [
|
|
{
|
|
"element": "input",
|
|
"inputType": "text",
|
|
"label": "Url",
|
|
"description": "",
|
|
"placeholder": "",
|
|
"propertyName": "url",
|
|
"selectOptions": null,
|
|
"showWhen": {
|
|
"field": "",
|
|
"is": ""
|
|
},
|
|
"required": true,
|
|
"validationRule": "",
|
|
"secure": false
|
|
},
|
|
{
|
|
"element": "select",
|
|
"inputType": "",
|
|
"label": "Http Method",
|
|
"description": "",
|
|
"placeholder": "",
|
|
"propertyName": "httpMethod",
|
|
"selectOptions": [
|
|
{
|
|
"value": "POST",
|
|
"label": "POST"
|
|
},
|
|
{
|
|
"value": "PUT",
|
|
"label": "PUT"
|
|
}
|
|
],
|
|
"showWhen": {
|
|
"field": "",
|
|
"is": ""
|
|
},
|
|
"required": false,
|
|
"validationRule": "",
|
|
"secure": false
|
|
},
|
|
{
|
|
"element": "input",
|
|
"inputType": "text",
|
|
"label": "Username",
|
|
"description": "",
|
|
"placeholder": "",
|
|
"propertyName": "username",
|
|
"selectOptions": null,
|
|
"showWhen": {
|
|
"field": "",
|
|
"is": ""
|
|
},
|
|
"required": false,
|
|
"validationRule": "",
|
|
"secure": false
|
|
},
|
|
{
|
|
"element": "input",
|
|
"inputType": "password",
|
|
"label": "Password",
|
|
"description": "",
|
|
"placeholder": "",
|
|
"propertyName": "password",
|
|
"selectOptions": null,
|
|
"showWhen": {
|
|
"field": "",
|
|
"is": ""
|
|
},
|
|
"required": false,
|
|
"validationRule": "",
|
|
"secure": true
|
|
},
|
|
{
|
|
"element": "input",
|
|
"inputType": "text",
|
|
"label": "Max Alerts",
|
|
"description": "Max alerts to include in a notification. Remaining alerts in the same batch will be ignored above this number. 0 means no limit.",
|
|
"placeholder": "",
|
|
"propertyName": "maxAlerts",
|
|
"selectOptions": null,
|
|
"showWhen": {
|
|
"field": "",
|
|
"is": ""
|
|
},
|
|
"required": false,
|
|
"validationRule": "",
|
|
"secure": false
|
|
}
|
|
]
|
|
}
|
|
]
|
|
`
|