github.com/muhammadn/cortex@v1.9.1-0.20220510110439-46bb7000d03d/pkg/distributor/query_test.go (about) 1 package distributor 2 3 import ( 4 "testing" 5 "time" 6 7 "github.com/prometheus/prometheus/pkg/labels" 8 "github.com/prometheus/prometheus/pkg/timestamp" 9 "github.com/stretchr/testify/require" 10 11 "github.com/cortexproject/cortex/pkg/cortexpb" 12 ) 13 14 func TestMergeSamplesIntoFirstDuplicates(t *testing.T) { 15 a := []cortexpb.Sample{ 16 {Value: 1.084537996, TimestampMs: 1583946732744}, 17 {Value: 1.086111723, TimestampMs: 1583946750366}, 18 {Value: 1.086111723, TimestampMs: 1583946768623}, 19 {Value: 1.087776094, TimestampMs: 1583946795182}, 20 {Value: 1.089301187, TimestampMs: 1583946810018}, 21 {Value: 1.089301187, TimestampMs: 1583946825064}, 22 {Value: 1.089301187, TimestampMs: 1583946835547}, 23 {Value: 1.090722985, TimestampMs: 1583946846629}, 24 {Value: 1.090722985, TimestampMs: 1583946857608}, 25 {Value: 1.092038719, TimestampMs: 1583946882302}, 26 } 27 28 b := []cortexpb.Sample{ 29 {Value: 1.084537996, TimestampMs: 1583946732744}, 30 {Value: 1.086111723, TimestampMs: 1583946750366}, 31 {Value: 1.086111723, TimestampMs: 1583946768623}, 32 {Value: 1.087776094, TimestampMs: 1583946795182}, 33 {Value: 1.089301187, TimestampMs: 1583946810018}, 34 {Value: 1.089301187, TimestampMs: 1583946825064}, 35 {Value: 1.089301187, TimestampMs: 1583946835547}, 36 {Value: 1.090722985, TimestampMs: 1583946846629}, 37 {Value: 1.090722985, TimestampMs: 1583946857608}, 38 {Value: 1.092038719, TimestampMs: 1583946882302}, 39 } 40 41 a = mergeSamples(a, b) 42 43 // should be the same 44 require.Equal(t, a, b) 45 } 46 47 func TestMergeSamplesIntoFirst(t *testing.T) { 48 a := []cortexpb.Sample{ 49 {Value: 1, TimestampMs: 10}, 50 {Value: 2, TimestampMs: 20}, 51 {Value: 3, TimestampMs: 30}, 52 {Value: 4, TimestampMs: 40}, 53 {Value: 5, TimestampMs: 45}, 54 {Value: 5, TimestampMs: 50}, 55 } 56 57 b := []cortexpb.Sample{ 58 {Value: 1, TimestampMs: 5}, 59 {Value: 2, TimestampMs: 15}, 60 {Value: 3, TimestampMs: 25}, 61 {Value: 3, TimestampMs: 30}, 62 {Value: 4, TimestampMs: 35}, 63 {Value: 5, TimestampMs: 45}, 64 {Value: 6, TimestampMs: 55}, 65 } 66 67 a = mergeSamples(a, b) 68 69 require.Equal(t, []cortexpb.Sample{ 70 {Value: 1, TimestampMs: 5}, 71 {Value: 1, TimestampMs: 10}, 72 {Value: 2, TimestampMs: 15}, 73 {Value: 2, TimestampMs: 20}, 74 {Value: 3, TimestampMs: 25}, 75 {Value: 3, TimestampMs: 30}, 76 {Value: 4, TimestampMs: 35}, 77 {Value: 4, TimestampMs: 40}, 78 {Value: 5, TimestampMs: 45}, 79 {Value: 5, TimestampMs: 50}, 80 {Value: 6, TimestampMs: 55}, 81 }, a) 82 } 83 84 func TestMergeSamplesIntoFirstNilA(t *testing.T) { 85 b := []cortexpb.Sample{ 86 {Value: 1, TimestampMs: 5}, 87 {Value: 2, TimestampMs: 15}, 88 {Value: 3, TimestampMs: 25}, 89 {Value: 4, TimestampMs: 35}, 90 {Value: 5, TimestampMs: 45}, 91 {Value: 6, TimestampMs: 55}, 92 } 93 94 a := mergeSamples(nil, b) 95 96 require.Equal(t, b, a) 97 } 98 99 func TestMergeSamplesIntoFirstNilB(t *testing.T) { 100 a := []cortexpb.Sample{ 101 {Value: 1, TimestampMs: 10}, 102 {Value: 2, TimestampMs: 20}, 103 {Value: 3, TimestampMs: 30}, 104 {Value: 4, TimestampMs: 40}, 105 {Value: 5, TimestampMs: 50}, 106 } 107 108 b := mergeSamples(a, nil) 109 110 require.Equal(t, b, a) 111 } 112 113 func TestMergeExemplarSets(t *testing.T) { 114 now := timestamp.FromTime(time.Now()) 115 exemplar1 := cortexpb.Exemplar{Labels: cortexpb.FromLabelsToLabelAdapters(labels.FromStrings("traceID", "trace-1")), TimestampMs: now, Value: 1} 116 exemplar2 := cortexpb.Exemplar{Labels: cortexpb.FromLabelsToLabelAdapters(labels.FromStrings("traceID", "trace-2")), TimestampMs: now + 1, Value: 2} 117 exemplar3 := cortexpb.Exemplar{Labels: cortexpb.FromLabelsToLabelAdapters(labels.FromStrings("traceID", "trace-3")), TimestampMs: now + 4, Value: 3} 118 exemplar4 := cortexpb.Exemplar{Labels: cortexpb.FromLabelsToLabelAdapters(labels.FromStrings("traceID", "trace-4")), TimestampMs: now + 8, Value: 7} 119 exemplar5 := cortexpb.Exemplar{Labels: cortexpb.FromLabelsToLabelAdapters(labels.FromStrings("traceID", "trace-4")), TimestampMs: now, Value: 7} 120 121 for _, c := range []struct { 122 exemplarsA []cortexpb.Exemplar 123 exemplarsB []cortexpb.Exemplar 124 expected []cortexpb.Exemplar 125 }{ 126 { 127 exemplarsA: []cortexpb.Exemplar{}, 128 exemplarsB: []cortexpb.Exemplar{}, 129 expected: []cortexpb.Exemplar{}, 130 }, 131 { 132 exemplarsA: []cortexpb.Exemplar{exemplar1}, 133 exemplarsB: []cortexpb.Exemplar{}, 134 expected: []cortexpb.Exemplar{exemplar1}, 135 }, 136 { 137 exemplarsA: []cortexpb.Exemplar{}, 138 exemplarsB: []cortexpb.Exemplar{exemplar1}, 139 expected: []cortexpb.Exemplar{exemplar1}, 140 }, 141 { 142 exemplarsA: []cortexpb.Exemplar{exemplar1}, 143 exemplarsB: []cortexpb.Exemplar{exemplar1}, 144 expected: []cortexpb.Exemplar{exemplar1}, 145 }, 146 { 147 exemplarsA: []cortexpb.Exemplar{exemplar1, exemplar2, exemplar3}, 148 exemplarsB: []cortexpb.Exemplar{exemplar1, exemplar3, exemplar4}, 149 expected: []cortexpb.Exemplar{exemplar1, exemplar2, exemplar3, exemplar4}, 150 }, 151 { // Ensure that when there are exemplars with duplicate timestamps, the first one wins. 152 exemplarsA: []cortexpb.Exemplar{exemplar1, exemplar2, exemplar3}, 153 exemplarsB: []cortexpb.Exemplar{exemplar5, exemplar3, exemplar4}, 154 expected: []cortexpb.Exemplar{exemplar1, exemplar2, exemplar3, exemplar4}, 155 }, 156 } { 157 e := mergeExemplarSets(c.exemplarsA, c.exemplarsB) 158 require.Equal(t, c.expected, e) 159 } 160 }