github.com/yankunsam/loki/v2@v2.6.3-0.20220817130409-389df5235c27/pkg/logql/log/labels_test.go (about)

     1  package log
     2  
     3  import (
     4  	"sort"
     5  	"testing"
     6  
     7  	"github.com/prometheus/prometheus/model/labels"
     8  	"github.com/stretchr/testify/require"
     9  
    10  	"github.com/grafana/loki/pkg/logqlmodel"
    11  )
    12  
    13  func TestLabelsBuilder_Get(t *testing.T) {
    14  	lbs := labels.Labels{labels.Label{Name: "already", Value: "in"}}
    15  	b := NewBaseLabelsBuilder().ForLabels(lbs, lbs.Hash())
    16  	b.Reset()
    17  	b.Set("foo", "bar")
    18  	b.Set("bar", "buzz")
    19  	b.Del("foo")
    20  	_, ok := b.Get("foo")
    21  	require.False(t, ok)
    22  	v, ok := b.Get("bar")
    23  	require.True(t, ok)
    24  	require.Equal(t, "buzz", v)
    25  	v, ok = b.Get("already")
    26  	require.True(t, ok)
    27  	require.Equal(t, "in", v)
    28  	b.Del("bar")
    29  	_, ok = b.Get("bar")
    30  	require.False(t, ok)
    31  	b.Del("already")
    32  	_, ok = b.Get("already")
    33  	require.False(t, ok)
    34  }
    35  
    36  func TestLabelsBuilder_LabelsError(t *testing.T) {
    37  	lbs := labels.Labels{labels.Label{Name: "already", Value: "in"}}
    38  	b := NewBaseLabelsBuilder().ForLabels(lbs, lbs.Hash())
    39  	b.Reset()
    40  	b.SetErr("err")
    41  	lbsWithErr := b.LabelsResult().Labels()
    42  	require.Equal(
    43  		t,
    44  		labels.Labels{
    45  			labels.Label{Name: logqlmodel.ErrorLabel, Value: "err"},
    46  			labels.Label{Name: "already", Value: "in"},
    47  		},
    48  		lbsWithErr,
    49  	)
    50  	// make sure the original labels is unchanged.
    51  	require.Equal(t, labels.Labels{labels.Label{Name: "already", Value: "in"}}, lbs)
    52  }
    53  
    54  func TestLabelsBuilder_LabelsResult(t *testing.T) {
    55  	lbs := labels.Labels{
    56  		labels.Label{Name: "namespace", Value: "loki"},
    57  		labels.Label{Name: "job", Value: "us-central1/loki"},
    58  		labels.Label{Name: "cluster", Value: "us-central1"},
    59  	}
    60  	sort.Sort(lbs)
    61  	b := NewBaseLabelsBuilder().ForLabels(lbs, lbs.Hash())
    62  	b.Reset()
    63  	assertLabelResult(t, lbs, b.LabelsResult())
    64  	b.SetErr("err")
    65  	withErr := append(lbs, labels.Label{Name: logqlmodel.ErrorLabel, Value: "err"})
    66  	sort.Sort(withErr)
    67  	assertLabelResult(t, withErr, b.LabelsResult())
    68  
    69  	b.Set("foo", "bar")
    70  	b.Set("namespace", "tempo")
    71  	b.Set("buzz", "fuzz")
    72  	b.Del("job")
    73  	expected := labels.Labels{
    74  		labels.Label{Name: logqlmodel.ErrorLabel, Value: "err"},
    75  		labels.Label{Name: "namespace", Value: "tempo"},
    76  		labels.Label{Name: "cluster", Value: "us-central1"},
    77  		labels.Label{Name: "foo", Value: "bar"},
    78  		labels.Label{Name: "buzz", Value: "fuzz"},
    79  	}
    80  	sort.Sort(expected)
    81  	assertLabelResult(t, expected, b.LabelsResult())
    82  	// cached.
    83  	assertLabelResult(t, expected, b.LabelsResult())
    84  }
    85  
    86  func TestLabelsBuilder_GroupedLabelsResult(t *testing.T) {
    87  	lbs := labels.Labels{
    88  		labels.Label{Name: "namespace", Value: "loki"},
    89  		labels.Label{Name: "job", Value: "us-central1/loki"},
    90  		labels.Label{Name: "cluster", Value: "us-central1"},
    91  	}
    92  	sort.Sort(lbs)
    93  	b := NewBaseLabelsBuilderWithGrouping([]string{"namespace"}, nil, false, false).ForLabels(lbs, lbs.Hash())
    94  	b.Reset()
    95  	assertLabelResult(t, labels.Labels{labels.Label{Name: "namespace", Value: "loki"}}, b.GroupedLabels())
    96  	b.SetErr("err")
    97  	withErr := append(lbs, labels.Label{Name: logqlmodel.ErrorLabel, Value: "err"})
    98  	sort.Sort(withErr)
    99  	assertLabelResult(t, withErr, b.GroupedLabels())
   100  
   101  	b.Reset()
   102  	b.Set("foo", "bar")
   103  	b.Set("namespace", "tempo")
   104  	b.Set("buzz", "fuzz")
   105  	b.Del("job")
   106  	expected := labels.Labels{
   107  		labels.Label{Name: "namespace", Value: "tempo"},
   108  	}
   109  	sort.Sort(expected)
   110  	assertLabelResult(t, expected, b.GroupedLabels())
   111  	// cached.
   112  	assertLabelResult(t, expected, b.GroupedLabels())
   113  
   114  	b = NewBaseLabelsBuilderWithGrouping([]string{"job"}, nil, false, false).ForLabels(lbs, lbs.Hash())
   115  	assertLabelResult(t, labels.Labels{labels.Label{Name: "job", Value: "us-central1/loki"}}, b.GroupedLabels())
   116  	assertLabelResult(t, labels.Labels{labels.Label{Name: "job", Value: "us-central1/loki"}}, b.GroupedLabels())
   117  	b.Del("job")
   118  	assertLabelResult(t, labels.Labels{}, b.GroupedLabels())
   119  	b.Reset()
   120  	b.Set("namespace", "tempo")
   121  	assertLabelResult(t, labels.Labels{labels.Label{Name: "job", Value: "us-central1/loki"}}, b.GroupedLabels())
   122  
   123  	b = NewBaseLabelsBuilderWithGrouping([]string{"job"}, nil, true, false).ForLabels(lbs, lbs.Hash())
   124  	b.Del("job")
   125  	b.Set("foo", "bar")
   126  	b.Set("job", "something")
   127  	expected = labels.Labels{
   128  		labels.Label{Name: "namespace", Value: "loki"},
   129  		labels.Label{Name: "cluster", Value: "us-central1"},
   130  		labels.Label{Name: "foo", Value: "bar"},
   131  	}
   132  	sort.Sort(expected)
   133  	assertLabelResult(t, expected, b.GroupedLabels())
   134  
   135  	b = NewBaseLabelsBuilderWithGrouping(nil, nil, false, false).ForLabels(lbs, lbs.Hash())
   136  	b.Set("foo", "bar")
   137  	b.Set("job", "something")
   138  	expected = labels.Labels{
   139  		labels.Label{Name: "namespace", Value: "loki"},
   140  		labels.Label{Name: "job", Value: "something"},
   141  		labels.Label{Name: "cluster", Value: "us-central1"},
   142  		labels.Label{Name: "foo", Value: "bar"},
   143  	}
   144  	sort.Sort(expected)
   145  	assertLabelResult(t, expected, b.GroupedLabels())
   146  }
   147  
   148  func assertLabelResult(t *testing.T, lbs labels.Labels, res LabelsResult) {
   149  	t.Helper()
   150  	require.Equal(t,
   151  		lbs,
   152  		res.Labels(),
   153  	)
   154  	require.Equal(t,
   155  		lbs.Hash(),
   156  		res.Hash(),
   157  	)
   158  	require.Equal(t,
   159  		lbs.String(),
   160  		res.String(),
   161  	)
   162  }