mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Alerting: fix UI element for PagerDuty's severity field configuration (#58927)
* make severity a regular text field * add logs + fallback to critical if empty
This commit is contained in:
parent
5240905f05
commit
866aea0db2
@ -6,6 +6,7 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"github.com/prometheus/alertmanager/notify"
|
"github.com/prometheus/alertmanager/notify"
|
||||||
"github.com/prometheus/alertmanager/template"
|
"github.com/prometheus/alertmanager/template"
|
||||||
@ -21,9 +22,12 @@ import (
|
|||||||
const (
|
const (
|
||||||
pagerDutyEventTrigger = "trigger"
|
pagerDutyEventTrigger = "trigger"
|
||||||
pagerDutyEventResolve = "resolve"
|
pagerDutyEventResolve = "resolve"
|
||||||
|
|
||||||
|
defaultSeverity = "critical"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
knownSeverity = map[string]struct{}{defaultSeverity: {}, "error": {}, "warning": {}, "info": {}}
|
||||||
PagerdutyEventAPIURL = "https://events.pagerduty.com/v2/enqueue"
|
PagerdutyEventAPIURL = "https://events.pagerduty.com/v2/enqueue"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -80,7 +84,7 @@ func newPagerdutyNotifier(fc FactoryConfig) (*PagerdutyNotifier, error) {
|
|||||||
images: fc.ImageStore,
|
images: fc.ImageStore,
|
||||||
settings: pagerdutySettings{
|
settings: pagerdutySettings{
|
||||||
Key: key,
|
Key: key,
|
||||||
Severity: fc.Config.Settings.Get("severity").MustString("critical"),
|
Severity: fc.Config.Settings.Get("severity").MustString(defaultSeverity),
|
||||||
customDetails: map[string]string{
|
customDetails: map[string]string{
|
||||||
"firing": `{{ template "__text_alert_list" .Alerts.Firing }}`,
|
"firing": `{{ template "__text_alert_list" .Alerts.Firing }}`,
|
||||||
"resolved": `{{ template "__text_alert_list" .Alerts.Resolved }}`,
|
"resolved": `{{ template "__text_alert_list" .Alerts.Resolved }}`,
|
||||||
@ -152,6 +156,12 @@ func (pn *PagerdutyNotifier) buildPagerdutyMessage(ctx context.Context, alerts m
|
|||||||
details[k] = detail
|
details[k] = detail
|
||||||
}
|
}
|
||||||
|
|
||||||
|
severity := strings.ToLower(tmpl(pn.settings.Severity))
|
||||||
|
if _, ok := knownSeverity[severity]; !ok {
|
||||||
|
pn.log.Warn("Severity is not in the list of known values - using default severity", "actualSeverity", severity, "defaultSeverity", defaultSeverity)
|
||||||
|
severity = defaultSeverity
|
||||||
|
}
|
||||||
|
|
||||||
msg := &pagerDutyMessage{
|
msg := &pagerDutyMessage{
|
||||||
Client: "Grafana",
|
Client: "Grafana",
|
||||||
ClientURL: pn.tmpl.ExternalURL.String(),
|
ClientURL: pn.tmpl.ExternalURL.String(),
|
||||||
@ -165,7 +175,7 @@ func (pn *PagerdutyNotifier) buildPagerdutyMessage(ctx context.Context, alerts m
|
|||||||
Payload: pagerDutyPayload{
|
Payload: pagerDutyPayload{
|
||||||
Component: tmpl(pn.settings.Component),
|
Component: tmpl(pn.settings.Component),
|
||||||
Summary: tmpl(pn.settings.Summary),
|
Summary: tmpl(pn.settings.Summary),
|
||||||
Severity: tmpl(pn.settings.Severity),
|
Severity: severity,
|
||||||
CustomDetails: details,
|
CustomDetails: details,
|
||||||
Class: tmpl(pn.settings.Class),
|
Class: tmpl(pn.settings.Class),
|
||||||
Group: tmpl(pn.settings.Group),
|
Group: tmpl(pn.settings.Group),
|
||||||
|
@ -7,14 +7,14 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/grafana/grafana/pkg/components/simplejson"
|
|
||||||
"github.com/grafana/grafana/pkg/services/secrets/fakes"
|
|
||||||
secretsManager "github.com/grafana/grafana/pkg/services/secrets/manager"
|
|
||||||
|
|
||||||
"github.com/prometheus/alertmanager/notify"
|
"github.com/prometheus/alertmanager/notify"
|
||||||
"github.com/prometheus/alertmanager/types"
|
"github.com/prometheus/alertmanager/types"
|
||||||
"github.com/prometheus/common/model"
|
"github.com/prometheus/common/model"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
|
|
||||||
|
"github.com/grafana/grafana/pkg/components/simplejson"
|
||||||
|
"github.com/grafana/grafana/pkg/services/secrets/fakes"
|
||||||
|
secretsManager "github.com/grafana/grafana/pkg/services/secrets/manager"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestPagerdutyNotifier(t *testing.T) {
|
func TestPagerdutyNotifier(t *testing.T) {
|
||||||
@ -69,7 +69,43 @@ func TestPagerdutyNotifier(t *testing.T) {
|
|||||||
Links: []pagerDutyLink{{HRef: "http://localhost", Text: "External URL"}},
|
Links: []pagerDutyLink{{HRef: "http://localhost", Text: "External URL"}},
|
||||||
},
|
},
|
||||||
expMsgError: nil,
|
expMsgError: nil,
|
||||||
}, {
|
},
|
||||||
|
{
|
||||||
|
name: "should map unknown severity",
|
||||||
|
settings: `{"integrationKey": "abcdefgh0123456789", "severity": "{{ .CommonLabels.severity }}"}`,
|
||||||
|
alerts: []*types.Alert{
|
||||||
|
{
|
||||||
|
Alert: model.Alert{
|
||||||
|
Labels: model.LabelSet{"alertname": "alert1", "lbl1": "val1", "severity": "invalid-severity"},
|
||||||
|
Annotations: model.LabelSet{"ann1": "annv1", "__dashboardUid__": "abcd", "__panelId__": "efgh"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
expMsg: &pagerDutyMessage{
|
||||||
|
RoutingKey: "abcdefgh0123456789",
|
||||||
|
DedupKey: "6e3538104c14b583da237e9693b76debbc17f0f8058ef20492e5853096cf8733",
|
||||||
|
EventAction: "trigger",
|
||||||
|
Payload: pagerDutyPayload{
|
||||||
|
Summary: "[FIRING:1] (val1 invalid-severity)",
|
||||||
|
Source: hostname,
|
||||||
|
Severity: defaultSeverity,
|
||||||
|
Class: "default",
|
||||||
|
Component: "Grafana",
|
||||||
|
Group: "default",
|
||||||
|
CustomDetails: map[string]string{
|
||||||
|
"firing": "\nValue: [no value]\nLabels:\n - alertname = alert1\n - lbl1 = val1\n - severity = invalid-severity\nAnnotations:\n - ann1 = annv1\nSilence: http://localhost/alerting/silence/new?alertmanager=grafana&matcher=alertname%3Dalert1&matcher=lbl1%3Dval1&matcher=severity%3Dinvalid-severity\nDashboard: http://localhost/d/abcd\nPanel: http://localhost/d/abcd?viewPanel=efgh\n",
|
||||||
|
"num_firing": "1",
|
||||||
|
"num_resolved": "0",
|
||||||
|
"resolved": "",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Client: "Grafana",
|
||||||
|
ClientURL: "http://localhost",
|
||||||
|
Links: []pagerDutyLink{{HRef: "http://localhost", Text: "External URL"}},
|
||||||
|
},
|
||||||
|
expMsgError: nil,
|
||||||
|
},
|
||||||
|
{
|
||||||
name: "Default config with one alert and custom summary",
|
name: "Default config with one alert and custom summary",
|
||||||
settings: `{"integrationKey": "abcdefgh0123456789", "summary": "Alerts firing: {{ len .Alerts.Firing }}"}`,
|
settings: `{"integrationKey": "abcdefgh0123456789", "summary": "Alerts firing: {{ len .Alerts.Firing }}"}`,
|
||||||
alerts: []*types.Alert{
|
alerts: []*types.Alert{
|
||||||
|
@ -239,26 +239,11 @@ func GetAvailableNotifiers() []*NotifierPlugin {
|
|||||||
Secure: true,
|
Secure: true,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Label: "Severity",
|
Label: "Severity",
|
||||||
Element: ElementTypeSelect,
|
Element: ElementTypeInput,
|
||||||
SelectOptions: []SelectOption{
|
InputType: InputTypeText,
|
||||||
{
|
Placeholder: "critical",
|
||||||
Value: "critical",
|
Description: "Severity of the event. It must be critical, error, warning, info - otherwise, the default is set which is critical. You can use templates",
|
||||||
Label: "Critical",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
Value: "error",
|
|
||||||
Label: "Error",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
Value: "warning",
|
|
||||||
Label: "Warning",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
Value: "info",
|
|
||||||
Label: "Info",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
PropertyName: "severity",
|
PropertyName: "severity",
|
||||||
},
|
},
|
||||||
{ // New in 8.0.
|
{ // New in 8.0.
|
||||||
|
Loading…
Reference in New Issue
Block a user