Add group-specific integration key for PagerDuty (#181)

* Added support for pagerduty integration per group

* Added pagerduty per group tests

* bugfix: if no team is provided and no general integration is provided return the first pagerduty integration in team integrations

* Updated README

* Update README.md

Co-authored-by: Chris <twin@twinnation.org>

* Update alerting/provider/pagerduty/pagerduty.go

Co-authored-by: Chris <twin@twinnation.org>

* Update alerting/provider/pagerduty/pagerduty.go

Co-authored-by: Chris <twin@twinnation.org>

Co-authored-by: Achref Ben Saad <achref.bensaad@cimpress.com>
Co-authored-by: Chris <twin@twinnation.org>
This commit is contained in:
achrefbensaadVPaccount
2021-10-06 01:01:36 +01:00
committed by GitHub
parent 154bc7dbc6
commit adbc2c5ad7
3 changed files with 162 additions and 4 deletions

View File

@ -13,22 +13,54 @@ const (
restAPIURL = "https://events.pagerduty.com/v2/enqueue"
)
type Integrations struct {
IntegrationKey string `yaml:"integration-key"`
Group string `yaml:"group"`
}
// AlertProvider is the configuration necessary for sending an alert using PagerDuty
type AlertProvider struct {
IntegrationKey string `yaml:"integration-key"`
// DefaultAlert is the default alert configuration to use for services with an alert of the appropriate type
DefaultAlert *alert.Alert `yaml:"default-alert"`
Integrations []Integrations `yaml:"integrations"`
}
// IsValid returns whether the provider's configuration is valid
func (provider *AlertProvider) IsValid() bool {
return len(provider.IntegrationKey) == 32
registeredGroups := make(map[string]bool)
if provider.Integrations != nil {
for _, integration := range provider.Integrations {
if isAlreadyRegistered := registeredGroups[integration.Group]; isAlreadyRegistered || integration.Group == "" || len(integration.IntegrationKey) != 32 {
return false
}
registeredGroups[integration.Group] = true
}
}
return len(provider.IntegrationKey) == 32 || provider.Integrations != nil
}
// GetPagerDutyIntegrationKey returns the appropriate pagerduty integration key
func (provider *AlertProvider) GetPagerDutyIntegrationKey(group string) string {
if provider.Integrations != nil {
for _, integration := range provider.Integrations {
if group == integration.Group {
return integration.IntegrationKey
}
}
}
if provider.IntegrationKey != "" {
return provider.IntegrationKey
}
return ""
}
// ToCustomAlertProvider converts the provider into a custom.AlertProvider
//
// relevant: https://developer.pagerduty.com/docs/events-api-v2/trigger-events/
func (provider *AlertProvider) ToCustomAlertProvider(service *core.Service, alert *alert.Alert, _ *core.Result, resolved bool) *custom.AlertProvider {
var message, eventAction, resolveKey string
if resolved {
@ -52,7 +84,7 @@ func (provider *AlertProvider) ToCustomAlertProvider(service *core.Service, aler
"source": "%s",
"severity": "critical"
}
}`, provider.IntegrationKey, resolveKey, eventAction, message, service.Name),
}`, provider.GetPagerDutyIntegrationKey(service.Group), resolveKey, eventAction, message, service.Name),
Headers: map[string]string{
"Content-Type": "application/json",
},