|
|
|
|
@ -18,7 +18,6 @@ import ( |
|
|
|
|
"errors" |
|
|
|
|
"fmt" |
|
|
|
|
"math" |
|
|
|
|
"os" |
|
|
|
|
"sort" |
|
|
|
|
"strconv" |
|
|
|
|
"sync" |
|
|
|
|
@ -55,14 +54,7 @@ func TestMain(m *testing.M) { |
|
|
|
|
func TestQueryConcurrency(t *testing.T) { |
|
|
|
|
maxConcurrency := 10 |
|
|
|
|
|
|
|
|
|
dir, err := os.MkdirTemp("", "test_concurrency") |
|
|
|
|
require.NoError(t, err) |
|
|
|
|
defer os.RemoveAll(dir) |
|
|
|
|
queryTracker := promql.NewActiveQueryTracker(dir, maxConcurrency, nil) |
|
|
|
|
t.Cleanup(func() { |
|
|
|
|
require.NoError(t, queryTracker.Close()) |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
queryTracker := promql.NewActiveQueryTracker(t.TempDir(), maxConcurrency, nil) |
|
|
|
|
opts := promql.EngineOpts{ |
|
|
|
|
Logger: nil, |
|
|
|
|
Reg: nil, |
|
|
|
|
@ -72,13 +64,18 @@ func TestQueryConcurrency(t *testing.T) { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
engine := promql.NewEngine(opts) |
|
|
|
|
t.Cleanup(func() { |
|
|
|
|
require.NoError(t, engine.Close()) |
|
|
|
|
}) |
|
|
|
|
ctx, cancelCtx := context.WithCancel(context.Background()) |
|
|
|
|
defer cancelCtx() |
|
|
|
|
t.Cleanup(cancelCtx) |
|
|
|
|
|
|
|
|
|
block := make(chan struct{}) |
|
|
|
|
processing := make(chan struct{}) |
|
|
|
|
done := make(chan int) |
|
|
|
|
defer close(done) |
|
|
|
|
t.Cleanup(func() { |
|
|
|
|
close(done) |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
f := func(context.Context) error { |
|
|
|
|
select { |
|
|
|
|
@ -164,6 +161,9 @@ func TestQueryTimeout(t *testing.T) { |
|
|
|
|
Timeout: 5 * time.Millisecond, |
|
|
|
|
} |
|
|
|
|
engine := promql.NewEngine(opts) |
|
|
|
|
t.Cleanup(func() { |
|
|
|
|
require.NoError(t, engine.Close()) |
|
|
|
|
}) |
|
|
|
|
ctx, cancelCtx := context.WithCancel(context.Background()) |
|
|
|
|
defer cancelCtx() |
|
|
|
|
|
|
|
|
|
@ -263,6 +263,9 @@ func TestQueryError(t *testing.T) { |
|
|
|
|
Timeout: 10 * time.Second, |
|
|
|
|
} |
|
|
|
|
engine := promql.NewEngine(opts) |
|
|
|
|
t.Cleanup(func() { |
|
|
|
|
require.NoError(t, engine.Close()) |
|
|
|
|
}) |
|
|
|
|
errStorage := promql.ErrStorage{errors.New("storage error")} |
|
|
|
|
queryable := storage.QueryableFunc(func(mint, maxt int64) (storage.Querier, error) { |
|
|
|
|
return &errQuerier{err: errStorage}, nil |
|
|
|
|
@ -597,6 +600,9 @@ func TestSelectHintsSetCorrectly(t *testing.T) { |
|
|
|
|
} { |
|
|
|
|
t.Run(tc.query, func(t *testing.T) { |
|
|
|
|
engine := promql.NewEngine(opts) |
|
|
|
|
t.Cleanup(func() { |
|
|
|
|
require.NoError(t, engine.Close()) |
|
|
|
|
}) |
|
|
|
|
hintsRecorder := &noopHintRecordingQueryable{} |
|
|
|
|
|
|
|
|
|
var ( |
|
|
|
|
@ -628,6 +634,9 @@ func TestEngineShutdown(t *testing.T) { |
|
|
|
|
Timeout: 10 * time.Second, |
|
|
|
|
} |
|
|
|
|
engine := promql.NewEngine(opts) |
|
|
|
|
t.Cleanup(func() { |
|
|
|
|
require.NoError(t, engine.Close()) |
|
|
|
|
}) |
|
|
|
|
ctx, cancelCtx := context.WithCancel(context.Background()) |
|
|
|
|
|
|
|
|
|
block := make(chan struct{}) |
|
|
|
|
@ -763,7 +772,7 @@ load 10s |
|
|
|
|
t.Run(fmt.Sprintf("%d query=%s", i, c.Query), func(t *testing.T) { |
|
|
|
|
var err error |
|
|
|
|
var qry promql.Query |
|
|
|
|
engine := newTestEngine() |
|
|
|
|
engine := newTestEngine(t) |
|
|
|
|
if c.Interval == 0 { |
|
|
|
|
qry, err = engine.NewInstantQuery(context.Background(), storage, nil, c.Query, c.Start) |
|
|
|
|
} else { |
|
|
|
|
@ -1305,7 +1314,7 @@ load 10s |
|
|
|
|
for _, c := range cases { |
|
|
|
|
t.Run(c.Query, func(t *testing.T) { |
|
|
|
|
opts := promql.NewPrometheusQueryOpts(true, 0) |
|
|
|
|
engine := promqltest.NewTestEngine(true, 0, promqltest.DefaultMaxSamplesPerQuery) |
|
|
|
|
engine := promqltest.NewTestEngine(t, true, 0, promqltest.DefaultMaxSamplesPerQuery) |
|
|
|
|
|
|
|
|
|
runQuery := func(expErr error) *stats.Statistics { |
|
|
|
|
var err error |
|
|
|
|
@ -1332,7 +1341,7 @@ load 10s |
|
|
|
|
if c.SkipMaxCheck { |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
engine = promqltest.NewTestEngine(true, 0, stats.Samples.PeakSamples-1) |
|
|
|
|
engine = promqltest.NewTestEngine(t, true, 0, stats.Samples.PeakSamples-1) |
|
|
|
|
runQuery(promql.ErrTooManySamples(env)) |
|
|
|
|
}) |
|
|
|
|
} |
|
|
|
|
@ -1485,7 +1494,7 @@ load 10s |
|
|
|
|
|
|
|
|
|
for _, c := range cases { |
|
|
|
|
t.Run(c.Query, func(t *testing.T) { |
|
|
|
|
engine := newTestEngine() |
|
|
|
|
engine := newTestEngine(t) |
|
|
|
|
testFunc := func(expError error) { |
|
|
|
|
var err error |
|
|
|
|
var qry promql.Query |
|
|
|
|
@ -1506,18 +1515,18 @@ load 10s |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Within limit.
|
|
|
|
|
engine = promqltest.NewTestEngine(false, 0, c.MaxSamples) |
|
|
|
|
engine = promqltest.NewTestEngine(t, false, 0, c.MaxSamples) |
|
|
|
|
testFunc(nil) |
|
|
|
|
|
|
|
|
|
// Exceeding limit.
|
|
|
|
|
engine = promqltest.NewTestEngine(false, 0, c.MaxSamples-1) |
|
|
|
|
engine = promqltest.NewTestEngine(t, false, 0, c.MaxSamples-1) |
|
|
|
|
testFunc(promql.ErrTooManySamples(env)) |
|
|
|
|
}) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func TestAtModifier(t *testing.T) { |
|
|
|
|
engine := newTestEngine() |
|
|
|
|
engine := newTestEngine(t) |
|
|
|
|
storage := promqltest.LoadedStorage(t, ` |
|
|
|
|
load 10s |
|
|
|
|
metric{job="1"} 0+1x1000 |
|
|
|
|
@ -1995,7 +2004,7 @@ func TestSubquerySelector(t *testing.T) { |
|
|
|
|
}, |
|
|
|
|
} { |
|
|
|
|
t.Run("", func(t *testing.T) { |
|
|
|
|
engine := newTestEngine() |
|
|
|
|
engine := newTestEngine(t) |
|
|
|
|
storage := promqltest.LoadedStorage(t, tst.loadString) |
|
|
|
|
t.Cleanup(func() { storage.Close() }) |
|
|
|
|
|
|
|
|
|
@ -2016,7 +2025,7 @@ func TestSubquerySelector(t *testing.T) { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func TestTimestampFunction_StepsMoreOftenThanSamples(t *testing.T) { |
|
|
|
|
engine := newTestEngine() |
|
|
|
|
engine := newTestEngine(t) |
|
|
|
|
storage := promqltest.LoadedStorage(t, ` |
|
|
|
|
load 1m |
|
|
|
|
metric 0+1x1000 |
|
|
|
|
@ -2086,6 +2095,9 @@ func TestQueryLogger_basic(t *testing.T) { |
|
|
|
|
Timeout: 10 * time.Second, |
|
|
|
|
} |
|
|
|
|
engine := promql.NewEngine(opts) |
|
|
|
|
t.Cleanup(func() { |
|
|
|
|
require.NoError(t, engine.Close()) |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
queryExec := func() { |
|
|
|
|
ctx, cancelCtx := context.WithCancel(context.Background()) |
|
|
|
|
@ -2137,6 +2149,9 @@ func TestQueryLogger_fields(t *testing.T) { |
|
|
|
|
Timeout: 10 * time.Second, |
|
|
|
|
} |
|
|
|
|
engine := promql.NewEngine(opts) |
|
|
|
|
t.Cleanup(func() { |
|
|
|
|
require.NoError(t, engine.Close()) |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
f1 := NewFakeQueryLogger() |
|
|
|
|
engine.SetQueryLogger(f1) |
|
|
|
|
@ -2166,6 +2181,9 @@ func TestQueryLogger_error(t *testing.T) { |
|
|
|
|
Timeout: 10 * time.Second, |
|
|
|
|
} |
|
|
|
|
engine := promql.NewEngine(opts) |
|
|
|
|
t.Cleanup(func() { |
|
|
|
|
require.NoError(t, engine.Close()) |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
f1 := NewFakeQueryLogger() |
|
|
|
|
engine.SetQueryLogger(f1) |
|
|
|
|
@ -3049,6 +3067,9 @@ func TestEngineOptsValidation(t *testing.T) { |
|
|
|
|
|
|
|
|
|
for _, c := range cases { |
|
|
|
|
eng := promql.NewEngine(c.opts) |
|
|
|
|
t.Cleanup(func() { |
|
|
|
|
require.NoError(t, eng.Close()) |
|
|
|
|
}) |
|
|
|
|
_, err1 := eng.NewInstantQuery(context.Background(), nil, nil, c.query, time.Unix(10, 0)) |
|
|
|
|
_, err2 := eng.NewRangeQuery(context.Background(), nil, nil, c.query, time.Unix(0, 0), time.Unix(10, 0), time.Second) |
|
|
|
|
if c.fail { |
|
|
|
|
@ -3208,7 +3229,7 @@ func TestRangeQuery(t *testing.T) { |
|
|
|
|
} |
|
|
|
|
for _, c := range cases { |
|
|
|
|
t.Run(c.Name, func(t *testing.T) { |
|
|
|
|
engine := newTestEngine() |
|
|
|
|
engine := newTestEngine(t) |
|
|
|
|
storage := promqltest.LoadedStorage(t, c.Load) |
|
|
|
|
t.Cleanup(func() { storage.Close() }) |
|
|
|
|
|
|
|
|
|
@ -3342,7 +3363,7 @@ func TestNativeHistogram_Sum_Count_Add_AvgOperator(t *testing.T) { |
|
|
|
|
seriesName := "sparse_histogram_series" |
|
|
|
|
seriesNameOverTime := "sparse_histogram_series_over_time" |
|
|
|
|
|
|
|
|
|
engine := newTestEngine() |
|
|
|
|
engine := newTestEngine(t) |
|
|
|
|
|
|
|
|
|
ts := idx0 * int64(10*time.Minute/time.Millisecond) |
|
|
|
|
app := storage.Appender(context.Background()) |
|
|
|
|
@ -3612,7 +3633,7 @@ func TestNativeHistogram_SubOperator(t *testing.T) { |
|
|
|
|
for _, c := range cases { |
|
|
|
|
for _, floatHisto := range []bool{true, false} { |
|
|
|
|
t.Run(fmt.Sprintf("floatHistogram=%t %d", floatHisto, idx0), func(t *testing.T) { |
|
|
|
|
engine := newTestEngine() |
|
|
|
|
engine := newTestEngine(t) |
|
|
|
|
storage := teststorage.New(t) |
|
|
|
|
t.Cleanup(func() { storage.Close() }) |
|
|
|
|
|
|
|
|
|
@ -3773,7 +3794,7 @@ func TestNativeHistogram_MulDivOperator(t *testing.T) { |
|
|
|
|
seriesName := "sparse_histogram_series" |
|
|
|
|
floatSeriesName := "float_series" |
|
|
|
|
|
|
|
|
|
engine := newTestEngine() |
|
|
|
|
engine := newTestEngine(t) |
|
|
|
|
|
|
|
|
|
ts := idx0 * int64(10*time.Minute/time.Millisecond) |
|
|
|
|
app := storage.Appender(context.Background()) |
|
|
|
|
@ -3896,7 +3917,7 @@ metric 0 1 2 |
|
|
|
|
for _, c := range cases { |
|
|
|
|
c := c |
|
|
|
|
t.Run(c.name, func(t *testing.T) { |
|
|
|
|
engine := promqltest.NewTestEngine(false, c.engineLookback, promqltest.DefaultMaxSamplesPerQuery) |
|
|
|
|
engine := promqltest.NewTestEngine(t, false, c.engineLookback, promqltest.DefaultMaxSamplesPerQuery) |
|
|
|
|
storage := promqltest.LoadedStorage(t, load) |
|
|
|
|
t.Cleanup(func() { storage.Close() }) |
|
|
|
|
|
|
|
|
|
|