From 39aaae8b5024f0ca8c4c951cc783347042397b60 Mon Sep 17 00:00:00 2001 From: Zied ZAIEM Date: Sat, 14 Nov 2020 15:55:37 +0100 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20Add=20Mettermost=20Alerting?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/assets/mattermost-alerts.png | Bin 0 -> 60765 bytes Dockerfile | 4 + README.md | 40 +++++++++- alerting/config.go | 4 + alerting/provider/mattermost/mattermost.go | 73 ++++++++++++++++++ .../provider/mattermost/mattermost_test.go | 40 ++++++++++ alerting/provider/provider.go | 2 + config/config.go | 7 ++ core/alert.go | 3 + example/docker-compose-mattermost/config.yaml | 6 ++ .../docker-compose.yml | 13 ++++ 11 files changed, 190 insertions(+), 2 deletions(-) create mode 100644 .github/assets/mattermost-alerts.png create mode 100644 alerting/provider/mattermost/mattermost.go create mode 100644 alerting/provider/mattermost/mattermost_test.go create mode 100644 example/docker-compose-mattermost/config.yaml create mode 100644 example/docker-compose-mattermost/docker-compose.yml diff --git a/.github/assets/mattermost-alerts.png b/.github/assets/mattermost-alerts.png new file mode 100644 index 0000000000000000000000000000000000000000..907b0f816d7c333fc28aabf919d50b3740de5cdd GIT binary patch literal 60765 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 0 +} + +// ToCustomAlertProvider converts the provider into a custom.AlertProvider +func (provider *AlertProvider) ToCustomAlertProvider(service *core.Service, alert *core.Alert, result *core.Result, resolved bool) *custom.AlertProvider { + var message string + var color string + if resolved { + message = fmt.Sprintf("An alert for *%s* has been resolved after passing successfully %d time(s) in a row", service.Name, alert.SuccessThreshold) + color = "#36A64F" + } else { + message = fmt.Sprintf("An alert for *%s* has been triggered due to having failed %d time(s) in a row", service.Name, alert.FailureThreshold) + color = "#DD0000" + } + var results string + for _, conditionResult := range result.ConditionResults { + var prefix string + if conditionResult.Success { + prefix = ":white_check_mark: " + } else { + prefix = ":x:" + } + results += fmt.Sprintf("%s - `%s`\n", prefix, conditionResult.Condition) + } + return &custom.AlertProvider{ + URL: provider.WebhookURL, + Method: "POST", + Insecure: provider.Insecure, + Body: fmt.Sprintf(`{ + "text": "", + "username": "gatus", + "icon_url": "https://raw.githubusercontent.com/TwinProduction/gatus/master/static/logo.png", + "attachments": [ + { + "title": ":rescue_worker_helmet: Gatus", + "fallback": "Gatus - %s", + "text": "%s:\n> %s", + "short": false, + "color": "%s", + "fields": [ + { + "title": "URL", + "value": "%s", + "short": false + }, + { + "title": "Condition results", + "value": "%s", + "short": false + } + ] + } + ] + }`, message, message, alert.Description, color, service.URL, results), + Headers: map[string]string{"Content-Type": "application/json"}, + } +} diff --git a/alerting/provider/mattermost/mattermost_test.go b/alerting/provider/mattermost/mattermost_test.go new file mode 100644 index 00000000..09985eb8 --- /dev/null +++ b/alerting/provider/mattermost/mattermost_test.go @@ -0,0 +1,40 @@ +package mattermost + +import ( + "github.com/TwinProduction/gatus/core" + "strings" + "testing" +) + +func TestAlertProvider_IsValid(t *testing.T) { + invalidProvider := AlertProvider{WebhookURL: ""} + if invalidProvider.IsValid() { + t.Error("provider shouldn't have been valid") + } + validProvider := AlertProvider{WebhookURL: "http://example.com"} + if !validProvider.IsValid() { + t.Error("provider should've been valid") + } +} + +func TestAlertProvider_ToCustomAlertProviderWithResolvedAlert(t *testing.T) { + provider := AlertProvider{WebhookURL: "http://example.com"} + customAlertProvider := provider.ToCustomAlertProvider(&core.Service{}, &core.Alert{}, &core.Result{ConditionResults: []*core.ConditionResult{{Condition: "SUCCESSFUL_CONDITION", Success: true}}}, true) + if customAlertProvider == nil { + t.Error("customAlertProvider shouldn't have been nil") + } + if !strings.Contains(customAlertProvider.Body, "resolved") { + t.Error("customAlertProvider.Body should've contained the substring resolved") + } +} + +func TestAlertProvider_ToCustomAlertProviderWithTriggeredAlert(t *testing.T) { + provider := AlertProvider{WebhookURL: "http://example.com"} + customAlertProvider := provider.ToCustomAlertProvider(&core.Service{}, &core.Alert{}, &core.Result{ConditionResults: []*core.ConditionResult{{Condition: "UNSUCCESSFUL_CONDITION", Success: false}}}, false) + if customAlertProvider == nil { + t.Error("customAlertProvider shouldn't have been nil") + } + if !strings.Contains(customAlertProvider.Body, "triggered") { + t.Error("customAlertProvider.Body should've contained the substring triggered") + } +} diff --git a/alerting/provider/provider.go b/alerting/provider/provider.go index 06be60c6..68d4596d 100644 --- a/alerting/provider/provider.go +++ b/alerting/provider/provider.go @@ -4,6 +4,7 @@ import ( "github.com/TwinProduction/gatus/alerting/provider/custom" "github.com/TwinProduction/gatus/alerting/provider/pagerduty" "github.com/TwinProduction/gatus/alerting/provider/slack" + "github.com/TwinProduction/gatus/alerting/provider/mattermost" "github.com/TwinProduction/gatus/alerting/provider/twilio" "github.com/TwinProduction/gatus/core" ) @@ -22,5 +23,6 @@ var ( _ AlertProvider = (*custom.AlertProvider)(nil) _ AlertProvider = (*twilio.AlertProvider)(nil) _ AlertProvider = (*slack.AlertProvider)(nil) + _ AlertProvider = (*mattermost.AlertProvider)(nil) _ AlertProvider = (*pagerduty.AlertProvider)(nil) ) diff --git a/config/config.go b/config/config.go index 4cc28350..cf466c87 100644 --- a/config/config.go +++ b/config/config.go @@ -179,6 +179,7 @@ func validateAlertingConfig(config *Config) { } alertTypes := []core.AlertType{ core.SlackAlert, + core.MattermostAlert, core.TwilioAlert, core.PagerDutyAlert, core.CustomAlert, @@ -209,6 +210,12 @@ func GetAlertingProviderByAlertType(config *Config, alertType core.AlertType) pr return nil } return config.Alerting.Slack + case core.MattermostAlert: + if config.Alerting.Mattermost == nil { + // Since we're returning an interface, we need to explicitly return nil, even if the provider itself is nil + return nil + } + return config.Alerting.Mattermost case core.TwilioAlert: if config.Alerting.Twilio == nil { // Since we're returning an interface, we need to explicitly return nil, even if the provider itself is nil diff --git a/core/alert.go b/core/alert.go index 99b12583..2ba882fa 100644 --- a/core/alert.go +++ b/core/alert.go @@ -37,6 +37,9 @@ const ( // SlackAlert is the AlertType for the slack alerting provider SlackAlert AlertType = "slack" + // MattermostAlert is the AlertType for the mattermost alerting provider + MattermostAlert AlertType = "mattermost" + // PagerDutyAlert is the AlertType for the pagerduty alerting provider PagerDutyAlert AlertType = "pagerduty" diff --git a/example/docker-compose-mattermost/config.yaml b/example/docker-compose-mattermost/config.yaml new file mode 100644 index 00000000..431be6aa --- /dev/null +++ b/example/docker-compose-mattermost/config.yaml @@ -0,0 +1,6 @@ +services: + - name: example + url: http://example.org + interval: 30s + conditions: + - "[STATUS] == 200" diff --git a/example/docker-compose-mattermost/docker-compose.yml b/example/docker-compose-mattermost/docker-compose.yml new file mode 100644 index 00000000..eea33871 --- /dev/null +++ b/example/docker-compose-mattermost/docker-compose.yml @@ -0,0 +1,13 @@ +version: "3.8" +services: + gatus: + image: twinproduction/gatus:latest + ports: + - 8080:8080 + volumes: + - ./config.yaml:/config/config.yaml + + mattermost-preview: + image: mattermost/mattermost-preview:latest + ports: + - 8065:8065 \ No newline at end of file