diff --git a/retrieval/scrape.go b/retrieval/scrape.go index ad89b6a85f..5ed91d422d 100644 --- a/retrieval/scrape.go +++ b/retrieval/scrape.go @@ -584,7 +584,10 @@ loop: sl.refCache[mets] = ref str := lset.String() sl.lsetCache[ref] = lsetCacheEntry{lset: lset, str: str} - samplesScraped[str] = lset + if tp == nil { + // Bypass staleness logic if there is an explicit timestamp. + samplesScraped[str] = lset + } } added++ } diff --git a/retrieval/scrape_test.go b/retrieval/scrape_test.go index 6543061d72..8b1eed2631 100644 --- a/retrieval/scrape_test.go +++ b/retrieval/scrape_test.go @@ -520,6 +520,38 @@ func TestScrapeLoopAppendStaleness(t *testing.T) { } +func TestScrapeLoopAppendNoStalenessIfTimestamp(t *testing.T) { + app := &collectResultAppender{} + sl := &scrapeLoop{ + appender: func() storage.Appender { return app }, + reportAppender: func() storage.Appender { return nopAppender{} }, + refCache: map[string]uint64{}, + lsetCache: map[uint64]lsetCacheEntry{}, + } + + now := time.Now() + _, _, err := sl.append([]byte("metric_a 1 1000\n"), now) + if err != nil { + t.Fatalf("Unexpected append error: %s", err) + } + _, _, err = sl.append([]byte(""), now.Add(time.Second)) + if err != nil { + t.Fatalf("Unexpected append error: %s", err) + } + + want := []sample{ + { + metric: labels.FromStrings(model.MetricNameLabel, "metric_a"), + t: 1000, + v: 1, + }, + } + if !reflect.DeepEqual(want, app.result) { + t.Fatalf("Appended samples not as expected. Wanted: %+v Got: %+v", want, app.result) + } + +} + func TestTargetScraperScrapeOK(t *testing.T) { const ( configTimeout = 1500 * time.Millisecond