(t *testing.T, cfg queryFrontendTestConfig)
| 268 | } |
| 269 | |
| 270 | func runQueryFrontendTest(t *testing.T, cfg queryFrontendTestConfig) { |
| 271 | const numUsers = 10 |
| 272 | const numQueriesPerUser = 10 |
| 273 | |
| 274 | s, err := e2e.NewScenario(networkName) |
| 275 | require.NoError(t, err) |
| 276 | defer s.Close() |
| 277 | |
| 278 | memcached := e2ecache.NewMemcached() |
| 279 | consul := e2edb.NewConsul() |
| 280 | require.NoError(t, s.StartAndWaitReady(consul, memcached)) |
| 281 | |
| 282 | configFile, flags := cfg.setup(t, s) |
| 283 | |
| 284 | flags = mergeFlags(flags, map[string]string{ |
| 285 | "-querier.cache-results": "true", |
| 286 | "-querier.split-queries-by-interval": "24h", |
| 287 | "-querier.query-ingesters-within": "12h", // Required by the test on query /series out of ingesters time range |
| 288 | "-frontend.memcached.addresses": "dns+" + memcached.NetworkEndpoint(e2ecache.MemcachedPort), |
| 289 | "-frontend.query-stats-enabled": "true", // Always enable query stats to capture regressions |
| 290 | }) |
| 291 | |
| 292 | // Start the query-scheduler if enabled. |
| 293 | var queryScheduler *e2ecortex.CortexService |
| 294 | if cfg.querySchedulerEnabled { |
| 295 | queryScheduler = e2ecortex.NewQueryScheduler("query-scheduler", flags, "") |
| 296 | require.NoError(t, s.StartAndWaitReady(queryScheduler)) |
| 297 | flags["-frontend.scheduler-address"] = queryScheduler.NetworkGRPCEndpoint() |
| 298 | flags["-querier.scheduler-address"] = queryScheduler.NetworkGRPCEndpoint() |
| 299 | } |
| 300 | |
| 301 | // Start the query-frontend. |
| 302 | queryFrontend := e2ecortex.NewQueryFrontendWithConfigFile("query-frontend", configFile, flags, "") |
| 303 | require.NoError(t, s.Start(queryFrontend)) |
| 304 | |
| 305 | if !cfg.querySchedulerEnabled { |
| 306 | flags["-querier.frontend-address"] = queryFrontend.NetworkGRPCEndpoint() |
| 307 | } |
| 308 | |
| 309 | // Start all other services. |
| 310 | ingester := e2ecortex.NewIngesterWithConfigFile("ingester", e2ecortex.RingStoreConsul, consul.NetworkHTTPEndpoint(), configFile, flags, "") |
| 311 | distributor := e2ecortex.NewDistributorWithConfigFile("distributor", e2ecortex.RingStoreConsul, consul.NetworkHTTPEndpoint(), configFile, flags, "") |
| 312 | |
| 313 | querier := e2ecortex.NewQuerierWithConfigFile("querier", e2ecortex.RingStoreConsul, consul.NetworkHTTPEndpoint(), configFile, flags, "") |
| 314 | |
| 315 | require.NoError(t, s.StartAndWaitReady(querier, ingester, distributor)) |
| 316 | require.NoError(t, s.WaitReady(queryFrontend)) |
| 317 | |
| 318 | // Check if we're discovering memcache or not. |
| 319 | require.NoError(t, queryFrontend.WaitSumMetrics(e2e.Equals(1), "cortex_memcache_client_servers")) |
| 320 | require.NoError(t, queryFrontend.WaitSumMetrics(e2e.Greater(0), "cortex_dns_lookups_total")) |
| 321 | |
| 322 | // Wait until both the distributor and querier have updated the ring. |
| 323 | require.NoError(t, distributor.WaitSumMetrics(e2e.Equals(512), "cortex_ring_tokens_total")) |
| 324 | require.NoError(t, querier.WaitSumMetrics(e2e.Equals(512), "cortex_ring_tokens_total")) |
| 325 | |
| 326 | // Push a series for each user to Cortex. |
| 327 | now := time.Now() |
no test coverage detected