@ -349,7 +349,7 @@ func (app *timeLimitAppender) Append(ref storage.SeriesRef, lset labels.Labels,
// 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.
func PopulateLabels ( lset labels . Labels , cfg * config . ScrapeConfig , noDefaultPort bool ) ( res , orig labels . Labels , err error ) {
func PopulateLabels ( lb * labels . Builder , cfg * config . ScrapeConfig , noDefaultPort bool ) ( 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 } ,
@ -358,10 +358,9 @@ func PopulateLabels(lset labels.Labels, cfg *config.ScrapeConfig, noDefaultPort
{ 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 == "" {
if lb . Get ( l . Name ) == "" {
lb . Set ( l . Name , l . Value )
}
}
@ -373,18 +372,16 @@ func PopulateLabels(lset labels.Labels, cfg *config.ScrapeConfig, noDefaultPort
}
preRelabelLabels := lb . Labels ( labels . EmptyLabels ( ) )
lset , keep := relabel . Process ( preRe la belLabels , cfg . RelabelConfigs ... )
keep := relabel . ProcessBuilder ( lb , cfg . RelabelConfigs ... )
// Check if the target was dropped.
if ! keep {
return labels . EmptyLabels ( ) , preRelabelLabels , nil
}
if v := lset . Get ( model . AddressLabel ) ; v == "" {
if v := lb . Get ( model . AddressLabel ) ; v == "" {
return labels . EmptyLabels ( ) , labels . EmptyLabels ( ) , 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 ) ( string , string , bool ) {
@ -398,8 +395,8 @@ func PopulateLabels(lset labels.Labels, cfg *config.ScrapeConfig, noDefaultPort
return "" , "" , err == nil
}
addr := lset . Get ( model . AddressLabel )
scheme := lset . Get ( model . SchemeLabel )
addr := lb . Get ( model . AddressLabel )
scheme := lb . Get ( model . SchemeLabel )
host , port , add := addPort ( addr )
// If it's an address with no trailing port, infer it based on the used scheme
// unless the no-default-scrape-port feature flag is present.
@ -435,7 +432,7 @@ func PopulateLabels(lset labels.Labels, cfg *config.ScrapeConfig, noDefaultPort
return labels . EmptyLabels ( ) , labels . EmptyLabels ( ) , err
}
interval := lset . Get ( model . ScrapeIntervalLabel )
interval := lb . Get ( model . ScrapeIntervalLabel )
intervalDuration , err := model . ParseDuration ( interval )
if err != nil {
return labels . EmptyLabels ( ) , labels . EmptyLabels ( ) , errors . Errorf ( "error parsing scrape interval: %v" , err )
@ -444,7 +441,7 @@ func PopulateLabels(lset labels.Labels, cfg *config.ScrapeConfig, noDefaultPort
return labels . EmptyLabels ( ) , labels . EmptyLabels ( ) , errors . New ( "scrape interval cannot be 0" )
}
timeout := lset . Get ( model . ScrapeTimeoutLabel )
timeout := lb . Get ( model . ScrapeTimeoutLabel )
timeoutDuration , err := model . ParseDuration ( timeout )
if err != nil {
return labels . EmptyLabels ( ) , labels . EmptyLabels ( ) , errors . Errorf ( "error parsing scrape timeout: %v" , err )
@ -459,14 +456,14 @@ func PopulateLabels(lset labels.Labels, cfg *config.ScrapeConfig, noDefaultPort
// Meta labels are deleted after relabelling. Other internal labels propagate to
// the target which decides whether they will be part of their label set.
lset . Range ( func ( l labels . Label ) {
lb . Range ( func ( l labels . Label ) {
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 == "" {
if v := lb . Get ( model . InstanceLabel ) ; v == "" {
lb . Set ( model . InstanceLabel , addr )
}
@ -485,25 +482,23 @@ func PopulateLabels(lset labels.Labels, cfg *config.ScrapeConfig, noDefaultPort
}
// TargetsFromGroup builds targets based on the given TargetGroup and config.
func TargetsFromGroup ( tg * targetgroup . Group , cfg * config . ScrapeConfig , noDefaultPort bool ) ( [ ] * Target , [ ] error ) {
targets := make ( [ ] * Target , 0 , len ( tg . Targets ) )
func TargetsFromGroup ( tg * targetgroup . Group , cfg * config . ScrapeConfig , noDefaultPort bool , targets [ ] * Target , lb * labels . Builder ) ( [ ] * Target , [ ] error ) {
targets = targets [ : 0 ]
failures := [ ] error { }
for i , tlset := range tg . Targets {
lbls := make ( [ ] labels . Label , 0 , len ( tlset ) + len ( tg . Labels ) )
lb . Reset ( labels . EmptyLabels ( ) )
for ln , lv := range tlset {
lbls = append ( lbls , labels . Label { Name : string ( ln ) , Value : string ( lv ) } )
lb . Set ( string ( ln ) , string ( lv ) )
}
for ln , lv := range tg . Labels {
if _ , ok := tlset [ ln ] ; ! ok {
lbls = append ( lbls , labels . Label { Name : string ( ln ) , Value : string ( lv ) } )
lb . Set ( string ( ln ) , string ( lv ) )
}
}
lset := labels . New ( lbls ... )
lset , origLabels , err := PopulateLabels ( lset , cfg , noDefaultPort )
lset , origLabels , err := PopulateLabels ( lb , cfg , noDefaultPort )
if err != nil {
failures = append ( failures , errors . Wrapf ( err , "instance %d in group %s" , i , tg ) )
}