github.com/yankunsam/loki/v2@v2.6.3-0.20220817130409-389df5235c27/pkg/storage/stores/tsdb/single_file_index_test.go (about)

     1  package tsdb
     2  
     3  import (
     4  	"context"
     5  	"sort"
     6  	"testing"
     7  
     8  	"github.com/go-kit/log"
     9  	"github.com/prometheus/common/model"
    10  	"github.com/prometheus/prometheus/model/labels"
    11  	"github.com/stretchr/testify/require"
    12  
    13  	"github.com/grafana/loki/pkg/storage/stores/tsdb/index"
    14  )
    15  
    16  func TestSingleIdx(t *testing.T) {
    17  	cases := []LoadableSeries{
    18  		{
    19  			Labels: mustParseLabels(`{foo="bar"}`),
    20  			Chunks: []index.ChunkMeta{
    21  				{
    22  					MinTime:  0,
    23  					MaxTime:  3,
    24  					Checksum: 0,
    25  				},
    26  				{
    27  					MinTime:  1,
    28  					MaxTime:  4,
    29  					Checksum: 1,
    30  				},
    31  				{
    32  					MinTime:  2,
    33  					MaxTime:  5,
    34  					Checksum: 2,
    35  				},
    36  			},
    37  		},
    38  		{
    39  			Labels: mustParseLabels(`{foo="bar", bazz="buzz"}`),
    40  			Chunks: []index.ChunkMeta{
    41  				{
    42  					MinTime:  1,
    43  					MaxTime:  10,
    44  					Checksum: 3,
    45  				},
    46  			},
    47  		},
    48  		{
    49  			Labels: mustParseLabels(`{foo="bard", bazz="bozz", bonk="borb"}`),
    50  			Chunks: []index.ChunkMeta{
    51  				{
    52  					MinTime:  1,
    53  					MaxTime:  7,
    54  					Checksum: 4,
    55  				},
    56  			},
    57  		},
    58  	}
    59  
    60  	for _, variant := range []struct {
    61  		desc string
    62  		fn   func() Index
    63  	}{
    64  		{
    65  			desc: "file",
    66  			fn: func() Index {
    67  				return BuildIndex(t, t.TempDir(), "fake", cases)
    68  			},
    69  		},
    70  		{
    71  			desc: "head",
    72  			fn: func() Index {
    73  				head := NewHead("fake", NewMetrics(nil), log.NewNopLogger())
    74  				for _, x := range cases {
    75  					_, _ = head.Append(x.Labels, x.Chunks)
    76  				}
    77  				reader := head.Index()
    78  				return NewTSDBIndex(reader)
    79  			},
    80  		},
    81  	} {
    82  		t.Run(variant.desc, func(t *testing.T) {
    83  			idx := variant.fn()
    84  			t.Run("GetChunkRefs", func(t *testing.T) {
    85  				refs, err := idx.GetChunkRefs(context.Background(), "fake", 1, 5, nil, nil, labels.MustNewMatcher(labels.MatchEqual, "foo", "bar"))
    86  				require.Nil(t, err)
    87  
    88  				expected := []ChunkRef{
    89  					{
    90  						User:        "fake",
    91  						Fingerprint: model.Fingerprint(mustParseLabels(`{foo="bar"}`).Hash()),
    92  						Start:       0,
    93  						End:         3,
    94  						Checksum:    0,
    95  					},
    96  					{
    97  						User:        "fake",
    98  						Fingerprint: model.Fingerprint(mustParseLabels(`{foo="bar"}`).Hash()),
    99  						Start:       1,
   100  						End:         4,
   101  						Checksum:    1,
   102  					},
   103  					{
   104  						User:        "fake",
   105  						Fingerprint: model.Fingerprint(mustParseLabels(`{foo="bar"}`).Hash()),
   106  						Start:       2,
   107  						End:         5,
   108  						Checksum:    2,
   109  					},
   110  					{
   111  						User:        "fake",
   112  						Fingerprint: model.Fingerprint(mustParseLabels(`{foo="bar", bazz="buzz"}`).Hash()),
   113  						Start:       1,
   114  						End:         10,
   115  						Checksum:    3,
   116  					},
   117  				}
   118  				require.Equal(t, expected, refs)
   119  			})
   120  
   121  			t.Run("GetChunkRefsSharded", func(t *testing.T) {
   122  				shard := index.ShardAnnotation{
   123  					Shard: 1,
   124  					Of:    2,
   125  				}
   126  				shardedRefs, err := idx.GetChunkRefs(context.Background(), "fake", 1, 5, nil, &shard, labels.MustNewMatcher(labels.MatchEqual, "foo", "bar"))
   127  
   128  				require.Nil(t, err)
   129  
   130  				require.Equal(t, []ChunkRef{{
   131  					User:        "fake",
   132  					Fingerprint: model.Fingerprint(mustParseLabels(`{foo="bar", bazz="buzz"}`).Hash()),
   133  					Start:       1,
   134  					End:         10,
   135  					Checksum:    3,
   136  				}}, shardedRefs)
   137  
   138  			})
   139  
   140  			t.Run("Series", func(t *testing.T) {
   141  				xs, err := idx.Series(context.Background(), "fake", 8, 9, nil, nil, labels.MustNewMatcher(labels.MatchEqual, "foo", "bar"))
   142  				require.Nil(t, err)
   143  
   144  				expected := []Series{
   145  					{
   146  						Labels:      mustParseLabels(`{foo="bar", bazz="buzz"}`),
   147  						Fingerprint: model.Fingerprint(mustParseLabels(`{foo="bar", bazz="buzz"}`).Hash()),
   148  					},
   149  				}
   150  				require.Equal(t, expected, xs)
   151  			})
   152  
   153  			t.Run("SeriesSharded", func(t *testing.T) {
   154  				shard := index.ShardAnnotation{
   155  					Shard: 0,
   156  					Of:    2,
   157  				}
   158  
   159  				xs, err := idx.Series(context.Background(), "fake", 0, 10, nil, &shard, labels.MustNewMatcher(labels.MatchEqual, "foo", "bar"))
   160  				require.Nil(t, err)
   161  
   162  				expected := []Series{
   163  					{
   164  						Labels:      mustParseLabels(`{foo="bar"}`),
   165  						Fingerprint: model.Fingerprint(mustParseLabels(`{foo="bar"}`).Hash()),
   166  					},
   167  				}
   168  				require.Equal(t, expected, xs)
   169  			})
   170  
   171  			t.Run("LabelNames", func(t *testing.T) {
   172  				// request data at the end of the tsdb range, but it should return all labels present
   173  				ls, err := idx.LabelNames(context.Background(), "fake", 9, 10)
   174  				require.Nil(t, err)
   175  				sort.Strings(ls)
   176  				require.Equal(t, []string{"bazz", "bonk", "foo"}, ls)
   177  			})
   178  
   179  			t.Run("LabelNamesWithMatchers", func(t *testing.T) {
   180  				// request data at the end of the tsdb range, but it should return all labels present
   181  				ls, err := idx.LabelNames(context.Background(), "fake", 9, 10, labels.MustNewMatcher(labels.MatchEqual, "bazz", "buzz"))
   182  				require.Nil(t, err)
   183  				sort.Strings(ls)
   184  				require.Equal(t, []string{"bazz", "foo"}, ls)
   185  			})
   186  
   187  			t.Run("LabelValues", func(t *testing.T) {
   188  				vs, err := idx.LabelValues(context.Background(), "fake", 9, 10, "foo")
   189  				require.Nil(t, err)
   190  				sort.Strings(vs)
   191  				require.Equal(t, []string{"bar", "bard"}, vs)
   192  			})
   193  
   194  			t.Run("LabelValuesWithMatchers", func(t *testing.T) {
   195  				vs, err := idx.LabelValues(context.Background(), "fake", 9, 10, "foo", labels.MustNewMatcher(labels.MatchEqual, "bazz", "buzz"))
   196  				require.Nil(t, err)
   197  				require.Equal(t, []string{"bar"}, vs)
   198  			})
   199  
   200  		})
   201  	}
   202  
   203  }