71 lines
1.5 KiB
Go
71 lines
1.5 KiB
Go
package notify
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"log"
|
|
|
|
"github.com/slack-go/slack"
|
|
)
|
|
|
|
type SlackContextKey string
|
|
|
|
const (
|
|
slackHookBaseURL = "hooks.slack.com/services"
|
|
DryRunContextKey SlackContextKey = "dryRun"
|
|
)
|
|
|
|
//Notifier interface represent mean to send notification
|
|
type Notifier interface {
|
|
Notify(message string)
|
|
}
|
|
|
|
//Message store and represent alerting message
|
|
type Message struct {
|
|
ShouldNotify bool
|
|
Content string
|
|
}
|
|
|
|
type SlackNotifier struct {
|
|
BotID string
|
|
DestChannelID string
|
|
WebhookID string
|
|
}
|
|
|
|
//NewSlackNotifier create slack notifier
|
|
func NewSlackNotifier(BotID, DestChannelID, WebhookID string) *SlackNotifier {
|
|
return &SlackNotifier{
|
|
BotID: BotID,
|
|
DestChannelID: DestChannelID,
|
|
WebhookID: WebhookID,
|
|
}
|
|
}
|
|
|
|
//Notify send notification to channel
|
|
func (sn *SlackNotifier) Notify(ctx context.Context, messages ...Message) {
|
|
shouldNotify := false
|
|
var content string
|
|
for _, message := range messages {
|
|
if message.ShouldNotify {
|
|
shouldNotify = true
|
|
content = fmt.Sprintf("%s\n%s", content, message.Content)
|
|
}
|
|
}
|
|
if shouldNotify {
|
|
msg := &slack.WebhookMessage{
|
|
Text: content,
|
|
}
|
|
|
|
url := fmt.Sprintf("https://%s/%s/%s/%s", slackHookBaseURL, sn.BotID, sn.DestChannelID, sn.WebhookID)
|
|
if v := ctx.Value(DryRunContextKey); v != nil && v == true {
|
|
log.Printf("dryrun mode : slack notify to %s\n", url)
|
|
log.Printf("dryrun mode : %+v\n", msg)
|
|
} else {
|
|
err := slack.PostWebhook(url, msg)
|
|
if err != nil {
|
|
log.Printf("Send message error %+v", err)
|
|
}
|
|
}
|
|
}
|
|
}
|