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  }