Skip to content

Commit b236112

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

File tree

2 files changed

+31
-83
lines changed

2 files changed

+31
-83
lines changed

pkg/store/bucket.go

+16
Original file line numberDiff line numberDiff line change
@@ -1081,7 +1081,18 @@ func (s *BucketStore) LabelNames(ctx context.Context, req *storepb.LabelNamesReq
10811081

10821082
// Do it via index reader to have pending reader registered correctly.
10831083
res := indexr.block.indexHeaderReader.LabelNames()
1084+
1085+
// Add a set for the external labels as well.
1086+
// We're not adding them directly to res because there could be duplicates.
1087+
extRes := make([]string, 0, len(b.meta.Thanos.Labels))
1088+
for lName := range b.meta.Thanos.Labels {
1089+
extRes = append(extRes, lName)
1090+
}
1091+
10841092
sort.Strings(res)
1093+
sort.Strings(extRes)
1094+
1095+
res = strutil.MergeSlices(res, extRes)
10851096

10861097
mtx.Lock()
10871098
sets = append(sets, res)
@@ -1139,6 +1150,11 @@ func (s *BucketStore) LabelValues(ctx context.Context, req *storepb.LabelValuesR
11391150
return errors.Wrap(err, "index header label values")
11401151
}
11411152

1153+
// Add the external label value as well.
1154+
if extLabelValue, ok := b.meta.Thanos.Labels[req.Label]; ok {
1155+
res = strutil.MergeSlices(res, []string{extLabelValue})
1156+
}
1157+
11421158
mtx.Lock()
11431159
sets = append(sets, res)
11441160
mtx.Unlock()

pkg/store/bucket_test.go

+15-83
Original file line numberDiff line numberDiff line change
@@ -1532,83 +1532,7 @@ func TestBucketSeries_OneBlock_InMemIndexCacheSegfault(t *testing.T) {
15321532
}
15331533

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

16131537
testCases := []*storetestutil.SeriesCase{
16141538
{
@@ -1898,10 +1822,10 @@ func createBlockWithOneSeriesWithStep(t testutil.TB, dir string, lbls labels.Lab
18981822
return createBlockFromHead(t, dir, h)
18991823
}
19001824

1901-
func TestLabelNamesAndValuesHints(t *testing.T) {
1825+
func setupStoreForHintsTest(t *testing.T) (testutil.TB, *BucketStore, []*storepb.Series, []*storepb.Series, ulid.ULID, ulid.ULID) {
19021826
tb := testutil.NewTB(t)
19031827

1904-
tmpDir, err := ioutil.TempDir("", "test-labels-hints")
1828+
tmpDir, err := ioutil.TempDir("", "test-hints")
19051829
testutil.Ok(t, err)
19061830
defer func() { testutil.Ok(t, os.RemoveAll(tmpDir)) }()
19071831

@@ -1977,6 +1901,12 @@ func TestLabelNamesAndValuesHints(t *testing.T) {
19771901
testutil.Ok(tb, err)
19781902
testutil.Ok(tb, store.SyncBlocks(context.Background()))
19791903

1904+
return tb, store, seriesSet1, seriesSet2, block1, block2
1905+
}
1906+
1907+
func TestLabelNamesAndValuesHints(t *testing.T) {
1908+
_, store, seriesSet1, seriesSet2, block1, block2 := setupStoreForHintsTest(t)
1909+
19801910
type labelNamesValuesCase struct {
19811911
name string
19821912

@@ -2005,11 +1935,11 @@ func TestLabelNamesAndValuesHints(t *testing.T) {
20051935
},
20061936

20071937
labelValuesReq: &storepb.LabelValuesRequest{
2008-
Label: "__name__",
1938+
Label: "ext1",
20091939
Start: 0,
20101940
End: 1,
20111941
},
2012-
expectedValues: []string{},
1942+
expectedValues: []string{"1"},
20131943
expectedValuesHints: hintspb.LabelValuesResponseHints{
20141944
QueriedBlocks: []hintspb.Block{
20151945
{Id: block1.String()},
@@ -2034,11 +1964,11 @@ func TestLabelNamesAndValuesHints(t *testing.T) {
20341964
},
20351965

20361966
labelValuesReq: &storepb.LabelValuesRequest{
2037-
Label: "__name__",
1967+
Label: "ext1",
20381968
Start: 0,
20391969
End: 3,
20401970
},
2041-
expectedValues: []string{},
1971+
expectedValues: []string{"1"},
20421972
expectedValuesHints: hintspb.LabelValuesResponseHints{
20431973
QueriedBlocks: []hintspb.Block{
20441974
{Id: block1.String()},
@@ -2053,13 +1983,15 @@ func TestLabelNamesAndValuesHints(t *testing.T) {
20531983
namesResp, err := store.LabelNames(context.Background(), tc.labelNamesReq)
20541984
testutil.Ok(t, err)
20551985
testutil.Equals(t, tc.expectedNames, namesResp.Names)
1986+
20561987
var namesHints hintspb.LabelNamesResponseHints
20571988
testutil.Ok(t, types.UnmarshalAny(namesResp.Hints, &namesHints))
20581989
testutil.Equals(t, tc.expectedNamesHints, namesHints)
20591990

20601991
valuesResp, err := store.LabelValues(context.Background(), tc.labelValuesReq)
20611992
testutil.Ok(t, err)
20621993
testutil.Equals(t, tc.expectedValues, valuesResp.Values)
1994+
20631995
var valuesHints hintspb.LabelValuesResponseHints
20641996
testutil.Ok(t, types.UnmarshalAny(valuesResp.Hints, &valuesHints))
20651997
testutil.Equals(t, tc.expectedValuesHints, valuesHints)

0 commit comments

Comments
 (0)