func populateLabels(lset labels.Labels, cfg *config.ScrapeConfig) (res, orig labels.Labels, err error) {
	// Copy labels into the labelset for the target if they are not set already.
	scrapeLabels := []labels.Label{
		{Name: model.JobLabel, Value: cfg.JobName},
		{Name: model.MetricsPathLabel, Value: cfg.MetricsPath},
		{Name: model.SchemeLabel, Value: cfg.Scheme},
	}
	lb := labels.NewBuilder(lset)

	for _, l := range scrapeLabels {
		if lv := lset.Get(l.Name); lv == "" {
			lb.Set(l.Name, l.Value)
		}
	}
	// Encode scrape query parameters as labels.
	for k, v := range cfg.Params {
		if len(v) > 0 {
			lb.Set(model.ParamLabelPrefix+k, v[0])
		}
	}

	preRelabelLabels := lb.Labels()
	lset = relabel.Process(preRelabelLabels, cfg.RelabelConfigs...)

	// Check if the target was dropped.
	if lset == nil {
		return nil, preRelabelLabels, nil
	}
	if v := lset.Get(model.AddressLabel); v == "" {
		return nil, nil, errors.New("no address")
	}

	lb = labels.NewBuilder(lset)

	// addPort checks whether we should add a default port to the address.
	// If the address is not valid, we don't append a port either.
	addPort := func(s string) bool {
		// If we can split, a port exists and we don't have to add one.
		if _, _, err := net.SplitHostPort(s); err == nil {
			return false
		}
		// If adding a port makes it valid, the previous error
		// was not due to an invalid address and we can append a port.
		_, _, err := net.SplitHostPort(s + ":1234")
		return err == nil
	}
	addr := lset.Get(model.AddressLabel)
	// If it's an address with no trailing port, infer it based on the used scheme.
	if addPort(addr) {
		// Addresses reaching this point are already wrapped in [] if necessary.
		switch lset.Get(model.SchemeLabel) {
		case "http", "":
			addr = addr + ":80"
		case "https":
			addr = addr + ":443"
		default:
			return nil, nil, errors.Errorf("invalid scheme: %q", cfg.Scheme)
		}
		lb.Set(model.AddressLabel, addr)
	}

	if err := config.CheckTargetAddress(model.LabelValue(addr)); err != nil {
		return nil, nil, err
	}

	// Meta labels are deleted after relabelling. Other internal labels propagate to
	// the target which decides whether they will be part of their label set.
	for _, l := range lset {
		if strings.HasPrefix(l.Name, model.MetaLabelPrefix) {
			lb.Del(l.Name)
		}
	}

	// Default the instance label to the target address.
	if v := lset.Get(model.InstanceLabel); v == "" {
		lb.Set(model.InstanceLabel, addr)
	}

	res = lb.Labels()
	for _, l := range res {
		// Check label values are valid, drop the target if not.
		if !model.LabelValue(l.Value).IsValid() {
			return nil, nil, errors.Errorf("invalid label value for %q: %q", l.Name, l.Value)
		}
	}
	return res, preRelabelLabels, nil
}
func populateLabels(lset labels.Labels, cfg *config.ScrapeConfig) (res, orig labels.Labels, err error) {
	
	scrapeLabels := []labels.Label{
		{Name: model.JobLabel, Value: cfg.JobName},
		{Name: model.MetricsPathLabel, Value: cfg.MetricsPath},
		{Name: model.SchemeLabel, Value: cfg.Scheme},
	}
	lb := labels.NewBuilder(lset)

	for _, l := range scrapeLabels {
		if lv := lset.Get(l.Name); lv == "" {
			lb.Set(l.Name, l.Value)
		}
	}
	
	for k, v := range cfg.Params {
		if len(v) > 0 {
			lb.Set(model.ParamLabelPrefix+k, v[0])
		}
	}

	preRelabelLabels := lb.Labels()
	lset = relabel.Process(preRelabelLabels, cfg.RelabelConfigs...)

	
	if lset == nil {
		return nil, preRelabelLabels, nil
	}
	if v := lset.Get(model.AddressLabel); v == "" {
		return nil, nil, errors.New("no address")
	}

	lb = labels.NewBuilder(lset)

	
	
	addPort := func(s string) bool {
		
		if _, _, err := net.SplitHostPort(s); err == nil {
			return false
		}
		
		
		_, _, err := net.SplitHostPort(s + ":1234")
		return err == nil
	}
	addr := lset.Get(model.AddressLabel)
	
	if addPort(addr) {
		
		switch lset.Get(model.SchemeLabel) {
		case "http", "":
			addr = addr + ":80"
		case "https":
			addr = addr + ":443"
		default:
			return nil, nil, errors.Errorf("invalid scheme: %q", cfg.Scheme)
		}
		lb.Set(model.AddressLabel, addr)
	}

	if err := config.CheckTargetAddress(model.LabelValue(addr)); err != nil {
		return nil, nil, err
	}

	
	
	for _, l := range lset {
		if strings.HasPrefix(l.Name, model.MetaLabelPrefix) {
			lb.Del(l.Name)
		}
	}

	
	if v := lset.Get(model.InstanceLabel); v == "" {
		lb.Set(model.InstanceLabel, addr)
	}

	res = lb.Labels()
	for _, l := range res {
		
		if !model.LabelValue(l.Value).IsValid() {
			return nil, nil, errors.Errorf("invalid label value for %q: %q", l.Name, l.Value)
		}
	}
	return res, preRelabelLabels, nil
}
func populateLabels ( lset labels . Labels , cfg * config . ScrapeConfig ) ( res , orig labels . Labels , err error ) { // Copy labels into the labelset for the target if they are not set already. scrapeLabels := [ ] labels . Label { { Name : model . JobLabel , Value : cfg . JobName } , { Name : model . MetricsPathLabel , Value : cfg . MetricsPath } , { Name : model . SchemeLabel , Value : cfg . Scheme } , } lb := labels . NewBuilder ( lset ) for _ , l := range scrapeLabels { if lv := lset . Get ( l . Name ) ; lv == " " { lb . Set ( l . Name , l . Value ) } } // Encode scrape query parameters as labels. for k , v := range cfg . Params { if len ( v ) > 0 { lb . Set ( model . ParamLabelPrefix + k , v [ 0 ] ) } } preRelabelLabels := lb . Labels ( ) lset = relabel . Process ( preRelabelLabels , cfg . RelabelConfigs ... ) // Check if the target was dropped. if lset == nil { return nil , preRelabelLabels , nil } if v := lset . Get ( model . AddressLabel ) ; v == " " { return nil , nil , errors . New ( " " ) } lb = labels . NewBuilder ( lset ) // addPort checks whether we should add a default port to the address. // If the address is not valid, we don't append a port either. addPort := func ( s string ) bool { // If we can split, a port exists and we don't have to add one. if _ , _ , err := net . SplitHostPort ( s ) ; err == nil { return false } // If adding a port makes it valid, the previous error // was not due to an invalid address and we can append a port. _ , _ , err := net . SplitHostPort ( s + " " ) return err == nil } addr := lset . Get ( model . AddressLabel ) // If it's an address with no trailing port, infer it based on the used scheme. if addPort ( addr ) { // Addresses reaching this point are already wrapped in [] if necessary. switch lset . Get ( model . SchemeLabel ) { case " " , " " : addr = addr + " " case " " : addr = addr + " " default : return nil , nil , errors . Errorf ( " " , cfg . Scheme ) } lb . Set ( model . AddressLabel , addr ) } if err := config . CheckTargetAddress ( model . LabelValue ( addr ) ) ; err != nil { return nil , nil , err } // Meta labels are deleted after relabelling. Other internal labels propagate to // the target which decides whether they will be part of their label set. for _ , l := range lset { if strings . HasPrefix ( l . Name , model . MetaLabelPrefix ) { lb . Del ( l . Name ) } } // Default the instance label to the target address. if v := lset . Get ( model . InstanceLabel ) ; v == " " { lb . Set ( model . InstanceLabel , addr ) } res = lb . Labels ( ) for _ , l := range res { // Check label values are valid, drop the target if not. if ! model . LabelValue ( l . Value ) . IsValid ( ) { return nil , nil , errors . Errorf ( " " , l . Name , l . Value ) } } return res , preRelabelLabels , nil }
// populateLabels builds a label set from the given label set and scrape configuration.
// It returns a label set before relabeling was applied as the second return value.
// Returns the original discovered label set found before relabelling was applied if the target is dropped during relabeling.
populateLabels builds a label set from the given label set and scrape configuration . It returns a label set before relabeling was applied as the second return value . Returns the original discovered label set found before relabelling was applied if the target is dropped during relabeling .