Skip to content

Commit 0ce5791

Browse files
authored
RFC: Add integration test for etcd (#4113)
* Add integration test for etcd (#4113) Signed-off-by: ChinYing-Li <chinying.li@mail.utoronto.ca> * Update the newly-added test case in querier_test Signed-off-by: ChinYing-Li <chinying.li@mail.utoronto.ca> * Add integration test for etcd using block storage (#4113) Signed-off-by: ChinYing-Li <chinying.li@mail.utoronto.ca>
1 parent 796a68e commit 0ce5791

13 files changed

+202
-86
lines changed

integration/backward_compatibility_test.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -115,8 +115,8 @@ func runBackwardCompatibilityTestWithChunksStorage(t *testing.T, previousImage s
115115
require.NoError(t, tableManager.WaitSumMetrics(e2e.Greater(0), "cortex_table_manager_sync_success_timestamp_seconds"))
116116

117117
// Start other Cortex components (ingester running on previous version).
118-
ingester1 := e2ecortex.NewIngester("ingester-1", consul.NetworkHTTPEndpoint(), flagsForOldImage, previousImage)
119-
distributor := e2ecortex.NewDistributor("distributor", consul.NetworkHTTPEndpoint(), ChunksStorageFlags(), "")
118+
ingester1 := e2ecortex.NewIngester("ingester-1", e2ecortex.RingStoreConsul, consul.NetworkHTTPEndpoint(), flagsForOldImage, previousImage)
119+
distributor := e2ecortex.NewDistributor("distributor", "consul", consul.NetworkHTTPEndpoint(), ChunksStorageFlags(), "")
120120
require.NoError(t, s.StartAndWaitReady(distributor, ingester1))
121121

122122
// Wait until the distributor has updated the ring.
@@ -133,7 +133,7 @@ func runBackwardCompatibilityTestWithChunksStorage(t *testing.T, previousImage s
133133
require.NoError(t, err)
134134
require.Equal(t, 200, res.StatusCode)
135135

136-
ingester2 := e2ecortex.NewIngester("ingester-2", consul.NetworkHTTPEndpoint(), mergeFlags(ChunksStorageFlags(), map[string]string{
136+
ingester2 := e2ecortex.NewIngester("ingester-2", e2ecortex.RingStoreConsul, consul.NetworkHTTPEndpoint(), mergeFlags(ChunksStorageFlags(), map[string]string{
137137
"-ingester.join-after": "10s",
138138
}), "")
139139
// Start ingester-2 on new version, to ensure the transfer is backward compatible.
@@ -181,10 +181,10 @@ func runNewDistributorsCanPushToOldIngestersWithReplication(t *testing.T, previo
181181
require.NoError(t, tableManager.WaitSumMetrics(e2e.Greater(0), "cortex_table_manager_sync_success_timestamp_seconds"))
182182

183183
// Start other Cortex components (ingester running on previous version).
184-
ingester1 := e2ecortex.NewIngester("ingester-1", consul.NetworkHTTPEndpoint(), flagsForPreviousImage, previousImage)
185-
ingester2 := e2ecortex.NewIngester("ingester-2", consul.NetworkHTTPEndpoint(), flagsForPreviousImage, previousImage)
186-
ingester3 := e2ecortex.NewIngester("ingester-3", consul.NetworkHTTPEndpoint(), flagsForPreviousImage, previousImage)
187-
distributor := e2ecortex.NewDistributor("distributor", consul.NetworkHTTPEndpoint(), flagsForNewImage, "")
184+
ingester1 := e2ecortex.NewIngester("ingester-1", e2ecortex.RingStoreConsul, consul.NetworkHTTPEndpoint(), flagsForPreviousImage, previousImage)
185+
ingester2 := e2ecortex.NewIngester("ingester-2", e2ecortex.RingStoreConsul, consul.NetworkHTTPEndpoint(), flagsForPreviousImage, previousImage)
186+
ingester3 := e2ecortex.NewIngester("ingester-3", e2ecortex.RingStoreConsul, consul.NetworkHTTPEndpoint(), flagsForPreviousImage, previousImage)
187+
distributor := e2ecortex.NewDistributor("distributor", "consul", consul.NetworkHTTPEndpoint(), flagsForNewImage, "")
188188
require.NoError(t, s.StartAndWaitReady(distributor, ingester1, ingester2, ingester3))
189189

190190
// Wait until the distributor has updated the ring.
@@ -252,7 +252,7 @@ func checkQueries(
252252
}()
253253

254254
// Start querier.
255-
querier := e2ecortex.NewQuerier("querier", consul.NetworkHTTPEndpoint(), e2e.MergeFlagsWithoutRemovingEmpty(c.querierFlags, map[string]string{
255+
querier := e2ecortex.NewQuerier("querier", e2ecortex.RingStoreConsul, consul.NetworkHTTPEndpoint(), e2e.MergeFlagsWithoutRemovingEmpty(c.querierFlags, map[string]string{
256256
"-querier.frontend-address": queryFrontend.NetworkGRPCEndpoint(),
257257
}), c.querierImage)
258258

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
// +build requires_docker
2+
3+
package integration
4+
5+
import (
6+
"testing"
7+
"time"
8+
9+
"github.com/stretchr/testify/require"
10+
11+
"github.com/cortexproject/cortex/integration/e2e"
12+
e2edb "github.com/cortexproject/cortex/integration/e2e/db"
13+
"github.com/cortexproject/cortex/integration/e2ecortex"
14+
)
15+
16+
func TestBlocksStorageWithEtcd(t *testing.T) {
17+
s, err := e2e.NewScenario(networkName)
18+
require.NoError(t, err)
19+
defer s.Close()
20+
21+
// Configure the blocks storage to frequently compact TSDB head
22+
// and ship blocks to the storage.
23+
flags := mergeFlags(BlocksStorageFlags(), map[string]string{
24+
"-blocks-storage.tsdb.block-ranges-period": "1h",
25+
"-blocks-storage.tsdb.head-compaction-interval": "1m",
26+
"-store-gateway.sharding-enabled": "true",
27+
"-querier.ingester-streaming": "true",
28+
})
29+
30+
// Start dependencies.
31+
etcd := e2edb.NewETCD()
32+
minio := e2edb.NewMinio(9000, flags["-blocks-storage.s3.bucket-name"])
33+
require.NoError(t, s.StartAndWaitReady(etcd, minio))
34+
35+
distributor := e2ecortex.NewDistributor("distributor", e2ecortex.RingStoreEtcd, etcd.NetworkHTTPEndpoint(), flags, "")
36+
ingester := e2ecortex.NewIngester("ingester", e2ecortex.RingStoreEtcd, etcd.NetworkHTTPEndpoint(), flags, "")
37+
storeGateway := e2ecortex.NewStoreGateway("store-gateway", e2ecortex.RingStoreEtcd, etcd.NetworkHTTPEndpoint(), flags, "")
38+
require.NoError(t, s.StartAndWaitReady(distributor, ingester, storeGateway))
39+
40+
// Wait until the distributor and the store-gateway have updated the ring.
41+
require.NoError(t, distributor.WaitSumMetrics(e2e.Equals(512), "cortex_ring_tokens_total"))
42+
require.NoError(t, storeGateway.WaitSumMetrics(e2e.Equals(512), "cortex_ring_tokens_total"))
43+
44+
// Sharding is disabled, pass gateway address.
45+
querierFlags := mergeFlags(flags, map[string]string{
46+
// "-querier.store-gateway-addresses": strings.Join([]string{storeGateway.NetworkGRPCEndpoint()}, ","),
47+
"-blocks-storage.bucket-store.sync-interval": "1m",
48+
// "-distributor.shard-by-all-labels": "true",
49+
})
50+
querier := e2ecortex.NewQuerier("querier", e2ecortex.RingStoreEtcd, etcd.NetworkHTTPEndpoint(), querierFlags, "")
51+
require.NoError(t, s.StartAndWaitReady(querier))
52+
53+
// Wait until the distributor, the querier and the store-gateway have updated the ring.
54+
require.NoError(t, querier.WaitSumMetrics(e2e.Equals(1024), "cortex_ring_tokens_total"))
55+
56+
// Push a series for each user to Cortex.
57+
now := time.Now()
58+
59+
distClient, err := e2ecortex.NewClient(distributor.HTTPEndpoint(), "", "", "", "user-1")
60+
require.NoError(t, err)
61+
62+
series, _ := generateSeries("series_1", now)
63+
64+
res, err := distClient.Push(series)
65+
require.NoError(t, err)
66+
require.Equal(t, 200, res.StatusCode)
67+
68+
queClient, err := e2ecortex.NewClient("", querier.HTTPEndpoint(), "", "", "user-1")
69+
require.NoError(t, err)
70+
71+
_, err = queClient.Query("series_1", now)
72+
require.NoError(t, err)
73+
74+
// Ensure no service-specific metrics prefix is used by the wrong service.
75+
assertServiceMetricsPrefixes(t, Distributor, distributor)
76+
assertServiceMetricsPrefixes(t, Ingester, ingester)
77+
assertServiceMetricsPrefixes(t, Querier, querier)
78+
}

integration/e2ecortex/services.go

Lines changed: 62 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,13 @@ const (
1313
GossipPort = 9094
1414
)
1515

16+
type RingStore string
17+
18+
const (
19+
RingStoreConsul RingStore = "consul"
20+
RingStoreEtcd RingStore = "etcd"
21+
)
22+
1623
// GetDefaultImage returns the Docker image to use to run Cortex.
1724
func GetDefaultImage() string {
1825
// Get the cortex image from the CORTEX_IMAGE env variable,
@@ -24,15 +31,23 @@ func GetDefaultImage() string {
2431
return "quay.io/cortexproject/cortex:latest"
2532
}
2633

27-
func NewDistributor(name string, consulAddress string, flags map[string]string, image string) *CortexService {
28-
return NewDistributorWithConfigFile(name, consulAddress, "", flags, image)
34+
func NewDistributor(name string, store RingStore, address string, flags map[string]string, image string) *CortexService {
35+
return NewDistributorWithConfigFile(name, store, address, "", flags, image)
2936
}
3037

31-
func NewDistributorWithConfigFile(name, consulAddress, configFile string, flags map[string]string, image string) *CortexService {
38+
func NewDistributorWithConfigFile(name string, store RingStore, address, configFile string, flags map[string]string, image string) *CortexService {
3239
if configFile != "" {
3340
flags["-config.file"] = filepath.Join(e2e.ContainerSharedDir, configFile)
3441
}
3542

43+
// Configure the ingesters ring backend
44+
flags["-ring.store"] = string(store)
45+
if store == RingStoreConsul {
46+
flags["-consul.hostname"] = address
47+
} else if store == RingStoreEtcd {
48+
flags["-etcd.endpoints"] = address
49+
}
50+
3651
if image == "" {
3752
image = GetDefaultImage()
3853
}
@@ -45,25 +60,39 @@ func NewDistributorWithConfigFile(name, consulAddress, configFile string, flags
4560
"-log.level": "warn",
4661
"-auth.enabled": "true",
4762
"-distributor.replication-factor": "1",
48-
// Configure the ingesters ring backend
49-
"-ring.store": "consul",
50-
"-consul.hostname": consulAddress,
5163
}, flags))...),
5264
e2e.NewHTTPReadinessProbe(httpPort, "/ready", 200, 299),
5365
httpPort,
5466
grpcPort,
5567
)
5668
}
5769

58-
func NewQuerier(name string, consulAddress string, flags map[string]string, image string) *CortexService {
59-
return NewQuerierWithConfigFile(name, consulAddress, "", flags, image)
70+
func NewQuerier(name string, store RingStore, address string, flags map[string]string, image string) *CortexService {
71+
return NewQuerierWithConfigFile(name, store, address, "", flags, image)
6072
}
6173

62-
func NewQuerierWithConfigFile(name, consulAddress, configFile string, flags map[string]string, image string) *CortexService {
74+
func NewQuerierWithConfigFile(name string, store RingStore, address, configFile string, flags map[string]string, image string) *CortexService {
6375
if configFile != "" {
6476
flags["-config.file"] = filepath.Join(e2e.ContainerSharedDir, configFile)
6577
}
6678

79+
// Configure the ingesters ring backend and the store-gateway ring backend.
80+
ringBackendFlags := map[string]string{
81+
"-ring.store": string(store),
82+
"-store-gateway.sharding-ring.store": string(store),
83+
}
84+
85+
if store == RingStoreConsul {
86+
ringBackendFlags["-consul.hostname"] = address
87+
ringBackendFlags["-store-gateway.sharding-ring.consul.hostname"] = address
88+
} else if store == RingStoreEtcd {
89+
ringBackendFlags["-etcd.endpoints"] = address
90+
ringBackendFlags["-store-gateway.sharding-ring.etcd.endpoints"] = address
91+
}
92+
93+
// For backward compatibility
94+
flags = e2e.MergeFlagsWithoutRemovingEmpty(ringBackendFlags, flags)
95+
6796
if image == "" {
6897
image = GetDefaultImage()
6998
}
@@ -75,9 +104,6 @@ func NewQuerierWithConfigFile(name, consulAddress, configFile string, flags map[
75104
"-target": "querier",
76105
"-log.level": "warn",
77106
"-distributor.replication-factor": "1",
78-
// Ingesters ring backend.
79-
"-ring.store": "consul",
80-
"-consul.hostname": consulAddress,
81107
// Query-frontend worker.
82108
"-querier.frontend-client.backoff-min-period": "100ms",
83109
"-querier.frontend-client.backoff-max-period": "100ms",
@@ -87,8 +113,6 @@ func NewQuerierWithConfigFile(name, consulAddress, configFile string, flags map[
87113
"-querier.dns-lookup-period": "1s",
88114
// Store-gateway ring backend.
89115
"-store-gateway.sharding-enabled": "true",
90-
"-store-gateway.sharding-ring.store": "consul",
91-
"-store-gateway.sharding-ring.consul.hostname": consulAddress,
92116
"-store-gateway.sharding-ring.replication-factor": "1",
93117
}, flags))...),
94118
e2e.NewHTTPReadinessProbe(httpPort, "/ready", 200, 299),
@@ -97,15 +121,23 @@ func NewQuerierWithConfigFile(name, consulAddress, configFile string, flags map[
97121
)
98122
}
99123

100-
func NewStoreGateway(name string, consulAddress string, flags map[string]string, image string) *CortexService {
101-
return NewStoreGatewayWithConfigFile(name, consulAddress, "", flags, image)
124+
func NewStoreGateway(name string, store RingStore, address string, flags map[string]string, image string) *CortexService {
125+
return NewStoreGatewayWithConfigFile(name, store, address, "", flags, image)
102126
}
103127

104-
func NewStoreGatewayWithConfigFile(name, consulAddress, configFile string, flags map[string]string, image string) *CortexService {
128+
func NewStoreGatewayWithConfigFile(name string, store RingStore, address string, configFile string, flags map[string]string, image string) *CortexService {
105129
if configFile != "" {
106130
flags["-config.file"] = filepath.Join(e2e.ContainerSharedDir, configFile)
107131
}
108132

133+
if store == RingStoreConsul {
134+
flags["-consul.hostname"] = address
135+
flags["-store-gateway.sharding-ring.consul.hostname"] = address
136+
} else if store == RingStoreEtcd {
137+
flags["-etcd.endpoints"] = address
138+
flags["-store-gateway.sharding-ring.etcd.endpoints"] = address
139+
}
140+
109141
if image == "" {
110142
image = GetDefaultImage()
111143
}
@@ -118,8 +150,7 @@ func NewStoreGatewayWithConfigFile(name, consulAddress, configFile string, flags
118150
"-log.level": "warn",
119151
// Store-gateway ring backend.
120152
"-store-gateway.sharding-enabled": "true",
121-
"-store-gateway.sharding-ring.store": "consul",
122-
"-store-gateway.sharding-ring.consul.hostname": consulAddress,
153+
"-store-gateway.sharding-ring.store": string(store),
123154
"-store-gateway.sharding-ring.replication-factor": "1",
124155
// Startup quickly.
125156
"-store-gateway.sharding-ring.wait-stability-min-duration": "0",
@@ -131,14 +162,23 @@ func NewStoreGatewayWithConfigFile(name, consulAddress, configFile string, flags
131162
)
132163
}
133164

134-
func NewIngester(name string, consulAddress string, flags map[string]string, image string) *CortexService {
135-
return NewIngesterWithConfigFile(name, consulAddress, "", flags, image)
165+
func NewIngester(name string, store RingStore, address string, flags map[string]string, image string) *CortexService {
166+
return NewIngesterWithConfigFile(name, store, address, "", flags, image)
136167
}
137168

138-
func NewIngesterWithConfigFile(name, consulAddress, configFile string, flags map[string]string, image string) *CortexService {
169+
func NewIngesterWithConfigFile(name string, store RingStore, address, configFile string, flags map[string]string, image string) *CortexService {
139170
if configFile != "" {
140171
flags["-config.file"] = filepath.Join(e2e.ContainerSharedDir, configFile)
141172
}
173+
174+
// Configure the ingesters ring backend
175+
flags["-ring.store"] = string(store)
176+
if store == RingStoreConsul {
177+
flags["-consul.hostname"] = address
178+
} else if store == RingStoreEtcd {
179+
flags["-etcd.endpoints"] = address
180+
}
181+
142182
if image == "" {
143183
image = GetDefaultImage()
144184
}
@@ -155,9 +195,6 @@ func NewIngesterWithConfigFile(name, consulAddress, configFile string, flags map
155195
"-ingester.concurrent-flushes": "10",
156196
"-ingester.max-transfer-retries": "10",
157197
"-ingester.num-tokens": "512",
158-
// Configure the ingesters ring backend
159-
"-ring.store": "consul",
160-
"-consul.hostname": consulAddress,
161198
}, flags))...),
162199
e2e.NewHTTPReadinessProbe(httpPort, "/ready", 200, 299),
163200
httpPort,

integration/ingester_limits_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,10 @@ func TestIngesterGlobalLimits(t *testing.T) {
6363
require.NoError(t, s.StartAndWaitReady(consul, minio))
6464

6565
// Start Cortex components.
66-
distributor := e2ecortex.NewDistributor("distributor", consul.NetworkHTTPEndpoint(), flags, "")
67-
ingester1 := e2ecortex.NewIngester("ingester-1", consul.NetworkHTTPEndpoint(), flags, "")
68-
ingester2 := e2ecortex.NewIngester("ingester-2", consul.NetworkHTTPEndpoint(), flags, "")
69-
ingester3 := e2ecortex.NewIngester("ingester-3", consul.NetworkHTTPEndpoint(), flags, "")
66+
distributor := e2ecortex.NewDistributor("distributor", e2ecortex.RingStoreConsul, consul.NetworkHTTPEndpoint(), flags, "")
67+
ingester1 := e2ecortex.NewIngester("ingester-1", e2ecortex.RingStoreConsul, consul.NetworkHTTPEndpoint(), flags, "")
68+
ingester2 := e2ecortex.NewIngester("ingester-2", e2ecortex.RingStoreConsul, consul.NetworkHTTPEndpoint(), flags, "")
69+
ingester3 := e2ecortex.NewIngester("ingester-3", e2ecortex.RingStoreConsul, consul.NetworkHTTPEndpoint(), flags, "")
7070
require.NoError(t, s.StartAndWaitReady(distributor, ingester1, ingester2, ingester3))
7171

7272
// Wait until distributor has updated the ring.

integration/ingester_sharding_test.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -61,12 +61,12 @@ func TestIngesterSharding(t *testing.T) {
6161
require.NoError(t, s.StartAndWaitReady(consul, minio))
6262

6363
// Start Cortex components.
64-
distributor := e2ecortex.NewDistributor("distributor", consul.NetworkHTTPEndpoint(), flags, "")
65-
ingester1 := e2ecortex.NewIngester("ingester-1", consul.NetworkHTTPEndpoint(), flags, "")
66-
ingester2 := e2ecortex.NewIngester("ingester-2", consul.NetworkHTTPEndpoint(), flags, "")
67-
ingester3 := e2ecortex.NewIngester("ingester-3", consul.NetworkHTTPEndpoint(), flags, "")
64+
distributor := e2ecortex.NewDistributor("distributor", e2ecortex.RingStoreConsul, consul.NetworkHTTPEndpoint(), flags, "")
65+
ingester1 := e2ecortex.NewIngester("ingester-1", e2ecortex.RingStoreConsul, consul.NetworkHTTPEndpoint(), flags, "")
66+
ingester2 := e2ecortex.NewIngester("ingester-2", e2ecortex.RingStoreConsul, consul.NetworkHTTPEndpoint(), flags, "")
67+
ingester3 := e2ecortex.NewIngester("ingester-3", e2ecortex.RingStoreConsul, consul.NetworkHTTPEndpoint(), flags, "")
6868
ingesters := e2ecortex.NewCompositeCortexService(ingester1, ingester2, ingester3)
69-
querier := e2ecortex.NewQuerier("querier", consul.NetworkHTTPEndpoint(), flags, "")
69+
querier := e2ecortex.NewQuerier("querier", e2ecortex.RingStoreConsul, consul.NetworkHTTPEndpoint(), flags, "")
7070
require.NoError(t, s.StartAndWaitReady(distributor, ingester1, ingester2, ingester3, querier))
7171

7272
// Wait until distributor and queriers have updated the ring.

integration/querier_remote_read_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,8 @@ func TestQuerierRemoteRead(t *testing.T) {
4545
require.NoError(t, tableManager.WaitSumMetrics(e2e.Greater(0), "cortex_table_manager_sync_success_timestamp_seconds"))
4646

4747
// Start Cortex components for the write path.
48-
distributor := e2ecortex.NewDistributor("distributor", consul.NetworkHTTPEndpoint(), flags, "")
49-
ingester := e2ecortex.NewIngester("ingester", consul.NetworkHTTPEndpoint(), flags, "")
48+
distributor := e2ecortex.NewDistributor("distributor", e2ecortex.RingStoreConsul, consul.NetworkHTTPEndpoint(), flags, "")
49+
ingester := e2ecortex.NewIngester("ingester", e2ecortex.RingStoreConsul, consul.NetworkHTTPEndpoint(), flags, "")
5050
require.NoError(t, s.StartAndWaitReady(distributor, ingester))
5151

5252
// Wait until the distributor has updated the ring.
@@ -63,7 +63,7 @@ func TestQuerierRemoteRead(t *testing.T) {
6363
require.NoError(t, err)
6464
require.Equal(t, 200, res.StatusCode)
6565

66-
querier := e2ecortex.NewQuerier("querier", consul.NetworkHTTPEndpoint(), ChunksStorageFlags(), "")
66+
querier := e2ecortex.NewQuerier("querier", e2ecortex.RingStoreConsul, consul.NetworkHTTPEndpoint(), ChunksStorageFlags(), "")
6767
require.NoError(t, s.StartAndWaitReady(querier))
6868

6969
// Wait until the querier has updated the ring.

integration/querier_sharding_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -98,10 +98,10 @@ func runQuerierShardingTest(t *testing.T, cfg querierShardingTestConfig) {
9898
}
9999

100100
// Start all other services.
101-
ingester := e2ecortex.NewIngester("ingester", consul.NetworkHTTPEndpoint(), flags, "")
102-
distributor := e2ecortex.NewDistributor("distributor", consul.NetworkHTTPEndpoint(), flags, "")
103-
querier1 := e2ecortex.NewQuerier("querier-1", consul.NetworkHTTPEndpoint(), flags, "")
104-
querier2 := e2ecortex.NewQuerier("querier-2", consul.NetworkHTTPEndpoint(), flags, "")
101+
ingester := e2ecortex.NewIngester("ingester", e2ecortex.RingStoreConsul, consul.NetworkHTTPEndpoint(), flags, "")
102+
distributor := e2ecortex.NewDistributor("distributor", e2ecortex.RingStoreConsul, consul.NetworkHTTPEndpoint(), flags, "")
103+
querier1 := e2ecortex.NewQuerier("querier-1", e2ecortex.RingStoreConsul, consul.NetworkHTTPEndpoint(), flags, "")
104+
querier2 := e2ecortex.NewQuerier("querier-2", e2ecortex.RingStoreConsul, consul.NetworkHTTPEndpoint(), flags, "")
105105

106106
require.NoError(t, s.StartAndWaitReady(querier1, querier2, ingester, distributor))
107107
require.NoError(t, s.WaitReady(queryFrontend))

0 commit comments

Comments
 (0)