diff --git a/scrape/scrape.go b/scrape/scrape.go index a5562a0397..e36ed1a052 100644 --- a/scrape/scrape.go +++ b/scrape/scrape.go @@ -1779,7 +1779,7 @@ loop: } if err == nil { - if (parsedTimestamp == nil || sl.trackTimestampsStaleness) && ce != nil { + if (parsedTimestamp == nil || sl.trackTimestampsStaleness) && ce != nil && ce.ref != 0 { sl.cache.trackStaleness(ce.ref, ce) } } @@ -1798,7 +1798,7 @@ loop: // it in the scrape cache because we don't need to emit StaleNaNs for it when it disappears. if !seriesCached && sampleAdded { ce = sl.cache.addRef(met, ref, lset, hash) - if ce != nil && (parsedTimestamp == nil || sl.trackTimestampsStaleness) { + if ce != nil && ce.ref != 0 && (parsedTimestamp == nil || sl.trackTimestampsStaleness) { // Bypass staleness logic if there is an explicit timestamp. // But make sure we only do this if we have a cache entry (ce) for our series. sl.cache.trackStaleness(ref, ce) diff --git a/scrape/scrape_test.go b/scrape/scrape_test.go index 4864426cd4..50e3130847 100644 --- a/scrape/scrape_test.go +++ b/scrape/scrape_test.go @@ -1971,6 +1971,23 @@ test_metric 15 require.Equal(t, 1, total) require.Equal(t, 1, added) require.Equal(t, 0, seriesAdded) + + // Third Scrape: Counter is missing. + // Since it was never successfully appended (anchored on first scrape, failed with OOO on second), + // it should NOT have been tracked for staleness. Thus, no StaleNaN should be appended. + ts3 := ts2.Add(time.Second) + scrapeC := []byte(`# TYPE test_metric counter +# EOF +`) + + app = sl.appender() + _, _, _, err = app.append(scrapeC, "application/openmetrics-text", ts3) + require.NoError(t, err) + require.NoError(t, app.Commit()) + + // Verify that still no samples are appended (specifically no stale marker). + got = appTest.ResultSamples() + require.Empty(t, got, "Expected no samples (specifically no stale markers) because the series was never tracked for staleness") } func requireSampleHist(t *testing.T, s teststorage.Sample, name, expectedHist string, ts, st int64, isNaN bool) {