|
|
|
@ -103,43 +103,7 @@ func (m *Manager) ApplyConfig(cfg *config.Config) error {
|
|
|
|
|
m.cancelDiscoverers()
|
|
|
|
|
for _, scfg := range cfg.ScrapeConfigs {
|
|
|
|
|
for provName, prov := range m.providersFromConfig(scfg.ServiceDiscoveryConfig) {
|
|
|
|
|
ctx, cancel := context.WithCancel(m.ctx)
|
|
|
|
|
updates := make(chan []*config.TargetGroup)
|
|
|
|
|
|
|
|
|
|
m.discoverCancel = append(m.discoverCancel, cancel)
|
|
|
|
|
|
|
|
|
|
go prov.Run(ctx, updates)
|
|
|
|
|
go func(provName string) {
|
|
|
|
|
select {
|
|
|
|
|
case <-ctx.Done():
|
|
|
|
|
// First set of all endpoints the provider knows.
|
|
|
|
|
case tgs, ok := <-updates:
|
|
|
|
|
// Handle the case that a target provider exits and closes the channel
|
|
|
|
|
// before the context is done.
|
|
|
|
|
if !ok {
|
|
|
|
|
break
|
|
|
|
|
}
|
|
|
|
|
m.syncCh <- m.mergeGroups(scfg.JobName, provName, tgs)
|
|
|
|
|
case <-time.After(5 * time.Second):
|
|
|
|
|
// Initial set didn't arrive. Act as if it was empty
|
|
|
|
|
// and wait for updates later on.
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Start listening for further updates.
|
|
|
|
|
for {
|
|
|
|
|
select {
|
|
|
|
|
case <-ctx.Done():
|
|
|
|
|
return
|
|
|
|
|
case tgs, ok := <-updates:
|
|
|
|
|
// Handle the case that a target provider exits and closes the channel
|
|
|
|
|
// before the context is done.
|
|
|
|
|
if !ok {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
m.syncCh <- m.mergeGroups(scfg.JobName, provName, tgs)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}(provName)
|
|
|
|
|
m.startProvider(scfg.JobName, provName, prov)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
close(err)
|
|
|
|
@ -148,6 +112,46 @@ func (m *Manager) ApplyConfig(cfg *config.Config) error {
|
|
|
|
|
return <-err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (m *Manager) startProvider(jobName, provName string, worker Discoverer) {
|
|
|
|
|
ctx, cancel := context.WithCancel(m.ctx)
|
|
|
|
|
updates := make(chan []*config.TargetGroup)
|
|
|
|
|
|
|
|
|
|
m.discoverCancel = append(m.discoverCancel, cancel)
|
|
|
|
|
|
|
|
|
|
go worker.Run(ctx, updates)
|
|
|
|
|
go func(provName string) {
|
|
|
|
|
select {
|
|
|
|
|
case <-ctx.Done():
|
|
|
|
|
// First set of all endpoints the provider knows.
|
|
|
|
|
case tgs, ok := <-updates:
|
|
|
|
|
// Handle the case that a target provider exits and closes the channel
|
|
|
|
|
// before the context is done.
|
|
|
|
|
if !ok {
|
|
|
|
|
break
|
|
|
|
|
}
|
|
|
|
|
m.syncCh <- m.mergeGroups(jobName, provName, tgs)
|
|
|
|
|
case <-time.After(5 * time.Second):
|
|
|
|
|
// Initial set didn't arrive. Act as if it was empty
|
|
|
|
|
// and wait for updates later on.
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Start listening for further updates.
|
|
|
|
|
for {
|
|
|
|
|
select {
|
|
|
|
|
case <-ctx.Done():
|
|
|
|
|
return
|
|
|
|
|
case tgs, ok := <-updates:
|
|
|
|
|
// Handle the case that a target provider exits and closes the channel
|
|
|
|
|
// before the context is done.
|
|
|
|
|
if !ok {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
m.syncCh <- m.mergeGroups(jobName, provName, tgs)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}(provName)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (m *Manager) cancelDiscoverers() {
|
|
|
|
|
for _, c := range m.discoverCancel {
|
|
|
|
|
c()
|
|
|
|
|