64 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			64 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package slack
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 	"github.com/TwinProduction/gatus/alerting/provider/custom"
 | |
| 	"github.com/TwinProduction/gatus/core"
 | |
| )
 | |
| 
 | |
| // AlertProvider is the configuration necessary for sending an alert using Slack
 | |
| type AlertProvider struct {
 | |
| 	WebhookURL string `yaml:"webhook-url"`
 | |
| }
 | |
| 
 | |
| // IsValid returns whether the provider's configuration is valid
 | |
| func (provider *AlertProvider) IsValid() bool {
 | |
| 	return len(provider.WebhookURL) > 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 = ":heavy_check_mark:"
 | |
| 		} else {
 | |
| 			prefix = ":x:"
 | |
| 		}
 | |
| 		results += fmt.Sprintf("%s - `%s`\n", prefix, conditionResult.Condition)
 | |
| 	}
 | |
| 	return &custom.AlertProvider{
 | |
| 		URL:    provider.WebhookURL,
 | |
| 		Method: "POST",
 | |
| 		Body: fmt.Sprintf(`{
 | |
|   "text": "",
 | |
|   "attachments": [
 | |
|     {
 | |
|       "title": ":helmet_with_white_cross: Gatus",
 | |
|       "text": "%s:\n> %s",
 | |
|       "short": false,
 | |
|       "color": "%s",
 | |
|       "fields": [
 | |
|         {
 | |
|           "title": "Condition results",
 | |
|           "value": "%s",
 | |
|           "short": false
 | |
|         }
 | |
|       ]
 | |
|     },
 | |
|   ]
 | |
| }`, message, alert.Description, color, results),
 | |
| 		Headers: map[string]string{"Content-Type": "application/json"},
 | |
| 	}
 | |
| }
 |