func (sp *scrapePool) sync(targets []*Target) {
	sp.mtx.Lock()
	defer sp.mtx.Unlock()

	var (
		uniqueTargets   = map[uint64]struct{}{}
		interval        = time.Duration(sp.config.ScrapeInterval)
		timeout         = time.Duration(sp.config.ScrapeTimeout)
		limit           = int(sp.config.SampleLimit)
		honorLabels     = sp.config.HonorLabels
		honorTimestamps = sp.config.HonorTimestamps
		mrc             = sp.config.MetricRelabelConfigs
	)

	for _, t := range targets {
		t := t
		hash := t.hash()
		uniqueTargets[hash] = struct{}{}

		if _, ok := sp.activeTargets[hash]; !ok {
			s := &targetScraper{Target: t, client: sp.client, timeout: timeout}
			l := sp.newLoop(scrapeLoopOptions{
				target:          t,
				scraper:         s,
				limit:           limit,
				honorLabels:     honorLabels,
				honorTimestamps: honorTimestamps,
				mrc:             mrc,
			})

			sp.activeTargets[hash] = t
			sp.loops[hash] = l

			go l.run(interval, timeout, nil)
		} else {
			// Need to keep the most updated labels information
			// for displaying it in the Service Discovery web page.
			sp.activeTargets[hash].SetDiscoveredLabels(t.DiscoveredLabels())
		}
	}

	var wg sync.WaitGroup

	// Stop and remove old targets and scraper loops.
	for hash := range sp.activeTargets {
		if _, ok := uniqueTargets[hash]; !ok {
			wg.Add(1)
			go func(l loop) {

				l.stop()

				wg.Done()
			}(sp.loops[hash])

			delete(sp.loops, hash)
			delete(sp.activeTargets, hash)
		}
	}

	// Wait for all potentially stopped scrapers to terminate.
	// This covers the case of flapping targets. If the server is under high load, a new scraper
	// may be active and tries to insert. The old scraper that didn't terminate yet could still
	// be inserting a previous sample set.
	wg.Wait()
}
func (sp *scrapePool) sync(targets []*Target) {
	sp.mtx.Lock()
	defer sp.mtx.Unlock()

	var (
		uniqueTargets   = map[uint64]struct{}{}
		interval        = time.Duration(sp.config.ScrapeInterval)
		timeout         = time.Duration(sp.config.ScrapeTimeout)
		limit           = int(sp.config.SampleLimit)
		honorLabels     = sp.config.HonorLabels
		honorTimestamps = sp.config.HonorTimestamps
		mrc             = sp.config.MetricRelabelConfigs
	)

	for _, t := range targets {
		t := t
		hash := t.hash()
		uniqueTargets[hash] = struct{}{}

		if _, ok := sp.activeTargets[hash]; !ok {
			s := &targetScraper{Target: t, client: sp.client, timeout: timeout}
			l := sp.newLoop(scrapeLoopOptions{
				target:          t,
				scraper:         s,
				limit:           limit,
				honorLabels:     honorLabels,
				honorTimestamps: honorTimestamps,
				mrc:             mrc,
			})

			sp.activeTargets[hash] = t
			sp.loops[hash] = l

			go l.run(interval, timeout, nil)
		} else {
			
			
			sp.activeTargets[hash].SetDiscoveredLabels(t.DiscoveredLabels())
		}
	}

	var wg sync.WaitGroup

	
	for hash := range sp.activeTargets {
		if _, ok := uniqueTargets[hash]; !ok {
			wg.Add(1)
			go func(l loop) {

				l.stop()

				wg.Done()
			}(sp.loops[hash])

			delete(sp.loops, hash)
			delete(sp.activeTargets, hash)
		}
	}

	
	
	
	
	wg.Wait()
}
func ( sp * scrapePool ) sync ( targets [ ] * Target ) { sp . mtx . Lock ( ) defer sp . mtx . Unlock ( ) var ( uniqueTargets = map [ uint64 ] struct { } { } interval = time . Duration ( sp . config . ScrapeInterval ) timeout = time . Duration ( sp . config . ScrapeTimeout ) limit = int ( sp . config . SampleLimit ) honorLabels = sp . config . HonorLabels honorTimestamps = sp . config . HonorTimestamps mrc = sp . config . MetricRelabelConfigs ) for _ , t := range targets { t := t hash := t . hash ( ) uniqueTargets [ hash ] = struct { } { } if _ , ok := sp . activeTargets [ hash ] ; ! ok { s := & targetScraper { Target : t , client : sp . client , timeout : timeout } l := sp . newLoop ( scrapeLoopOptions { target : t , scraper : s , limit : limit , honorLabels : honorLabels , honorTimestamps : honorTimestamps , mrc : mrc , } ) sp . activeTargets [ hash ] = t sp . loops [ hash ] = l go l . run ( interval , timeout , nil ) } else { // Need to keep the most updated labels information // for displaying it in the Service Discovery web page. sp . activeTargets [ hash ] . SetDiscoveredLabels ( t . DiscoveredLabels ( ) ) } } var wg sync . WaitGroup // Stop and remove old targets and scraper loops. for hash := range sp . activeTargets { if _ , ok := uniqueTargets [ hash ] ; ! ok { wg . Add ( 1 ) go func ( l loop ) { l . stop ( ) wg . Done ( ) } ( sp . loops [ hash ] ) delete ( sp . loops , hash ) delete ( sp . activeTargets , hash ) } } // Wait for all potentially stopped scrapers to terminate. // This covers the case of flapping targets. If the server is under high load, a new scraper // may be active and tries to insert. The old scraper that didn't terminate yet could still // be inserting a previous sample set. wg . Wait ( ) }
// sync takes a list of potentially duplicated targets, deduplicates them, starts
// scrape loops for new targets, and stops scrape loops for disappeared targets.
// It returns after all stopped scrape loops terminated.
sync takes a list of potentially duplicated targets deduplicates them starts scrape loops for new targets and stops scrape loops for disappeared targets . It returns after all stopped scrape loops terminated .