diff --git a/retrieval/target.go b/retrieval/target.go index ac52eb412..eb3b33e45 100644 --- a/retrieval/target.go +++ b/retrieval/target.go @@ -142,20 +142,17 @@ func (ts *TargetStatus) setLastError(err error) { type Target struct { // The status object for the target. It is only set once on initialization. status *TargetStatus - // The HTTP client used to scrape the target's endpoint. - httpClient *http.Client - // Closing scraperStopping signals that scraping should stop. scraperStopping chan struct{} // Closing scraperStopped signals that scraping has been stopped. scraperStopped chan struct{} // Channel to buffer ingested samples. ingestedSamples chan clientmodel.Samples - // Metric relabel configuration. - metricRelabelConfigs []*config.RelabelConfig // Mutex protects the members below. sync.RWMutex + // The HTTP client used to scrape the target's endpoint. + httpClient *http.Client // url is the URL to be scraped. Its host is immutable. url *url.URL // Labels before any processing. @@ -169,6 +166,8 @@ type Target struct { // Whether the target's labels have precedence over the base labels // assigned by the scraping instance. honorLabels bool + // Metric relabel configuration. + metricRelabelConfigs []*config.RelabelConfig } // NewTarget creates a reasonably configured target for querying. @@ -331,6 +330,14 @@ func (t *Target) scrape(sampleAppender storage.SampleAppender) (err error) { start := time.Now() baseLabels := t.BaseLabels() + t.RLock() + var ( + honorLabels = t.honorLabels + httpClient = t.httpClient + metricRelabelConfigs = t.metricRelabelConfigs + ) + t.RUnlock() + defer func() { t.status.setLastError(err) recordScrapeHealth(sampleAppender, clientmodel.TimestampFromTime(start), baseLabels, t.status.Health(), time.Since(start)) @@ -342,7 +349,7 @@ func (t *Target) scrape(sampleAppender storage.SampleAppender) (err error) { } req.Header.Add("Accept", acceptHeader) - resp, err := t.httpClient.Do(req) + resp, err := httpClient.Do(req) if err != nil { return err } @@ -368,7 +375,7 @@ func (t *Target) scrape(sampleAppender storage.SampleAppender) (err error) { for samples := range t.ingestedSamples { for _, s := range samples { - if t.honorLabels { + if honorLabels { // Merge the metric with the baseLabels for labels not already set in the // metric. This also considers labels explicitly set to the empty string. for ln, lv := range baseLabels { @@ -387,10 +394,10 @@ func (t *Target) scrape(sampleAppender storage.SampleAppender) (err error) { } } // Avoid the copy in Relabel if there are no configs. - if len(t.metricRelabelConfigs) > 0 { - labels, err := Relabel(clientmodel.LabelSet(s.Metric), t.metricRelabelConfigs...) + if len(metricRelabelConfigs) > 0 { + labels, err := Relabel(clientmodel.LabelSet(s.Metric), metricRelabelConfigs...) if err != nil { - log.Errorf("Error while relabeling metric %s of instance %s: %s", s.Metric, t.url, err) + log.Errorf("Error while relabeling metric %s of instance %s: %s", s.Metric, req.URL, err) continue } // Check if the timeseries was dropped.