@@ -11,6 +11,7 @@ import (
11
11
"time"
12
12
13
13
"github.com/prometheus/common/model"
14
+ "github.com/prometheus/prometheus/model/labels"
14
15
"github.com/prometheus/prometheus/prompb"
15
16
writev2 "github.com/prometheus/prometheus/prompb/io/prometheus/write/v2"
16
17
"github.com/prometheus/prometheus/tsdb/tsdbutil"
@@ -25,7 +26,7 @@ import (
25
26
26
27
func TestIngesterRollingUpdate (t * testing.T ) {
27
28
// Test ingester rolling update situation: when -distributor.remote-write2-enabled is true, and ingester uses the v1.19.0 image.
28
- // Expected: remote write 2.0 push success, but response header values are set to "0".
29
+ // Expected: remote write 2.0 push success
29
30
const blockRangePeriod = 5 * time .Second
30
31
ingesterImage := "quay.io/cortexproject/cortex:v1.19.0"
31
32
@@ -97,7 +98,7 @@ func TestIngesterRollingUpdate(t *testing.T) {
97
98
res , err := c .PushV2 (symbols1 , series )
98
99
require .NoError (t , err )
99
100
require .Equal (t , 200 , res .StatusCode )
100
- testPushHeader (t , res .Header , "0 " , "0" , "0" )
101
+ testPushHeader (t , res .Header , "1 " , "0" , "0" )
101
102
102
103
// sample
103
104
result , err := c .Query ("test_series" , now )
@@ -115,13 +116,13 @@ func TestIngesterRollingUpdate(t *testing.T) {
115
116
res , err = c .PushV2 (symbols2 , histogramSeries )
116
117
require .NoError (t , err )
117
118
require .Equal (t , 200 , res .StatusCode )
118
- testPushHeader (t , res .Header , "0" , "0 " , "0" )
119
+ testPushHeader (t , res .Header , "0" , "1 " , "0" )
119
120
120
- symbols3 , histogramFloatSeries := e2e .GenerateHistogramSeriesV2 ("test_histogram" , now , histogramIdx , false , prompb.Label {Name : "job" , Value : "test" }, prompb.Label {Name : "float" , Value : "true" })
121
+ symbols3 , histogramFloatSeries := e2e .GenerateHistogramSeriesV2 ("test_histogram" , now , histogramIdx , true , prompb.Label {Name : "job" , Value : "test" }, prompb.Label {Name : "float" , Value : "true" })
121
122
res , err = c .PushV2 (symbols3 , histogramFloatSeries )
122
123
require .NoError (t , err )
123
124
require .Equal (t , 200 , res .StatusCode )
124
- testPushHeader (t , res .Header , "0" , "0 " , "0" )
125
+ testPushHeader (t , res .Header , "0" , "1 " , "0" )
125
126
126
127
testHistogramTimestamp := now .Add (blockRangePeriod * 2 )
127
128
expectedHistogram := tsdbutil .GenerateTestHistogram (int64 (histogramIdx ))
@@ -138,6 +139,8 @@ func TestIngesterRollingUpdate(t *testing.T) {
138
139
}
139
140
140
141
func TestIngest_SenderSendPRW2_DistributorNotAllowPRW2 (t * testing.T ) {
142
+ // Test `-distributor.remote-write2-enabled=false` but the Sender pushes PRW2
143
+ // Expected: status code is 200, but samples are not written.
141
144
const blockRangePeriod = 5 * time .Second
142
145
143
146
s , err := e2e .NewScenario (networkName )
@@ -198,6 +201,11 @@ func TestIngest_SenderSendPRW2_DistributorNotAllowPRW2(t *testing.T) {
198
201
res , err := c .PushV2 (symbols1 , series )
199
202
require .NoError (t , err )
200
203
require .Equal (t , 200 , res .StatusCode )
204
+
205
+ // sample
206
+ result , err := c .Query ("test_series" , now )
207
+ require .NoError (t , err )
208
+ require .Empty (t , result )
201
209
}
202
210
203
211
func TestIngest (t * testing.T ) {
@@ -281,7 +289,8 @@ func TestIngest(t *testing.T) {
281
289
require .Equal (t , 200 , res .StatusCode )
282
290
testPushHeader (t , res .Header , "0" , "1" , "0" )
283
291
284
- symbols3 , histogramFloatSeries := e2e .GenerateHistogramSeriesV2 ("test_histogram" , now , histogramIdx , false , prompb.Label {Name : "job" , Value : "test" }, prompb.Label {Name : "float" , Value : "true" })
292
+ // float histogram
293
+ symbols3 , histogramFloatSeries := e2e .GenerateHistogramSeriesV2 ("test_histogram" , now , histogramIdx , true , prompb.Label {Name : "job" , Value : "test" }, prompb.Label {Name : "float" , Value : "true" })
285
294
res , err = c .PushV2 (symbols3 , histogramFloatSeries )
286
295
require .NoError (t , err )
287
296
require .Equal (t , 200 , res .StatusCode )
@@ -383,6 +392,71 @@ func TestExemplar(t *testing.T) {
383
392
require .Equal (t , 1 , len (exemplars ))
384
393
}
385
394
395
+ func Test_WriteStatWithReplication (t * testing.T ) {
396
+ // Test `X-Prometheus-Remote-Write-Samples-Written` header value
397
+ // with the replication.
398
+ s , err := e2e .NewScenario (networkName )
399
+ require .NoError (t , err )
400
+ defer s .Close ()
401
+
402
+ // Start dependencies.
403
+ consul := e2edb .NewConsulWithName ("consul" )
404
+ require .NoError (t , s .StartAndWaitReady (consul ))
405
+
406
+ flags := mergeFlags (
407
+ AlertmanagerLocalFlags (),
408
+ map [string ]string {
409
+ "-store.engine" : blocksStorageEngine ,
410
+ "-blocks-storage.backend" : "filesystem" ,
411
+ "-blocks-storage.tsdb.head-compaction-interval" : "4m" ,
412
+ "-blocks-storage.bucket-store.sync-interval" : "15m" ,
413
+ "-blocks-storage.bucket-store.index-cache.backend" : tsdb .IndexCacheBackendInMemory ,
414
+ "-blocks-storage.bucket-store.bucket-index.enabled" : "true" ,
415
+ "-querier.query-store-for-labels-enabled" : "true" ,
416
+ "-blocks-storage.tsdb.ship-interval" : "1s" ,
417
+ "-blocks-storage.tsdb.enable-native-histograms" : "true" ,
418
+ // Ingester.
419
+ "-ring.store" : "consul" ,
420
+ "-consul.hostname" : consul .NetworkHTTPEndpoint (),
421
+ "-ingester.max-exemplars" : "100" ,
422
+ // Distributor.
423
+ "-distributor.replication-factor" : "3" ,
424
+ "-distributor.remote-write2-enabled" : "true" ,
425
+ // Store-gateway.
426
+ "-store-gateway.sharding-enabled" : "false" ,
427
+ // alert manager
428
+ "-alertmanager.web.external-url" : "http://localhost/alertmanager" ,
429
+ },
430
+ )
431
+
432
+ // Start Cortex components.
433
+ distributor := e2ecortex .NewDistributor ("distributor" , e2ecortex .RingStoreConsul , consul .NetworkHTTPEndpoint (), flags , "" )
434
+ ingester1 := e2ecortex .NewIngester ("ingester-1" , e2ecortex .RingStoreConsul , consul .NetworkHTTPEndpoint (), flags , "" )
435
+ ingester2 := e2ecortex .NewIngester ("ingester-2" , e2ecortex .RingStoreConsul , consul .NetworkHTTPEndpoint (), flags , "" )
436
+ ingester3 := e2ecortex .NewIngester ("ingester-3" , e2ecortex .RingStoreConsul , consul .NetworkHTTPEndpoint (), flags , "" )
437
+ require .NoError (t , s .StartAndWaitReady (distributor , ingester1 , ingester2 , ingester3 ))
438
+
439
+ // Wait until distributor have updated the ring.
440
+ require .NoError (t , distributor .WaitSumMetricsWithOptions (e2e .Equals (3 ), []string {"cortex_ring_members" }, e2e .WithLabelMatchers (
441
+ labels .MustNewMatcher (labels .MatchEqual , "name" , "ingester" ),
442
+ labels .MustNewMatcher (labels .MatchEqual , "state" , "ACTIVE" ))))
443
+
444
+ c , err := e2ecortex .NewClient (distributor .HTTPEndpoint (), "" , "" , "" , "user-1" )
445
+ require .NoError (t , err )
446
+
447
+ now := time .Now ()
448
+
449
+ // series push
450
+ start := now .Add (- time .Minute * 10 )
451
+ numSamples := 20
452
+ scrapeInterval := 30 * time .Second
453
+ symbols , series := e2e .GenerateV2SeriesWithSamples ("test_series" , start , scrapeInterval , 0 , numSamples , prompb.Label {Name : "job" , Value : "test" })
454
+ res , err := c .PushV2 (symbols , []writev2.TimeSeries {series })
455
+ require .NoError (t , err )
456
+ require .Equal (t , 200 , res .StatusCode )
457
+ testPushHeader (t , res .Header , "20" , "0" , "0" )
458
+ }
459
+
386
460
func testPushHeader (t * testing.T , header http.Header , expectedSamples , expectedHistogram , expectedExemplars string ) {
387
461
require .Equal (t , expectedSamples , header .Get ("X-Prometheus-Remote-Write-Samples-Written" ))
388
462
require .Equal (t , expectedHistogram , header .Get ("X-Prometheus-Remote-Write-Histograms-Written" ))
0 commit comments