in alerter/service.go [74:138]
func NewService(opts *AlerterOpts) (*Alerter, error) {
ruleStore := rules.NewStore(rules.StoreOpts{
Region: opts.Region,
CtrlCli: opts.CtrlCli,
})
l2m := &Alerter{
opts: opts,
queue: make(chan struct{}, opts.Concurrency),
CtrlCli: opts.CtrlCli,
ruleStore: ruleStore,
clients: make(map[string]KustoClient),
}
if opts.MSIID != "" {
logger.Infof("Using MSI ID=%s", opts.MSIID)
}
authConfigure, err := multikustoclient.GetAuth(multikustoclient.MsiAuth(opts.MSIID), multikustoclient.TokenAuth("https://kusto.kusto.windows.net", opts.KustoToken), multikustoclient.DefaultAuth())
if err != nil {
return nil, fmt.Errorf("failed to get auth: %w", err)
}
kclient, err := multikustoclient.New(opts.KustoEndpoints, authConfigure, opts.MaxNotifications)
if err != nil {
return nil, err
}
if opts.CtrlCli == nil {
logger.Warnf("No kusto endpoints provided, using fake kusto clients")
fakeRule := &rules.Rule{
Namespace: "fake-namespace",
Name: "FakeRule",
Database: "FakeDB",
Interval: time.Minute,
Query: `UnderlayNodeInfo | where Region == ParamRegion | limit 1 | project Title="test"`,
}
l2m.clients[fakeRule.Database] = fakeKustoClient{endpoint: "http://fake.endpoint"}
ruleStore.Register(fakeRule)
}
if opts.AlertAddr == "" {
logger.Warnf("No alert address provided, using fake alert handler")
http.Handle("/alerts", fakeAlertHandler())
opts.AlertAddr = fmt.Sprintf("http://localhost:%d", opts.Port)
}
alertCli, err := alert.NewClient(time.Minute)
if err != nil {
return nil, fmt.Errorf("failed to create alert client: %w", err)
}
l2m.alertCli = alertCli
executor := engine.NewExecutor(
engine.ExecutorOpts{
AlertCli: alertCli,
AlertAddr: opts.AlertAddr,
Region: opts.Region,
Tags: opts.Tags,
KustoClient: kclient,
RuleStore: ruleStore,
})
l2m.executor = executor
return l2m, nil
}