Skip to content

Commit 342db76

Browse files
committed
Add external labels to the values returned in API
Signed-off-by: Goutham Veeramachaneni <[email protected]>
1 parent ba9c7fd commit 342db76

File tree

3 files changed

+60
-92
lines changed

3 files changed

+60
-92
lines changed

pkg/store/bucket.go

+21-2
Original file line numberDiff line numberDiff line change
@@ -1083,6 +1083,8 @@ func (s *BucketStore) LabelNames(ctx context.Context, req *storepb.LabelNamesReq
10831083
resHints.AddQueriedBlock(b.meta.ULID)
10841084

10851085
indexr := b.indexReader(gctx)
1086+
extLabels := b.meta.Thanos.Labels
1087+
10861088
g.Go(func() error {
10871089
defer runutil.CloseWithLogOnErr(s.logger, indexr, "label names")
10881090

@@ -1092,7 +1094,17 @@ func (s *BucketStore) LabelNames(ctx context.Context, req *storepb.LabelNamesReq
10921094
return errors.Wrap(err, "label names")
10931095
}
10941096

1097+
// Add a set for the external labels as well.
1098+
// We're not adding them directly to res because there could be duplicates.
1099+
extRes := make([]string, 0, len(extLabels))
1100+
for lName := range extLabels {
1101+
extRes = append(extRes, lName)
1102+
}
1103+
10951104
sort.Strings(res)
1105+
sort.Strings(extRes)
1106+
1107+
res = strutil.MergeSlices(res, extRes)
10961108

10971109
mtx.Lock()
10981110
sets = append(sets, res)
@@ -1112,7 +1124,7 @@ func (s *BucketStore) LabelNames(ctx context.Context, req *storepb.LabelNamesReq
11121124
var err error
11131125

11141126
if anyHints, err = types.MarshalAny(resHints); err != nil {
1115-
err = status.Error(codes.Unknown, errors.Wrap(err, "marshal series response hints").Error())
1127+
err = status.Error(codes.Unknown, errors.Wrap(err, "marshal label names response hints").Error())
11161128
return nil, err
11171129
}
11181130

@@ -1141,6 +1153,8 @@ func (s *BucketStore) LabelValues(ctx context.Context, req *storepb.LabelValuesR
11411153
resHints.AddQueriedBlock(b.meta.ULID)
11421154

11431155
indexr := b.indexReader(gctx)
1156+
extLabels := b.meta.Thanos.Labels
1157+
11441158
g.Go(func() error {
11451159
defer runutil.CloseWithLogOnErr(s.logger, indexr, "label values")
11461160

@@ -1150,6 +1164,11 @@ func (s *BucketStore) LabelValues(ctx context.Context, req *storepb.LabelValuesR
11501164
return errors.Wrap(err, "index header label values")
11511165
}
11521166

1167+
// Add the external label value as well.
1168+
if extLabelValue, ok := extLabels[req.Label]; ok {
1169+
res = strutil.MergeSlices(res, []string{extLabelValue})
1170+
}
1171+
11531172
mtx.Lock()
11541173
sets = append(sets, res)
11551174
mtx.Unlock()
@@ -1168,7 +1187,7 @@ func (s *BucketStore) LabelValues(ctx context.Context, req *storepb.LabelValuesR
11681187
var err error
11691188

11701189
if anyHints, err = types.MarshalAny(resHints); err != nil {
1171-
err = status.Error(codes.Unknown, errors.Wrap(err, "marshal series response hints").Error())
1190+
err = status.Error(codes.Unknown, errors.Wrap(err, "marshal label values response hints").Error())
11721191
return nil, err
11731192
}
11741193

pkg/store/bucket_e2e_test.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -629,7 +629,8 @@ func TestBucketStore_LabelNames_e2e(t *testing.T) {
629629
End: timestamp.FromTime(maxTime),
630630
})
631631
testutil.Ok(t, err)
632-
testutil.Equals(t, []string{"a", "b", "c"}, vals.Names)
632+
// ext2 is added by the prepareStoreWithTestBlocks function.
633+
testutil.Equals(t, []string{"a", "b", "c", "ext1", "ext2"}, vals.Names)
633634

634635
// Outside the time range.
635636
vals, err = s.store.LabelNames(ctx, &storepb.LabelNamesRequest{

pkg/store/bucket_test.go

+37-89
Original file line numberDiff line numberDiff line change
@@ -1541,87 +1541,8 @@ func TestBucketSeries_OneBlock_InMemIndexCacheSegfault(t *testing.T) {
15411541
}
15421542

15431543
func TestSeries_RequestAndResponseHints(t *testing.T) {
1544-
tb := testutil.NewTB(t)
1545-
1546-
tmpDir, err := ioutil.TempDir("", "test-series-hints-enabled")
1547-
testutil.Ok(t, err)
1548-
defer func() { testutil.Ok(t, os.RemoveAll(tmpDir)) }()
1549-
1550-
bktDir := filepath.Join(tmpDir, "bkt")
1551-
bkt, err := filesystem.NewBucket(bktDir)
1552-
testutil.Ok(t, err)
1553-
defer func() { testutil.Ok(t, bkt.Close()) }()
1554-
1555-
var (
1556-
logger = log.NewNopLogger()
1557-
instrBkt = objstore.WithNoopInstr(bkt)
1558-
random = rand.New(rand.NewSource(120))
1559-
)
1560-
1561-
extLset := labels.Labels{{Name: "ext1", Value: "1"}}
1562-
// Inject the Thanos meta to each block in the storage.
1563-
thanosMeta := metadata.Thanos{
1564-
Labels: extLset.Map(),
1565-
Downsample: metadata.ThanosDownsample{Resolution: 0},
1566-
Source: metadata.TestSource,
1567-
}
1568-
1569-
// Create TSDB blocks.
1570-
head, seriesSet1 := storetestutil.CreateHeadWithSeries(t, 0, storetestutil.HeadGenOptions{
1571-
TSDBDir: filepath.Join(tmpDir, "0"),
1572-
SamplesPerSeries: 1,
1573-
Series: 2,
1574-
PrependLabels: extLset,
1575-
Random: random,
1576-
})
1577-
block1 := createBlockFromHead(t, bktDir, head)
1578-
testutil.Ok(t, head.Close())
1579-
head2, seriesSet2 := storetestutil.CreateHeadWithSeries(t, 1, storetestutil.HeadGenOptions{
1580-
TSDBDir: filepath.Join(tmpDir, "1"),
1581-
SamplesPerSeries: 1,
1582-
Series: 2,
1583-
PrependLabels: extLset,
1584-
Random: random,
1585-
})
1586-
block2 := createBlockFromHead(t, bktDir, head2)
1587-
testutil.Ok(t, head2.Close())
1588-
1589-
for _, blockID := range []ulid.ULID{block1, block2} {
1590-
_, err := metadata.InjectThanos(logger, filepath.Join(bktDir, blockID.String()), thanosMeta, nil)
1591-
testutil.Ok(t, err)
1592-
}
1593-
1594-
// Instance a real bucket store we'll use to query back the series.
1595-
fetcher, err := block.NewMetaFetcher(logger, 10, instrBkt, tmpDir, nil, nil, nil)
1596-
testutil.Ok(tb, err)
1597-
1598-
indexCache, err := storecache.NewInMemoryIndexCacheWithConfig(logger, nil, storecache.InMemoryIndexCacheConfig{})
1599-
testutil.Ok(tb, err)
1600-
1601-
store, err := NewBucketStore(
1602-
logger,
1603-
nil,
1604-
instrBkt,
1605-
fetcher,
1606-
tmpDir,
1607-
indexCache,
1608-
nil,
1609-
1000000,
1610-
NewChunksLimiterFactory(10000/MaxSamplesPerChunk),
1611-
false,
1612-
10,
1613-
nil,
1614-
false,
1615-
true,
1616-
DefaultPostingOffsetInMemorySampling,
1617-
true,
1618-
false,
1619-
0,
1620-
)
1621-
testutil.Ok(tb, err)
1622-
defer func() { testutil.Ok(t, store.Close()) }()
1623-
1624-
testutil.Ok(tb, store.SyncBlocks(context.Background()))
1544+
tb, store, seriesSet1, seriesSet2, block1, block2, close := setupStoreForHintsTest(t)
1545+
defer close()
16251546

16261547
testCases := []*storetestutil.SeriesCase{
16271548
{
@@ -2051,17 +1972,19 @@ func createBlockWithOneSeriesWithStep(t testutil.TB, dir string, lbls labels.Lab
20511972
return createBlockFromHead(t, dir, h)
20521973
}
20531974

2054-
func TestLabelNamesAndValuesHints(t *testing.T) {
1975+
func setupStoreForHintsTest(t *testing.T) (testutil.TB, *BucketStore, []*storepb.Series, []*storepb.Series, ulid.ULID, ulid.ULID, func()) {
20551976
tb := testutil.NewTB(t)
20561977

2057-
tmpDir, err := ioutil.TempDir("", "test-labels-hints")
1978+
closers := []func(){}
1979+
1980+
tmpDir, err := ioutil.TempDir("", "test-hints")
20581981
testutil.Ok(t, err)
2059-
defer func() { testutil.Ok(t, os.RemoveAll(tmpDir)) }()
1982+
closers = append(closers, func() { testutil.Ok(t, os.RemoveAll(tmpDir)) })
20601983

20611984
bktDir := filepath.Join(tmpDir, "bkt")
20621985
bkt, err := filesystem.NewBucket(bktDir)
20631986
testutil.Ok(t, err)
2064-
defer func() { testutil.Ok(t, bkt.Close()) }()
1987+
closers = append(closers, func() { testutil.Ok(t, bkt.Close()) })
20651988

20661989
var (
20671990
logger = log.NewNopLogger()
@@ -2126,10 +2049,25 @@ func TestLabelNamesAndValuesHints(t *testing.T) {
21262049
true,
21272050
DefaultPostingOffsetInMemorySampling,
21282051
true,
2052+
false,
2053+
0,
21292054
)
21302055
testutil.Ok(tb, err)
21312056
testutil.Ok(tb, store.SyncBlocks(context.Background()))
21322057

2058+
closers = append(closers, func() { testutil.Ok(t, store.Close()) })
2059+
2060+
return tb, store, seriesSet1, seriesSet2, block1, block2, func() {
2061+
for _, close := range closers {
2062+
close()
2063+
}
2064+
}
2065+
}
2066+
2067+
func TestLabelNamesAndValuesHints(t *testing.T) {
2068+
_, store, seriesSet1, seriesSet2, block1, block2, close := setupStoreForHintsTest(t)
2069+
defer close()
2070+
21332071
type labelNamesValuesCase struct {
21342072
name string
21352073

@@ -2158,11 +2096,11 @@ func TestLabelNamesAndValuesHints(t *testing.T) {
21582096
},
21592097

21602098
labelValuesReq: &storepb.LabelValuesRequest{
2161-
Label: "__name__",
2099+
Label: "ext1",
21622100
Start: 0,
21632101
End: 1,
21642102
},
2165-
expectedValues: []string{},
2103+
expectedValues: []string{"1"},
21662104
expectedValuesHints: hintspb.LabelValuesResponseHints{
21672105
QueriedBlocks: []hintspb.Block{
21682106
{Id: block1.String()},
@@ -2187,11 +2125,11 @@ func TestLabelNamesAndValuesHints(t *testing.T) {
21872125
},
21882126

21892127
labelValuesReq: &storepb.LabelValuesRequest{
2190-
Label: "__name__",
2128+
Label: "ext1",
21912129
Start: 0,
21922130
End: 3,
21932131
},
2194-
expectedValues: []string{},
2132+
expectedValues: []string{"1"},
21952133
expectedValuesHints: hintspb.LabelValuesResponseHints{
21962134
QueriedBlocks: []hintspb.Block{
21972135
{Id: block1.String()},
@@ -2206,15 +2144,25 @@ func TestLabelNamesAndValuesHints(t *testing.T) {
22062144
namesResp, err := store.LabelNames(context.Background(), tc.labelNamesReq)
22072145
testutil.Ok(t, err)
22082146
testutil.Equals(t, tc.expectedNames, namesResp.Names)
2147+
22092148
var namesHints hintspb.LabelNamesResponseHints
22102149
testutil.Ok(t, types.UnmarshalAny(namesResp.Hints, &namesHints))
2150+
// The order is not determinate, so we are sorting them.
2151+
sort.Slice(namesHints.QueriedBlocks, func(i, j int) bool {
2152+
return namesHints.QueriedBlocks[i].Id < namesHints.QueriedBlocks[j].Id
2153+
})
22112154
testutil.Equals(t, tc.expectedNamesHints, namesHints)
22122155

22132156
valuesResp, err := store.LabelValues(context.Background(), tc.labelValuesReq)
22142157
testutil.Ok(t, err)
22152158
testutil.Equals(t, tc.expectedValues, valuesResp.Values)
2159+
22162160
var valuesHints hintspb.LabelValuesResponseHints
22172161
testutil.Ok(t, types.UnmarshalAny(valuesResp.Hints, &valuesHints))
2162+
// The order is not determinate, so we are sorting them.
2163+
sort.Slice(valuesHints.QueriedBlocks, func(i, j int) bool {
2164+
return valuesHints.QueriedBlocks[i].Id < valuesHints.QueriedBlocks[j].Id
2165+
})
22182166
testutil.Equals(t, tc.expectedValuesHints, valuesHints)
22192167
})
22202168
}

0 commit comments

Comments
 (0)