// ApplyConfig updates the status state as the new config requires. func (n *Notifier) ApplyConfig(conf *config.Config) error { n.mtx.Lock() defer n.mtx.Unlock() n.opts.ExternalLabels = conf.GlobalConfig.ExternalLabels n.opts.RelabelConfigs = conf.AlertingConfig.AlertRelabelConfigs amSets := []*alertmanagerSet{} ctx, cancel := context.WithCancel(n.ctx) for _, cfg := range conf.AlertingConfig.AlertmanagerConfigs { ams, err := newAlertmanagerSet(cfg) if err != nil { return err } amSets = append(amSets, ams) } // After all sets were created successfully, start them and cancel the // old ones. for _, ams := range amSets { go ams.ts.Run(ctx) ams.ts.UpdateProviders(discovery.ProvidersFromConfig(ams.cfg.ServiceDiscoveryConfig)) } if n.cancelDiscovery != nil { n.cancelDiscovery() } n.cancelDiscovery = cancel n.alertmanagers = amSets return nil }
func (tm *TargetManager) reload() { jobs := map[string]struct{}{} // Start new target sets and update existing ones. for _, scfg := range tm.scrapeConfigs { jobs[scfg.JobName] = struct{}{} ts, ok := tm.targetSets[scfg.JobName] if !ok { ctx, cancel := context.WithCancel(tm.ctx) ts = &targetSet{ ctx: ctx, cancel: cancel, sp: newScrapePool(ctx, scfg, tm.appender), } ts.ts = discovery.NewTargetSet(ts.sp) tm.targetSets[scfg.JobName] = ts tm.wg.Add(1) go func(ts *targetSet) { // Run target set, which blocks until its context is canceled. // Gracefully shut down pending scrapes in the scrape pool afterwards. ts.ts.Run(ctx) ts.sp.stop() tm.wg.Done() }(ts) } else { ts.sp.reload(scfg) } ts.ts.UpdateProviders(discovery.ProvidersFromConfig(scfg.ServiceDiscoveryConfig)) } // Remove old target sets. Waiting for scrape pools to complete pending // scrape inserts is already guaranteed by the goroutine that started the target set. for name, ts := range tm.targetSets { if _, ok := jobs[name]; !ok { ts.cancel() delete(tm.targetSets, name) } } }