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  }