diff --git a/retrieval/target.go b/retrieval/target.go index a706c9cf63..5ac5b821b5 100644 --- a/retrieval/target.go +++ b/retrieval/target.go @@ -332,6 +332,31 @@ func (t *Target) path() string { return string(t.labels[model.MetricsPathLabel]) } +// wrapAppender wraps a SampleAppender for samples ingested from the target. +func (t *Target) wrapAppender(app storage.SampleAppender) storage.SampleAppender { + // The relabelAppender has to be inside the label-modifying appenders + // so the relabeling rules are applied to the correct label set. + if mrc := t.scrapeConfig.MetricRelabelConfigs; len(mrc) > 0 { + app = relabelAppender{ + SampleAppender: app, + relabelings: mrc, + } + } + + if t.scrapeConfig.HonorLabels { + app = honorLabelsAppender{ + SampleAppender: app, + labels: t.Labels(), + } + } else { + app = ruleLabelsAppender{ + SampleAppender: app, + labels: t.Labels(), + } + } + return app +} + // URL returns a copy of the target's URL. func (t *Target) URL() *url.URL { t.RLock() @@ -469,26 +494,8 @@ func (t *Target) scrape(appender storage.SampleAppender) error { }(appender) t.RLock() - // The relabelAppender has to be inside the label-modifying appenders - // so the relabeling rules are applied to the correct label set. - if len(t.scrapeConfig.MetricRelabelConfigs) > 0 { - appender = relabelAppender{ - SampleAppender: appender, - relabelings: t.scrapeConfig.MetricRelabelConfigs, - } - } - if t.scrapeConfig.HonorLabels { - appender = honorLabelsAppender{ - SampleAppender: appender, - labels: labels, - } - } else { - appender = ruleLabelsAppender{ - SampleAppender: appender, - labels: labels, - } - } + appender = t.wrapAppender(appender) httpClient := t.httpClient t.RUnlock() diff --git a/retrieval/target_test.go b/retrieval/target_test.go index 4cef0d4eff..0bb4484be5 100644 --- a/retrieval/target_test.go +++ b/retrieval/target_test.go @@ -91,6 +91,48 @@ func TestTargetOffset(t *testing.T) { } } +func TestTargetWrapAppender(t *testing.T) { + cfg := &config.ScrapeConfig{ + MetricRelabelConfigs: []*config.RelabelConfig{ + {}, {}, {}, + }, + } + + target := newTestTarget("example.com:80", 10*time.Millisecond, nil) + target.scrapeConfig = cfg + app := &nopAppender{} + + cfg.HonorLabels = false + wrapped := target.wrapAppender(app) + + rl, ok := wrapped.(ruleLabelsAppender) + if !ok { + t.Fatalf("Expected ruleLabelsAppender but got %T", wrapped) + } + re, ok := rl.SampleAppender.(relabelAppender) + if !ok { + t.Fatalf("Expected relabelAppender but got %T", rl.SampleAppender) + } + if re.SampleAppender != app { + t.Fatalf("Expected base appender but got %T", re.SampleAppender) + } + + cfg.HonorLabels = true + wrapped = target.wrapAppender(app) + + hl, ok := wrapped.(honorLabelsAppender) + if !ok { + t.Fatalf("Expected honorLabelsAppender but got %T", wrapped) + } + re, ok = hl.SampleAppender.(relabelAppender) + if !ok { + t.Fatalf("Expected relabelAppender but got %T", hl.SampleAppender) + } + if re.SampleAppender != app { + t.Fatalf("Expected base appender but got %T", re.SampleAppender) + } +} + func TestOverwriteLabels(t *testing.T) { type test struct { metric string