(t *testing.T)
| 381 | } |
| 382 | |
| 383 | func TestQuerierWithBlocksStorageLimits(t *testing.T) { |
| 384 | const blockRangePeriod = 5 * time.Second |
| 385 | |
| 386 | s, err := e2e.NewScenario(networkName) |
| 387 | require.NoError(t, err) |
| 388 | defer s.Close() |
| 389 | |
| 390 | // Configure the blocks storage to frequently compact TSDB head |
| 391 | // and ship blocks to the storage. |
| 392 | flags := mergeFlags(BlocksStorageFlags(), map[string]string{ |
| 393 | "-blocks-storage.tsdb.block-ranges-period": blockRangePeriod.String(), |
| 394 | "-blocks-storage.tsdb.ship-interval": "1s", |
| 395 | "-blocks-storage.tsdb.retention-period": ((blockRangePeriod * 2) - 1).String(), |
| 396 | }) |
| 397 | |
| 398 | // Start dependencies. |
| 399 | consul := e2edb.NewConsul() |
| 400 | minio := e2edb.NewMinio(9000, flags["-blocks-storage.s3.bucket-name"]) |
| 401 | require.NoError(t, s.StartAndWaitReady(consul, minio)) |
| 402 | |
| 403 | // Start Cortex components for the write path. |
| 404 | distributor := e2ecortex.NewDistributor("distributor", e2ecortex.RingStoreConsul, consul.NetworkHTTPEndpoint(), flags, "") |
| 405 | ingester := e2ecortex.NewIngester("ingester", e2ecortex.RingStoreConsul, consul.NetworkHTTPEndpoint(), flags, "") |
| 406 | require.NoError(t, s.StartAndWaitReady(distributor, ingester)) |
| 407 | |
| 408 | // Wait until the distributor has updated the ring. |
| 409 | require.NoError(t, distributor.WaitSumMetrics(e2e.Equals(512), "cortex_ring_tokens_total")) |
| 410 | |
| 411 | // Push some series to Cortex. |
| 412 | c, err := e2ecortex.NewClient(distributor.HTTPEndpoint(), "", "", "", "user-1") |
| 413 | require.NoError(t, err) |
| 414 | |
| 415 | seriesTimestamp := time.Now() |
| 416 | series2Timestamp := seriesTimestamp.Add(blockRangePeriod * 2) |
| 417 | series1, _ := generateSeries("series_1", seriesTimestamp, prompb.Label{Name: "job", Value: "test"}) |
| 418 | series2, _ := generateSeries("series_2", seriesTimestamp, prompb.Label{Name: "job", Value: "test"}) |
| 419 | // Make sure series in ingester has a different job label. |
| 420 | series3, _ := generateSeries("series_3", series2Timestamp, prompb.Label{Name: "job", Value: "prometheus"}) |
| 421 | |
| 422 | res, err := c.Push(series1) |
| 423 | require.NoError(t, err) |
| 424 | require.Equal(t, 200, res.StatusCode) |
| 425 | |
| 426 | res, err = c.Push(series2) |
| 427 | require.NoError(t, err) |
| 428 | require.Equal(t, 200, res.StatusCode) |
| 429 | |
| 430 | res, err = c.Push(series3) |
| 431 | require.NoError(t, err) |
| 432 | require.Equal(t, 200, res.StatusCode) |
| 433 | |
| 434 | // Wait until the TSDB head is compacted and shipped to the storage. |
| 435 | // The shipped block contains the 1st and 2nd series, while the 3rd series is in the head. |
| 436 | require.NoError(t, ingester.WaitSumMetrics(e2e.Equals(1), "cortex_ingester_shipper_uploads_total")) |
| 437 | require.NoError(t, ingester.WaitSumMetrics(e2e.Equals(3), "cortex_ingester_memory_series_created_total")) |
| 438 | require.NoError(t, ingester.WaitSumMetrics(e2e.Equals(2), "cortex_ingester_memory_series_removed_total")) |
| 439 | require.NoError(t, ingester.WaitSumMetrics(e2e.Equals(1), "cortex_ingester_memory_series")) |
| 440 |
nothing calls this directly
no test coverage detected