github.com/muhammadn/cortex@v1.9.1-0.20220510110439-46bb7000d03d/pkg/querier/batch/batch_test.go (about) 1 package batch 2 3 import ( 4 "fmt" 5 "testing" 6 "time" 7 8 "github.com/prometheus/common/model" 9 "github.com/stretchr/testify/require" 10 11 "github.com/cortexproject/cortex/pkg/chunk" 12 promchunk "github.com/cortexproject/cortex/pkg/chunk/encoding" 13 ) 14 15 func BenchmarkNewChunkMergeIterator_CreateAndIterate(b *testing.B) { 16 scenarios := []struct { 17 numChunks int 18 numSamplesPerChunk int 19 duplicationFactor int 20 enc promchunk.Encoding 21 }{ 22 {numChunks: 1000, numSamplesPerChunk: 100, duplicationFactor: 1, enc: promchunk.Bigchunk}, 23 {numChunks: 1000, numSamplesPerChunk: 100, duplicationFactor: 3, enc: promchunk.Bigchunk}, 24 {numChunks: 1000, numSamplesPerChunk: 100, duplicationFactor: 1, enc: promchunk.Varbit}, 25 {numChunks: 1000, numSamplesPerChunk: 100, duplicationFactor: 3, enc: promchunk.Varbit}, 26 {numChunks: 1000, numSamplesPerChunk: 100, duplicationFactor: 1, enc: promchunk.DoubleDelta}, 27 {numChunks: 1000, numSamplesPerChunk: 100, duplicationFactor: 3, enc: promchunk.DoubleDelta}, 28 {numChunks: 1000, numSamplesPerChunk: 100, duplicationFactor: 1, enc: promchunk.PrometheusXorChunk}, 29 {numChunks: 1000, numSamplesPerChunk: 100, duplicationFactor: 3, enc: promchunk.PrometheusXorChunk}, 30 {numChunks: 100, numSamplesPerChunk: 100, duplicationFactor: 1, enc: promchunk.PrometheusXorChunk}, 31 {numChunks: 100, numSamplesPerChunk: 100, duplicationFactor: 3, enc: promchunk.PrometheusXorChunk}, 32 {numChunks: 1, numSamplesPerChunk: 100, duplicationFactor: 1, enc: promchunk.PrometheusXorChunk}, 33 {numChunks: 1, numSamplesPerChunk: 100, duplicationFactor: 3, enc: promchunk.PrometheusXorChunk}, 34 } 35 36 for _, scenario := range scenarios { 37 name := fmt.Sprintf("chunks: %d samples per chunk: %d duplication factor: %d encoding: %s", 38 scenario.numChunks, 39 scenario.numSamplesPerChunk, 40 scenario.duplicationFactor, 41 scenario.enc.String()) 42 43 chunks := createChunks(b, scenario.numChunks, scenario.numSamplesPerChunk, scenario.duplicationFactor, scenario.enc) 44 45 b.Run(name, func(b *testing.B) { 46 b.ReportAllocs() 47 48 for n := 0; n < b.N; n++ { 49 it := NewChunkMergeIterator(chunks, 0, 0) 50 for it.Next() { 51 it.At() 52 } 53 54 // Ensure no error occurred. 55 if it.Err() != nil { 56 b.Fatal(it.Err().Error()) 57 } 58 } 59 }) 60 } 61 } 62 63 func TestSeekCorrectlyDealWithSinglePointChunks(t *testing.T) { 64 chunkOne := mkChunk(t, model.Time(1*step/time.Millisecond), 1, promchunk.PrometheusXorChunk) 65 chunkTwo := mkChunk(t, model.Time(10*step/time.Millisecond), 1, promchunk.PrometheusXorChunk) 66 chunks := []chunk.Chunk{chunkOne, chunkTwo} 67 68 sut := NewChunkMergeIterator(chunks, 0, 0) 69 70 // Following calls mimics Prometheus's query engine behaviour for VectorSelector. 71 require.True(t, sut.Next()) 72 require.True(t, sut.Seek(0)) 73 74 actual, val := sut.At() 75 require.Equal(t, float64(1*time.Second/time.Millisecond), val) // since mkChunk use ts as value. 76 require.Equal(t, int64(1*time.Second/time.Millisecond), actual) 77 } 78 79 func createChunks(b *testing.B, numChunks, numSamplesPerChunk, duplicationFactor int, enc promchunk.Encoding) []chunk.Chunk { 80 result := make([]chunk.Chunk, 0, numChunks) 81 82 for d := 0; d < duplicationFactor; d++ { 83 for c := 0; c < numChunks; c++ { 84 minTime := step * time.Duration(c*numSamplesPerChunk) 85 result = append(result, mkChunk(b, model.Time(minTime.Milliseconds()), numSamplesPerChunk, enc)) 86 } 87 } 88 89 return result 90 }