@@ -11,6 +11,7 @@ import (
1111 "time"
1212
1313 "github.com/prometheus/common/model"
14+ "github.com/prometheus/prometheus/model/labels"
1415 "github.com/prometheus/prometheus/prompb"
1516 writev2 "github.com/prometheus/prometheus/prompb/io/prometheus/write/v2"
1617 "github.com/prometheus/prometheus/tsdb/tsdbutil"
@@ -25,7 +26,7 @@ import (
2526
2627func TestIngesterRollingUpdate (t * testing.T ) {
2728 // 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
2930 const blockRangePeriod = 5 * time .Second
3031 ingesterImage := "quay.io/cortexproject/cortex:v1.19.0"
3132
@@ -97,7 +98,7 @@ func TestIngesterRollingUpdate(t *testing.T) {
9798 res , err := c .PushV2 (symbols1 , series )
9899 require .NoError (t , err )
99100 require .Equal (t , 200 , res .StatusCode )
100- testPushHeader (t , res .Header , "0 " , "0" , "0" )
101+ testPushHeader (t , res .Header , "1 " , "0" , "0" )
101102
102103 // sample
103104 result , err := c .Query ("test_series" , now )
@@ -115,13 +116,13 @@ func TestIngesterRollingUpdate(t *testing.T) {
115116 res , err = c .PushV2 (symbols2 , histogramSeries )
116117 require .NoError (t , err )
117118 require .Equal (t , 200 , res .StatusCode )
118- testPushHeader (t , res .Header , "0" , "0 " , "0" )
119+ testPushHeader (t , res .Header , "0" , "1 " , "0" )
119120
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" })
121122 res , err = c .PushV2 (symbols3 , histogramFloatSeries )
122123 require .NoError (t , err )
123124 require .Equal (t , 200 , res .StatusCode )
124- testPushHeader (t , res .Header , "0" , "0 " , "0" )
125+ testPushHeader (t , res .Header , "0" , "1 " , "0" )
125126
126127 testHistogramTimestamp := now .Add (blockRangePeriod * 2 )
127128 expectedHistogram := tsdbutil .GenerateTestHistogram (int64 (histogramIdx ))
@@ -138,6 +139,8 @@ func TestIngesterRollingUpdate(t *testing.T) {
138139}
139140
140141func 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.
141144 const blockRangePeriod = 5 * time .Second
142145
143146 s , err := e2e .NewScenario (networkName )
@@ -198,6 +201,11 @@ func TestIngest_SenderSendPRW2_DistributorNotAllowPRW2(t *testing.T) {
198201 res , err := c .PushV2 (symbols1 , series )
199202 require .NoError (t , err )
200203 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 )
201209}
202210
203211func TestIngest (t * testing.T ) {
@@ -281,7 +289,8 @@ func TestIngest(t *testing.T) {
281289 require .Equal (t , 200 , res .StatusCode )
282290 testPushHeader (t , res .Header , "0" , "1" , "0" )
283291
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" })
285294 res , err = c .PushV2 (symbols3 , histogramFloatSeries )
286295 require .NoError (t , err )
287296 require .Equal (t , 200 , res .StatusCode )
@@ -383,6 +392,71 @@ func TestExemplar(t *testing.T) {
383392 require .Equal (t , 1 , len (exemplars ))
384393}
385394
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+
386460func testPushHeader (t * testing.T , header http.Header , expectedSamples , expectedHistogram , expectedExemplars string ) {
387461 require .Equal (t , expectedSamples , header .Get ("X-Prometheus-Remote-Write-Samples-Written" ))
388462 require .Equal (t , expectedHistogram , header .Get ("X-Prometheus-Remote-Write-Histograms-Written" ))
0 commit comments