@@ -56,6 +56,7 @@ func TestDistributor_Push(t *testing.T) {
56
56
happyIngesters int
57
57
samples int
58
58
startTimestampMs int64
59
+ metadata int
59
60
expectedResponse * client.WriteResponse
60
61
expectedError error
61
62
expectedMetrics string
@@ -68,7 +69,8 @@ func TestDistributor_Push(t *testing.T) {
68
69
"A push to 3 happy ingesters should succeed" : {
69
70
numIngesters : 3 ,
70
71
happyIngesters : 3 ,
71
- samples : 10 ,
72
+ samples : 5 ,
73
+ metadata : 5 ,
72
74
expectedResponse : success ,
73
75
startTimestampMs : 123456789000 ,
74
76
expectedMetrics : `
@@ -80,7 +82,7 @@ func TestDistributor_Push(t *testing.T) {
80
82
"A push to 2 happy ingesters should succeed" : {
81
83
numIngesters : 3 ,
82
84
happyIngesters : 2 ,
83
- samples : 10 ,
85
+ samples : 5 ,
84
86
expectedResponse : success ,
85
87
startTimestampMs : 123456789000 ,
86
88
expectedMetrics : `
@@ -116,8 +118,9 @@ func TestDistributor_Push(t *testing.T) {
116
118
"A push exceeding burst size should fail" : {
117
119
numIngesters : 3 ,
118
120
happyIngesters : 3 ,
119
- samples : 30 ,
120
- expectedError : httpgrpc .Errorf (http .StatusTooManyRequests , "ingestion rate limit (20) exceeded while adding 30 samples and 0 metadata" ),
121
+ samples : 25 ,
122
+ metadata : 5 ,
123
+ expectedError : httpgrpc .Errorf (http .StatusTooManyRequests , "ingestion rate limit (20) exceeded while adding 25 samples and 5 metadata" ),
121
124
startTimestampMs : 123456789000 ,
122
125
expectedMetrics : `
123
126
# HELP cortex_distributor_latest_seen_sample_timestamp_seconds Unix timestamp of latest received sample per user.
@@ -138,7 +141,7 @@ func TestDistributor_Push(t *testing.T) {
138
141
d , _ := prepare (t , tc .numIngesters , tc .happyIngesters , 0 , shardByAllLabels , limits , nil )
139
142
defer services .StopAndAwaitTerminated (context .Background (), d ) //nolint:errcheck
140
143
141
- request := makeWriteRequest (tc .startTimestampMs , tc .samples )
144
+ request := makeWriteRequest (tc .startTimestampMs , tc .samples , tc . metadata )
142
145
response , err := d .Push (ctx , request )
143
146
assert .Equal (t , tc .expectedResponse , response )
144
147
assert .Equal (t , tc .expectedError , err )
@@ -156,6 +159,7 @@ func TestDistributor_Push(t *testing.T) {
156
159
func TestDistributor_PushIngestionRateLimiter (t * testing.T ) {
157
160
type testPush struct {
158
161
samples int
162
+ metadata int
159
163
expectedError error
160
164
}
161
165
@@ -172,10 +176,12 @@ func TestDistributor_PushIngestionRateLimiter(t *testing.T) {
172
176
ingestionRate : 10 ,
173
177
ingestionBurstSize : 10 ,
174
178
pushes : []testPush {
175
- {samples : 5 , expectedError : nil },
179
+ {samples : 4 , expectedError : nil },
180
+ {metadata : 1 , expectedError : nil },
176
181
{samples : 6 , expectedError : httpgrpc .Errorf (http .StatusTooManyRequests , "ingestion rate limit (10) exceeded while adding 6 samples and 0 metadata" )},
177
- {samples : 5 , expectedError : nil },
182
+ {samples : 4 , metadata : 1 , expectedError : nil },
178
183
{samples : 1 , expectedError : httpgrpc .Errorf (http .StatusTooManyRequests , "ingestion rate limit (10) exceeded while adding 1 samples and 0 metadata" )},
184
+ {metadata : 1 , expectedError : httpgrpc .Errorf (http .StatusTooManyRequests , "ingestion rate limit (10) exceeded while adding 0 samples and 1 metadata" )},
179
185
},
180
186
},
181
187
"global strategy: limit should be evenly shared across distributors" : {
@@ -184,10 +190,12 @@ func TestDistributor_PushIngestionRateLimiter(t *testing.T) {
184
190
ingestionRate : 10 ,
185
191
ingestionBurstSize : 5 ,
186
192
pushes : []testPush {
187
- {samples : 3 , expectedError : nil },
188
- {samples : 3 , expectedError : httpgrpc .Errorf (http .StatusTooManyRequests , "ingestion rate limit (5) exceeded while adding 3 samples and 0 metadata" )},
193
+ {samples : 2 , expectedError : nil },
194
+ {samples : 1 , expectedError : nil },
195
+ {samples : 2 , metadata : 1 , expectedError : httpgrpc .Errorf (http .StatusTooManyRequests , "ingestion rate limit (5) exceeded while adding 2 samples and 1 metadata" )},
189
196
{samples : 2 , expectedError : nil },
190
197
{samples : 1 , expectedError : httpgrpc .Errorf (http .StatusTooManyRequests , "ingestion rate limit (5) exceeded while adding 1 samples and 0 metadata" )},
198
+ {metadata : 1 , expectedError : httpgrpc .Errorf (http .StatusTooManyRequests , "ingestion rate limit (5) exceeded while adding 0 samples and 1 metadata" )},
191
199
},
192
200
},
193
201
"global strategy: burst should set to each distributor" : {
@@ -196,10 +204,12 @@ func TestDistributor_PushIngestionRateLimiter(t *testing.T) {
196
204
ingestionRate : 10 ,
197
205
ingestionBurstSize : 20 ,
198
206
pushes : []testPush {
199
- {samples : 15 , expectedError : nil },
200
- {samples : 6 , expectedError : httpgrpc .Errorf (http .StatusTooManyRequests , "ingestion rate limit (5) exceeded while adding 6 samples and 0 metadata" )},
207
+ {samples : 10 , expectedError : nil },
208
+ {samples : 5 , expectedError : nil },
209
+ {samples : 5 , metadata : 1 , expectedError : httpgrpc .Errorf (http .StatusTooManyRequests , "ingestion rate limit (5) exceeded while adding 5 samples and 1 metadata" )},
201
210
{samples : 5 , expectedError : nil },
202
211
{samples : 1 , expectedError : httpgrpc .Errorf (http .StatusTooManyRequests , "ingestion rate limit (5) exceeded while adding 1 samples and 0 metadata" )},
212
+ {metadata : 1 , expectedError : httpgrpc .Errorf (http .StatusTooManyRequests , "ingestion rate limit (5) exceeded while adding 0 samples and 1 metadata" )},
203
213
},
204
214
},
205
215
}
@@ -234,7 +244,7 @@ func TestDistributor_PushIngestionRateLimiter(t *testing.T) {
234
244
235
245
// Push samples in multiple requests to the first distributor
236
246
for _ , push := range testData .pushes {
237
- request := makeWriteRequest (0 , push .samples )
247
+ request := makeWriteRequest (0 , push .samples , push . metadata )
238
248
response , err := distributors [0 ].Push (ctx , request )
239
249
240
250
if push .expectedError == nil {
@@ -337,6 +347,7 @@ func TestDistributor_PushQuery(t *testing.T) {
337
347
numIngesters int
338
348
happyIngesters int
339
349
samples int
350
+ metadata int
340
351
matchers []* labels.Matcher
341
352
expectedResponse model.Matrix
342
353
expectedError error
@@ -420,7 +431,7 @@ func TestDistributor_PushQuery(t *testing.T) {
420
431
d , _ := prepare (t , tc .numIngesters , tc .happyIngesters , 0 , tc .shardByAllLabels , nil , nil )
421
432
defer services .StopAndAwaitTerminated (context .Background (), d ) //nolint:errcheck
422
433
423
- request := makeWriteRequest (0 , tc .samples )
434
+ request := makeWriteRequest (0 , tc .samples , tc . metadata )
424
435
writeResponse , err := d .Push (ctx , request )
425
436
assert .Equal (t , & client.WriteResponse {}, writeResponse )
426
437
assert .Nil (t , err )
@@ -750,7 +761,7 @@ func mockWriteRequest(lbls labels.Labels, value float64, timestampMs int64) *cli
750
761
},
751
762
}
752
763
753
- return client .ToWriteRequest ([]labels.Labels {lbls }, samples , client .API )
764
+ return client .ToWriteRequest ([]labels.Labels {lbls }, samples , nil , client .API )
754
765
}
755
766
756
767
func prepare (t * testing.T , numIngesters , happyIngesters int , queryDelay time.Duration , shardByAllLabels bool , limits * validation.Limits , kvStore kv.Client ) (* Distributor , []mockIngester ) {
@@ -817,7 +828,7 @@ func prepare(t *testing.T, numIngesters, happyIngesters int, queryDelay time.Dur
817
828
return d , ingesters
818
829
}
819
830
820
- func makeWriteRequest (startTimestampMs int64 , samples int ) * client.WriteRequest {
831
+ func makeWriteRequest (startTimestampMs int64 , samples int , metadata int ) * client.WriteRequest {
821
832
request := & client.WriteRequest {}
822
833
for i := 0 ; i < samples ; i ++ {
823
834
ts := client.PreallocTimeseries {
@@ -837,6 +848,16 @@ func makeWriteRequest(startTimestampMs int64, samples int) *client.WriteRequest
837
848
}
838
849
request .Timeseries = append (request .Timeseries , ts )
839
850
}
851
+
852
+ for i := 0 ; i < metadata ; i ++ {
853
+ m := & client.MetricMetadata {
854
+ MetricName : fmt .Sprintf ("metric_%d" , i ),
855
+ Type : client .COUNTER ,
856
+ Help : fmt .Sprintf ("a help for metric_%d" , i ),
857
+ }
858
+ request .Metadata = append (request .Metadata , m )
859
+ }
860
+
840
861
return request
841
862
}
842
863
@@ -1142,19 +1163,20 @@ func TestDistributorValidation(t *testing.T) {
1142
1163
future , past := now .Add (5 * time .Hour ), now .Add (- 25 * time .Hour )
1143
1164
1144
1165
for i , tc := range []struct {
1145
- labels []labels.Labels
1146
- samples []client.Sample
1147
- err error
1166
+ metadata []* client.MetricMetadata
1167
+ labels []labels.Labels
1168
+ samples []client.Sample
1169
+ err error
1148
1170
}{
1149
1171
// Test validation passes.
1150
1172
{
1151
- labels : []labels.Labels {{{Name : labels .MetricName , Value : "testmetric" }, {Name : "foo" , Value : "bar" }}},
1173
+ metadata : []* client.MetricMetadata {{MetricName : "testmetric" , Help : "a test metric." , Unit : "" , Type : client .COUNTER }},
1174
+ labels : []labels.Labels {{{Name : labels .MetricName , Value : "testmetric" }, {Name : "foo" , Value : "bar" }}},
1152
1175
samples : []client.Sample {{
1153
1176
TimestampMs : int64 (now ),
1154
1177
Value : 1 ,
1155
1178
}},
1156
1179
},
1157
-
1158
1180
// Test validation fails for very old samples.
1159
1181
{
1160
1182
labels : []labels.Labels {{{Name : labels .MetricName , Value : "testmetric" }, {Name : "foo" , Value : "bar" }}},
@@ -1196,6 +1218,16 @@ func TestDistributorValidation(t *testing.T) {
1196
1218
},
1197
1219
err : httpgrpc .Errorf (http .StatusBadRequest , `sample for 'testmetric{foo2="bar2", foo="bar"}' has 3 label names; limit 2` ),
1198
1220
},
1221
+ // Test metadata validation fails
1222
+ {
1223
+ metadata : []* client.MetricMetadata {{MetricName : "" , Help : "a test metric." , Unit : "" , Type : client .COUNTER }},
1224
+ labels : []labels.Labels {{{Name : labels .MetricName , Value : "testmetric" }, {Name : "foo" , Value : "bar" }}},
1225
+ samples : []client.Sample {{
1226
+ TimestampMs : int64 (now ),
1227
+ Value : 1 ,
1228
+ }},
1229
+ err : httpgrpc .Errorf (http .StatusBadRequest , `metadata missing metric name` ),
1230
+ },
1199
1231
} {
1200
1232
t .Run (strconv .Itoa (i ), func (t * testing.T ) {
1201
1233
var limits validation.Limits
@@ -1209,7 +1241,7 @@ func TestDistributorValidation(t *testing.T) {
1209
1241
d , _ := prepare (t , 3 , 3 , 0 , true , & limits , nil )
1210
1242
defer services .StopAndAwaitTerminated (context .Background (), d ) //nolint:errcheck
1211
1243
1212
- _ , err := d .Push (ctx , client .ToWriteRequest (tc .labels , tc .samples , client .API ))
1244
+ _ , err := d .Push (ctx , client .ToWriteRequest (tc .labels , tc .samples , tc . metadata , client .API ))
1213
1245
require .Equal (t , tc .err , err )
1214
1246
})
1215
1247
}
0 commit comments