moira

Форк
0
/
registrator.go 
109 строк · 4.0 Кб
1
package notifier
2

3
import (
4
	"fmt"
5
	"strings"
6

7
	"go.avito.ru/DO/moira"
8
	"go.avito.ru/DO/moira/senders/mail"
9
	"go.avito.ru/DO/moira/senders/pushover"
10
	"go.avito.ru/DO/moira/senders/script"
11
	"go.avito.ru/DO/moira/senders/slack"
12
	"go.avito.ru/DO/moira/senders/telegram"
13
	"go.avito.ru/DO/moira/senders/twilio"
14
	"go.avito.ru/DO/moira/senders/webhook"
15
)
16

17
// RegisterSenders watch on senders config and register all configured senders
18
func (notifier *StandardNotifier) RegisterSenders(connector moira.Database) error {
19
	for _, senderSettings := range notifier.config.Senders {
20
		senderSettings["front_uri"] = notifier.config.FrontURL
21
		switch senderSettings["type"] {
22
		case "pushover":
23
			if err := notifier.RegisterSender(senderSettings, &pushover.Sender{}); err != nil {
24
				notifier.logger.Fatal(fmt.Sprintf("Can not register sender %s: %s", senderSettings["type"], err))
25
			}
26
		case "slack":
27
			if err := notifier.RegisterSender(senderSettings, &slack.Sender{DataBase: connector}); err != nil {
28
				notifier.logger.Fatal(fmt.Sprintf("Can not register sender %s: %s", senderSettings["type"], err))
29
			}
30
		case "mail":
31
			if err := notifier.RegisterSender(senderSettings, &mail.Sender{}); err != nil {
32
				notifier.logger.Fatal(fmt.Sprintf("Can not register sender %s: %s", senderSettings["type"], err))
33
			}
34
		case "script":
35
			if err := notifier.RegisterSender(senderSettings, &script.Sender{}); err != nil {
36
				notifier.logger.Fatal(fmt.Sprintf("Can not register sender %s: %s", senderSettings["type"], err))
37
			}
38
		case "telegram":
39
			if err := notifier.RegisterSender(senderSettings, &telegram.Sender{DataBase: connector}); err != nil {
40
				notifier.logger.Fatal(fmt.Sprintf("Can not register sender %s: %s", senderSettings["type"], err))
41
			}
42
		case "twilio sms":
43
			if err := notifier.RegisterSender(senderSettings, &twilio.Sender{}); err != nil {
44
				notifier.logger.Fatal(fmt.Sprintf("Can not register sender %s: %s", senderSettings["type"], err))
45
			}
46
		case "twilio voice":
47
			if err := notifier.RegisterSender(senderSettings, &twilio.Sender{}); err != nil {
48
				notifier.logger.Fatal(fmt.Sprintf("Can not register sender %s: %s", senderSettings["type"], err))
49
			}
50
		case "webhook":
51
			if err := notifier.RegisterSender(senderSettings, &webhook.Sender{}); err != nil {
52
				notifier.logger.Fatal(fmt.Sprintf("Can not register sender %s: %s", senderSettings["type"], err))
53
			}
54
		default:
55
			return fmt.Errorf("Unknown sender type [%s]", senderSettings["type"])
56
		}
57
	}
58

59
	// also add metrics for slack delayed action worker
60
	notifier.addSenderMetrics(slack.DelayedActionWorkerId)
61

62
	return nil
63
}
64

65
// RegisterSender adds sender for notification type and registers metrics
66
func (notifier *StandardNotifier) RegisterSender(senderSettings map[string]string, sender moira.Sender) error {
67
	var senderIdent string
68
	if senderSettings["type"] == "script" {
69
		senderIdent = senderSettings["name"]
70
	} else {
71
		senderIdent = senderSettings["type"]
72
	}
73

74
	err := sender.Init(senderSettings, notifier.config.Location)
75
	if err != nil {
76
		return fmt.Errorf("Don't initialize sender [%s], err [%s]", senderIdent, err.Error())
77
	}
78

79
	ch := make(chan NotificationPackage)
80
	notifier.senders[senderIdent] = ch
81
	notifier.addSenderMetrics(senderIdent)
82
	notifier.waitGroup.Add(1)
83

84
	go notifier.run(sender, ch)
85

86
	notifier.logger.Info(fmt.Sprintf("Sender %s registered", senderIdent))
87
	return nil
88
}
89

90
// StopSenders close all sending channels
91
func (notifier *StandardNotifier) StopSenders() {
92
	for _, ch := range notifier.senders {
93
		close(ch)
94
	}
95

96
	notifier.senders = make(map[string]chan NotificationPackage)
97
	notifier.logger.Info("Waiting senders finish...")
98
	notifier.waitGroup.Wait()
99
	notifier.logger.Info("Moira Notifier Senders stopped")
100
}
101

102
func (notifier *StandardNotifier) addSenderMetrics(id string) {
103
	notifier.metrics.SendersOkMetrics.AddMetric(id, fmt.Sprintf("notifier.%s.sends_ok", getGraphiteSenderIdent(id)))
104
	notifier.metrics.SendersFailedMetrics.AddMetric(id, fmt.Sprintf("notifier.%s.sends_failed", getGraphiteSenderIdent(id)))
105
}
106

107
func getGraphiteSenderIdent(ident string) string {
108
	return strings.Replace(ident, " ", "_", -1)
109
}
110

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.