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 }