Skip to content

Target.URL() method should only need a read lock #16549

@Shuimo03

Description

@Shuimo03

Proposal

 // ref: https://github.com/prometheus/prometheus/blob/main/scrape/target.go 

func (t *Target) URL() *url.URL {
	t.mtx.Lock()
	configParams := t.scrapeConfig.Params
	t.mtx.Unlock()
	params := url.Values{}

	for k, v := range configParams {
		params[k] = make([]string, len(v))
		copy(params[k], v)
	}
	t.labels.Range(func(l labels.Label) {
		if !strings.HasPrefix(l.Name, model.ParamLabelPrefix) {
			return
		}
		ks := l.Name[len(model.ParamLabelPrefix):]

		if len(params[ks]) > 0 {
			params[ks][0] = l.Value
		} else {
			params[ks] = []string{l.Value}
		}
	})

	return &url.URL{
		Scheme:   t.labels.Get(model.SchemeLabel),
		Host:     t.labels.Get(model.AddressLabel),
		Path:     t.labels.Get(model.MetricsPathLabel),
		RawQuery: params.Encode(),
	}
}

Why don't use:

t.mtx.RLock()
defer t.mtx.RUnlock()
configParams := t.scrapeConfig.Params

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions