@@ -2365,6 +2365,42 @@ func TestIngester_Push_DecreaseInactiveSeries(t *testing.T) {
2365
2365
assert .NoError (t , testutil .GatherAndCompare (registry , strings .NewReader (expectedMetrics ), metricNames ... ))
2366
2366
}
2367
2367
2368
+ func TestIngester_Push_OutOfOrderLabels (t * testing.T ) {
2369
+ // Create ingester
2370
+ cfg := defaultIngesterTestConfig (t )
2371
+ r := prometheus .NewRegistry ()
2372
+ i , err := prepareIngesterWithBlocksStorage (t , cfg , r )
2373
+ require .NoError (t , err )
2374
+ require .NoError (t , services .StartAndAwaitRunning (context .Background (), i ))
2375
+ defer services .StopAndAwaitTerminated (context .Background (), i ) //nolint:errcheck
2376
+
2377
+ // Wait until it's ACTIVE
2378
+ test .Poll (t , time .Second , ring .ACTIVE , func () interface {} {
2379
+ return i .lifecycler .GetState ()
2380
+ })
2381
+
2382
+ ctx := user .InjectOrgID (context .Background (), "test-user" )
2383
+
2384
+ outOfOrderLabels := labels.Labels {
2385
+ {Name : labels .MetricName , Value : "test_metric" },
2386
+ {Name : "c" , Value : "3" },
2387
+ {Name : "a" , Value : "1" }, // Out of order (a comes before c)
2388
+ }
2389
+
2390
+ req , _ := mockWriteRequest (t , outOfOrderLabels , 1 , 2 )
2391
+ _ , err = i .Push (ctx , req )
2392
+ require .Error (t , err )
2393
+ require .Contains (t , err .Error (), "out-of-order label set found" )
2394
+
2395
+ metric := `
2396
+ # HELP cortex_ingester_out_of_order_labels_total The total number of out of order label found per user.
2397
+ # TYPE cortex_ingester_out_of_order_labels_total counter
2398
+ cortex_ingester_out_of_order_labels_total{user="test-user"} 1
2399
+ `
2400
+ err = testutil .GatherAndCompare (r , bytes .NewBufferString (metric ), "cortex_ingester_out_of_order_labels_total" )
2401
+ require .NoError (t , err )
2402
+ }
2403
+
2368
2404
func BenchmarkIngesterPush (b * testing.B ) {
2369
2405
limits := defaultLimitsTestConfig ()
2370
2406
benchmarkIngesterPush (b , limits , false )
@@ -2730,8 +2766,8 @@ func Test_Ingester_LabelNames(t *testing.T) {
2730
2766
value float64
2731
2767
timestamp int64
2732
2768
}{
2733
- {labels.Labels {{Name : labels .MetricName , Value : "test_1" }, {Name : "status " , Value : "200 " }, {Name : "route " , Value : "get_user " }}, 1 , 100000 },
2734
- {labels.Labels {{Name : labels .MetricName , Value : "test_1" }, {Name : "status " , Value : "500 " }, {Name : "route " , Value : "get_user " }}, 1 , 110000 },
2769
+ {labels.Labels {{Name : labels .MetricName , Value : "test_1" }, {Name : "route " , Value : "get_user " }, {Name : "status " , Value : "200 " }}, 1 , 100000 },
2770
+ {labels.Labels {{Name : labels .MetricName , Value : "test_1" }, {Name : "route " , Value : "get_user " }, {Name : "status " , Value : "500 " }}, 1 , 110000 },
2735
2771
{labels.Labels {{Name : labels .MetricName , Value : "test_2" }}, 2 , 200000 },
2736
2772
}
2737
2773
@@ -2786,8 +2822,8 @@ func Test_Ingester_LabelValues(t *testing.T) {
2786
2822
value float64
2787
2823
timestamp int64
2788
2824
}{
2789
- {labels.Labels {{Name : labels .MetricName , Value : "test_1" }, {Name : "status " , Value : "200 " }, {Name : "route " , Value : "get_user " }}, 1 , 100000 },
2790
- {labels.Labels {{Name : labels .MetricName , Value : "test_1" }, {Name : "status " , Value : "500 " }, {Name : "route " , Value : "get_user " }}, 1 , 110000 },
2825
+ {labels.Labels {{Name : labels .MetricName , Value : "test_1" }, {Name : "route " , Value : "get_user " }, {Name : "status " , Value : "200 " }}, 1 , 100000 },
2826
+ {labels.Labels {{Name : labels .MetricName , Value : "test_1" }, {Name : "route " , Value : "get_user " }, {Name : "status " , Value : "500 " }}, 1 , 110000 },
2791
2827
{labels.Labels {{Name : labels .MetricName , Value : "test_2" }}, 2 , 200000 },
2792
2828
}
2793
2829
@@ -2864,7 +2900,7 @@ func Test_Ingester_LabelValue_MaxInflightQueryRequest(t *testing.T) {
2864
2900
// Mock request
2865
2901
ctx := user .InjectOrgID (context .Background (), "test" )
2866
2902
2867
- wreq , _ := mockWriteRequest (t , labels.Labels {{Name : labels .MetricName , Value : "test_1" }, {Name : "status " , Value : "200 " }, {Name : "route " , Value : "get_user " }}, 1 , 100000 )
2903
+ wreq , _ := mockWriteRequest (t , labels.Labels {{Name : labels .MetricName , Value : "test_1" }, {Name : "route " , Value : "get_user " }, {Name : "status " , Value : "200 " }}, 1 , 100000 )
2868
2904
_ , err = i .Push (ctx , wreq )
2869
2905
require .NoError (t , err )
2870
2906
@@ -3023,7 +3059,7 @@ func Test_Ingester_Query_MaxInflightQueryRequest(t *testing.T) {
3023
3059
// Mock request
3024
3060
ctx := user .InjectOrgID (context .Background (), "test" )
3025
3061
3026
- wreq , _ := mockWriteRequest (t , labels.Labels {{Name : labels .MetricName , Value : "test_1" }, {Name : "status " , Value : "200 " }, {Name : "route " , Value : "get_user " }}, 1 , 100000 )
3062
+ wreq , _ := mockWriteRequest (t , labels.Labels {{Name : labels .MetricName , Value : "test_1" }, {Name : "route " , Value : "get_user " }, {Name : "status " , Value : "200 " }}, 1 , 100000 )
3027
3063
_ , err = i .Push (ctx , wreq )
3028
3064
require .NoError (t , err )
3029
3065
@@ -4904,8 +4940,8 @@ func Test_Ingester_UserStats(t *testing.T) {
4904
4940
value float64
4905
4941
timestamp int64
4906
4942
}{
4907
- {labels.Labels {{Name : labels .MetricName , Value : "test_1" }, {Name : "status " , Value : "200 " }, {Name : "route " , Value : "get_user " }}, 1 , 100000 },
4908
- {labels.Labels {{Name : labels .MetricName , Value : "test_1" }, {Name : "status " , Value : "500 " }, {Name : "route " , Value : "get_user " }}, 1 , 110000 },
4943
+ {labels.Labels {{Name : labels .MetricName , Value : "test_1" }, {Name : "route " , Value : "get_user " }, {Name : "status " , Value : "200 " }}, 1 , 100000 },
4944
+ {labels.Labels {{Name : labels .MetricName , Value : "test_1" }, {Name : "route " , Value : "get_user " }, {Name : "status " , Value : "500 " }}, 1 , 110000 },
4909
4945
{labels.Labels {{Name : labels .MetricName , Value : "test_2" }}, 2 , 200000 },
4910
4946
}
4911
4947
@@ -4950,8 +4986,8 @@ func Test_Ingester_AllUserStats(t *testing.T) {
4950
4986
value float64
4951
4987
timestamp int64
4952
4988
}{
4953
- {"user-1" , labels.Labels {{Name : labels .MetricName , Value : "test_1_1" }, {Name : "status " , Value : "200 " }, {Name : "route " , Value : "get_user " }}, 1 , 100000 },
4954
- {"user-1" , labels.Labels {{Name : labels .MetricName , Value : "test_1_1" }, {Name : "status " , Value : "500 " }, {Name : "route " , Value : "get_user " }}, 1 , 110000 },
4989
+ {"user-1" , labels.Labels {{Name : labels .MetricName , Value : "test_1_1" }, {Name : "route " , Value : "get_user " }, {Name : "status " , Value : "200 " }}, 1 , 100000 },
4990
+ {"user-1" , labels.Labels {{Name : labels .MetricName , Value : "test_1_1" }, {Name : "route " , Value : "get_user " }, {Name : "status " , Value : "500 " }}, 1 , 110000 },
4955
4991
{"user-1" , labels.Labels {{Name : labels .MetricName , Value : "test_1_2" }}, 2 , 200000 },
4956
4992
{"user-2" , labels.Labels {{Name : labels .MetricName , Value : "test_2_1" }}, 2 , 200000 },
4957
4993
{"user-2" , labels.Labels {{Name : labels .MetricName , Value : "test_2_2" }}, 2 , 200000 },
@@ -5018,8 +5054,8 @@ func Test_Ingester_AllUserStatsHandler(t *testing.T) {
5018
5054
value float64
5019
5055
timestamp int64
5020
5056
}{
5021
- {"user-1" , labels.Labels {{Name : labels .MetricName , Value : "test_1_1" }, {Name : "status " , Value : "200 " }, {Name : "route " , Value : "get_user " }}, 1 , 100000 },
5022
- {"user-1" , labels.Labels {{Name : labels .MetricName , Value : "test_1_1" }, {Name : "status " , Value : "500 " }, {Name : "route " , Value : "get_user " }}, 1 , 110000 },
5057
+ {"user-1" , labels.Labels {{Name : labels .MetricName , Value : "test_1_1" }, {Name : "route " , Value : "get_user " }, {Name : "status " , Value : "200 " }}, 1 , 100000 },
5058
+ {"user-1" , labels.Labels {{Name : labels .MetricName , Value : "test_1_1" }, {Name : "route " , Value : "get_user " }, {Name : "status " , Value : "500 " }}, 1 , 110000 },
5023
5059
{"user-1" , labels.Labels {{Name : labels .MetricName , Value : "test_1_2" }}, 2 , 200000 },
5024
5060
{"user-2" , labels.Labels {{Name : labels .MetricName , Value : "test_2_1" }}, 2 , 200000 },
5025
5061
{"user-2" , labels.Labels {{Name : labels .MetricName , Value : "test_2_2" }}, 2 , 200000 },
@@ -6476,7 +6512,7 @@ func Test_Ingester_QueryExemplar_MaxInflightQueryRequest(t *testing.T) {
6476
6512
// Mock request
6477
6513
ctx := user .InjectOrgID (context .Background (), "test" )
6478
6514
6479
- wreq , _ := mockWriteRequest (t , labels.Labels {{Name : labels .MetricName , Value : "test_1" }, {Name : "status " , Value : "200 " }, {Name : "route " , Value : "get_user " }}, 1 , 100000 )
6515
+ wreq , _ := mockWriteRequest (t , labels.Labels {{Name : labels .MetricName , Value : "test_1" }, {Name : "route " , Value : "get_user " }, {Name : "status " , Value : "200 " }}, 1 , 100000 )
6480
6516
_ , err = i .Push (ctx , wreq )
6481
6517
require .NoError (t , err )
6482
6518
0 commit comments