12
"go.avito.ru/DO/moira"
13
"go.avito.ru/DO/moira/cmd"
14
"go.avito.ru/DO/moira/database/neo4j"
15
"go.avito.ru/DO/moira/database/redis"
16
"go.avito.ru/DO/moira/fan"
17
"go.avito.ru/DO/moira/logging"
18
"go.avito.ru/DO/moira/metrics"
19
"go.avito.ru/DO/moira/notifier"
20
"go.avito.ru/DO/moira/notifier/escalations"
21
"go.avito.ru/DO/moira/notifier/events"
22
"go.avito.ru/DO/moira/notifier/notifications"
23
"go.avito.ru/DO/moira/notifier/selfstate"
24
"go.avito.ru/DO/moira/panicwrap"
25
"go.avito.ru/DO/moira/sentry"
29
serviceName = "notifier"
34
configFileName = flag.String("config", "/etc/moira/notifier.yml", "path to config file")
35
printVersion = flag.Bool("version", false, "Print current version and exit")
36
printDefaultConfigFlag = flag.Bool("default-config", false, "Print default config and exit")
41
MoiraVersion = "unknown"
47
rand.Seed(time.Now().UnixNano())
51
fmt.Println("Moira Notifier")
52
fmt.Println("Version:", MoiraVersion)
53
fmt.Println("Git Commit:", GitCommit)
54
fmt.Println("Go Version:", GoVersion)
58
config := getDefault()
59
if *printDefaultConfigFlag {
60
cmd.PrintConfig(config)
64
err := cmd.ReadConfig(*configFileName, &config)
66
_, _ = fmt.Fprintf(os.Stderr, "Can not read settings: %s\n", err.Error())
70
if err = metrics.Init(config.Statsd.GetSettings(), config.Notifier.LimitMetrics.GetSettings()); err != nil {
71
_, _ = fmt.Fprintf(os.Stderr, "Can not configure metrics: %v\n", err)
75
if err = logging.Init(logging.ComponentNotifier, config.Rsyslog.GetSettings(), config.Notifier.LimitLogger.GetSettings()); err != nil {
76
_, _ = fmt.Fprintf(os.Stderr, "Can not configure log: %v\n", err)
80
if err = sentry.Init(config.Notifier.Sentry.GetSettings(), serviceName); err != nil {
81
_, _ = fmt.Fprintf(os.Stderr, "Can not configure sentry: %v\n", err)
84
panicwrap.Init(serviceName)
86
logger = logging.GetLogger("")
87
defer logger.InfoF("Moira Notifier Stopped. Version: %s", MoiraVersion)
89
if config.Pprof.Listen != "" {
90
logger.InfoF("Starting pprof server at: [%s]", config.Pprof.Listen)
91
cmd.StartProfiling(logger, config.Pprof)
94
if config.Liveness.Listen != "" {
95
logger.InfoF("Starting liveness server at: [%s]", config.Liveness.Listen)
96
cmd.StartLiveness(logger, config.Liveness)
99
databaseSettings := config.Redis.GetSettings()
100
database := redis.NewDatabase(logger, databaseSettings)
101
notifierMetrics := metrics.NewNotifierMetrics()
103
triggerInheritanceDatabase, err := neo4j.NewDatabase(logger, config.Neo4j)
105
logger.FatalF("Can not configure Neo4j: %v", err)
108
notifierConfig := config.Notifier.getSettings(logger)
109
sender := notifier.NewNotifier(database, notifierConfig, notifierMetrics)
112
if err := sender.RegisterSenders(database); err != nil {
113
logger.FatalF("Can not configure senders: %v", err)
115
defer database.DeregisterBots()
118
selfState := &selfstate.SelfCheckWorker{
119
Config: config.Notifier.SelfState.getSettings(),
124
if err := selfState.Start(); err != nil {
125
logger.FatalF("SelfState failed: %v", err)
127
defer stopSelfStateChecker(selfState)
130
fetchNotificationsWorker := ¬ifications.FetchNotificationsWorker{
133
TriggerInheritanceDatabase: triggerInheritanceDatabase,
136
fetchNotificationsWorker.Start()
137
defer stopNotificationsFetcher(fetchNotificationsWorker)
140
for _, withSaturations := range [...]bool{true, false} {
143
withSaturations := withSaturations
145
fetchEventsWorker := &events.FetchEventsWorker{
148
TriggerInheritanceDatabase: triggerInheritanceDatabase,
149
Scheduler: notifier.NewScheduler(database, notifierMetrics),
150
Metrics: notifierMetrics,
151
Fan: fan.NewClient(config.Notifier.FanURL),
153
Fetcher: func() (events moira.NotificationEvents, err error) {
154
event, err := database.FetchNotificationEvent(withSaturations)
155
return moira.NotificationEvents{event}, err
158
fetchEventsWorker.Start()
159
defer stopFetchEvents(fetchEventsWorker)
163
for _, withSaturations := range [...]bool{true, false} {
164
withSaturations := withSaturations
165
fetchDelayedEventsWorker := &events.FetchEventsWorker{
168
TriggerInheritanceDatabase: triggerInheritanceDatabase,
169
Scheduler: notifier.NewScheduler(database, notifierMetrics),
170
Metrics: notifierMetrics,
171
Fan: fan.NewClient(config.Notifier.FanURL),
173
Fetcher: func() (events moira.NotificationEvents, err error) {
174
time.Sleep(5 * time.Second)
175
return database.FetchDelayedNotificationEvents(time.Now().Unix(), withSaturations)
178
fetchDelayedEventsWorker.Start()
179
defer stopFetchEvents(fetchDelayedEventsWorker)
183
fetchEscalationsWorker := &escalations.FetchEscalationsWorker{
187
fetchEscalationsWorker.Start()
188
defer stopEscalationsFetcher(fetchEscalationsWorker)
190
logger.InfoF("Moira Notifier Started. Version: %s", MoiraVersion)
191
ch := make(chan os.Signal, 1)
192
signal.Notify(ch, syscall.SIGINT, syscall.SIGTERM)
193
logger.Info(fmt.Sprint(<-ch))
194
logger.Info("Moira Notifier shutting down.")
197
func stopFetchEvents(worker *events.FetchEventsWorker) {
198
if err := worker.Stop(); err != nil {
199
logger.ErrorF("Failed to stop events fetcher: %v", err)
203
func stopNotificationsFetcher(worker *notifications.FetchNotificationsWorker) {
204
if err := worker.Stop(); err != nil {
205
logger.ErrorF("Failed to stop notifications fetcher: %v", err)
209
func stopSelfStateChecker(checker *selfstate.SelfCheckWorker) {
210
if err := checker.Stop(); err != nil {
211
logger.ErrorF("Failed to stop self check worker: %v", err)
215
func stopEscalationsFetcher(worker *escalations.FetchEscalationsWorker) {
216
if err := worker.Stop(); err != nil {
217
logger.ErrorF("Failed to stop escalations fetcher: %v", err)