1// This file and its contents are licensed under the Apache License 2.0. 2// Please see the included NOTICE for copyright information and 3// LICENSE for a copy of the license. 4 5package ingestor 6 7import ( 8 "testing" 9 10 "github.com/prometheus/prometheus/pkg/labels" 11 "github.com/stretchr/testify/require" 12 "github.com/timescale/promscale/pkg/pgmodel/cache" 13 "github.com/timescale/promscale/pkg/pgmodel/model" 14) 15 16func getSeries(t *testing.T, scache *cache.SeriesCacheImpl, labels labels.Labels) *model.Series { 17 series, err := scache.GetSeriesFromLabels(labels) 18 require.NoError(t, err) 19 return series 20} 21 22func makeLabelKey(l labels.Label) labelKey { 23 return labelKey{MetricName: "metric", Name: l.Name, Value: l.Value} 24} 25 26func TestLabelArrayCreator(t *testing.T) { 27 scache := cache.NewSeriesCache(cache.DefaultConfig, nil) 28 metricNameLabel := labels.Label{Name: "__name__", Value: "metric"} 29 valOne := labels.Label{Name: "key", Value: "one"} 30 valTwo := labels.Label{Name: "key", Value: "two"} 31 seriesSet := []*model.Series{ 32 getSeries(t, scache, labels.Labels{metricNameLabel, valOne}), 33 } 34 labelMap := map[labelKey]labelInfo{ 35 makeLabelKey(metricNameLabel): {2, 1}, 36 makeLabelKey(valOne): {3, 2}, 37 } 38 39 res, _, err := createLabelArrays(seriesSet, labelMap, 2) 40 require.NoError(t, err) 41 expected := [][]int32{{2, 3}} 42 require.Equal(t, res, expected) 43 44 res, _, err = createLabelArrays(seriesSet, labelMap, 3) 45 require.NoError(t, err) 46 expected = [][]int32{{2, 3}} 47 require.Equal(t, res, expected) 48 49 labelMap[makeLabelKey(valOne)] = labelInfo{3, 3} 50 res, _, err = createLabelArrays(seriesSet, labelMap, 3) 51 require.NoError(t, err) 52 expected = [][]int32{{2, 0, 3}} 53 require.Equal(t, res, expected) 54 55 /* test two series */ 56 seriesSet = []*model.Series{ 57 getSeries(t, scache, labels.Labels{metricNameLabel, valOne}), 58 getSeries(t, scache, labels.Labels{metricNameLabel, valTwo}), 59 } 60 labelMap = map[labelKey]labelInfo{ 61 makeLabelKey(metricNameLabel): {100, 1}, 62 makeLabelKey(valOne): {1, 5}, 63 makeLabelKey(valTwo): {2, 5}, 64 } 65 66 res, ser, err := createLabelArrays(seriesSet, labelMap, 5) 67 require.NoError(t, err) 68 require.Equal(t, len(ser), 2) 69 expected = [][]int32{ 70 {100, 0, 0, 0, 1}, 71 {100, 0, 0, 0, 2}, 72 } 73 require.Equal(t, res, expected) 74 75 /* test one series already set */ 76 setSeries := getSeries(t, scache, labels.Labels{metricNameLabel, valTwo}) 77 setSeries.SetSeriesID(5, 4) 78 seriesSet = []*model.Series{ 79 getSeries(t, scache, labels.Labels{metricNameLabel, valOne}), 80 setSeries, 81 } 82 labelMap = map[labelKey]labelInfo{ 83 makeLabelKey(metricNameLabel): {100, 1}, 84 makeLabelKey(valOne): {1, 5}, 85 makeLabelKey(valTwo): {2, 5}, 86 } 87 res, ser, err = createLabelArrays(seriesSet, labelMap, 5) 88 require.NoError(t, err) 89 require.Equal(t, len(ser), 1) 90 expected = [][]int32{{100, 0, 0, 0, 1}} 91 require.Equal(t, res, expected) 92} 93