scrape tests: check NaN values directly

Normally, a NaN value is never equal to any other value. Compare sample
values via `Float64bits` so that NaN values which are exactly the same
will compare equal.

Signed-off-by: Bryan Boreham <bjboreham@gmail.com>
This commit is contained in:
Bryan Boreham 2024-01-24 11:53:36 +00:00
parent 5a6c8f9c15
commit d0dee51aac
2 changed files with 12 additions and 21 deletions

View file

@ -18,6 +18,7 @@ import (
"context" "context"
"encoding/binary" "encoding/binary"
"fmt" "fmt"
"math"
"math/rand" "math/rand"
"strings" "strings"
"sync" "sync"
@ -71,6 +72,11 @@ type floatSample struct {
f float64 f float64
} }
func equalFloatSamples(a, b floatSample) bool {
// Compare Float64bits so NaN values which are exactly the same will compare equal.
return labels.Equal(a.metric, b.metric) && a.t == b.t && math.Float64bits(a.f) == math.Float64bits(b.f)
}
type histogramSample struct { type histogramSample struct {
t int64 t int64
h *histogram.Histogram h *histogram.Histogram

View file

@ -1342,7 +1342,7 @@ func TestScrapeLoopAppend(t *testing.T) {
scrapeLabels: `metric NaN`, scrapeLabels: `metric NaN`,
discoveryLabels: nil, discoveryLabels: nil,
expLset: labels.FromStrings("__name__", "metric"), expLset: labels.FromStrings("__name__", "metric"),
expValue: float64(value.NormalNaN), expValue: math.Float64frombits(value.NormalNaN),
}, },
} }
@ -1376,13 +1376,6 @@ func TestScrapeLoopAppend(t *testing.T) {
}, },
} }
// When the expected value is NaN
// DeepEqual will report NaNs as being different,
// so replace it with the expected one.
if test.expValue == float64(value.NormalNaN) {
app.resultFloats[0].f = expected[0].f
}
t.Logf("Test:%s", test.title) t.Logf("Test:%s", test.title)
requireEqual(t, expected, app.resultFloats) requireEqual(t, expected, app.resultFloats)
} }
@ -1390,7 +1383,7 @@ func TestScrapeLoopAppend(t *testing.T) {
func requireEqual(t *testing.T, expected, actual interface{}, msgAndArgs ...interface{}) { func requireEqual(t *testing.T, expected, actual interface{}, msgAndArgs ...interface{}) {
testutil.RequireEqualWithOptions(t, expected, actual, testutil.RequireEqualWithOptions(t, expected, actual,
[]cmp.Option{cmp.AllowUnexported(floatSample{}), cmp.AllowUnexported(histogramSample{})}, []cmp.Option{cmp.Comparer(equalFloatSamples), cmp.AllowUnexported(histogramSample{})},
msgAndArgs...) msgAndArgs...)
} }
@ -1691,7 +1684,6 @@ func TestScrapeLoop_ChangingMetricString(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
require.NoError(t, slApp.Commit()) require.NoError(t, slApp.Commit())
// DeepEqual will report NaNs as being different, so replace with a different value.
want := []floatSample{ want := []floatSample{
{ {
metric: labels.FromStrings("__name__", "metric_a", "a", "1", "b", "1"), metric: labels.FromStrings("__name__", "metric_a", "a", "1", "b", "1"),
@ -1723,11 +1715,6 @@ func TestScrapeLoopAppendStaleness(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
require.NoError(t, slApp.Commit()) require.NoError(t, slApp.Commit())
ingestedNaN := math.Float64bits(app.resultFloats[1].f)
require.Equal(t, value.StaleNaN, ingestedNaN, "Appended stale sample wasn't as expected")
// DeepEqual will report NaNs as being different, so replace with a different value.
app.resultFloats[1].f = 42
want := []floatSample{ want := []floatSample{
{ {
metric: labels.FromStrings(model.MetricNameLabel, "metric_a"), metric: labels.FromStrings(model.MetricNameLabel, "metric_a"),
@ -1737,10 +1724,10 @@ func TestScrapeLoopAppendStaleness(t *testing.T) {
{ {
metric: labels.FromStrings(model.MetricNameLabel, "metric_a"), metric: labels.FromStrings(model.MetricNameLabel, "metric_a"),
t: timestamp.FromTime(now.Add(time.Second)), t: timestamp.FromTime(now.Add(time.Second)),
f: 42, f: math.Float64frombits(value.StaleNaN),
}, },
} }
require.Equal(t, want, app.resultFloats, "Appended samples not as expected:\n%s", appender) requireEqual(t, want, app.resultFloats, "Appended samples not as expected:\n%s", appender)
} }
func TestScrapeLoopAppendNoStalenessIfTimestamp(t *testing.T) { func TestScrapeLoopAppendNoStalenessIfTimestamp(t *testing.T) {
@ -1783,8 +1770,6 @@ func TestScrapeLoopAppendStalenessIfTrackTimestampStaleness(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
require.NoError(t, slApp.Commit()) require.NoError(t, slApp.Commit())
// DeepEqual will report NaNs as being different, so replace with a different value.
app.resultFloats[1].f = 42
want := []floatSample{ want := []floatSample{
{ {
metric: labels.FromStrings(model.MetricNameLabel, "metric_a"), metric: labels.FromStrings(model.MetricNameLabel, "metric_a"),
@ -1794,10 +1779,10 @@ func TestScrapeLoopAppendStalenessIfTrackTimestampStaleness(t *testing.T) {
{ {
metric: labels.FromStrings(model.MetricNameLabel, "metric_a"), metric: labels.FromStrings(model.MetricNameLabel, "metric_a"),
t: timestamp.FromTime(now.Add(time.Second)), t: timestamp.FromTime(now.Add(time.Second)),
f: 42, f: math.Float64frombits(value.StaleNaN),
}, },
} }
require.Equal(t, want, app.resultFloats, "Appended samples not as expected:\n%s", appender) requireEqual(t, want, app.resultFloats, "Appended samples not as expected:\n%s", appender)
} }
func TestScrapeLoopAppendExemplar(t *testing.T) { func TestScrapeLoopAppendExemplar(t *testing.T) {