Run starts Cortex running, and blocks until a Cortex stops.
()
| 428 | |
| 429 | // Run starts Cortex running, and blocks until a Cortex stops. |
| 430 | func (t *Cortex) Run() error { |
| 431 | // Register custom process metrics. |
| 432 | if c, err := process.NewProcessCollector(); err == nil { |
| 433 | prometheus.MustRegister(c) |
| 434 | } else { |
| 435 | level.Warn(util_log.Logger).Log("msg", "skipped registration of custom process metrics collector", "err", err) |
| 436 | } |
| 437 | |
| 438 | for _, module := range t.Cfg.Target { |
| 439 | if !t.ModuleManager.IsUserVisibleModule(module) { |
| 440 | level.Warn(util_log.Logger).Log("msg", "selected target is an internal module, is this intended?", "target", module) |
| 441 | } |
| 442 | } |
| 443 | |
| 444 | var err error |
| 445 | t.ServiceMap, err = t.ModuleManager.InitModuleServices(t.Cfg.Target...) |
| 446 | if err != nil { |
| 447 | return err |
| 448 | } |
| 449 | |
| 450 | t.API.RegisterServiceMapHandler(http.HandlerFunc(t.servicesHandler)) |
| 451 | |
| 452 | // get all services, create service manager and tell it to start |
| 453 | servs := []services.Service(nil) |
| 454 | for _, s := range t.ServiceMap { |
| 455 | servs = append(servs, s) |
| 456 | } |
| 457 | |
| 458 | sm, err := services.NewManager(servs...) |
| 459 | if err != nil { |
| 460 | return err |
| 461 | } |
| 462 | |
| 463 | // before starting servers, register /ready handler and gRPC health check service. |
| 464 | // It should reflect entire Cortex. |
| 465 | t.Server.HTTP.Path("/ready").Handler(t.readyHandler(sm)) |
| 466 | grpc_health_v1.RegisterHealthServer(t.Server.GRPC, grpcutil.NewHealthCheck(sm)) |
| 467 | |
| 468 | // Let's listen for events from this manager, and log them. |
| 469 | healthy := func() { level.Info(util_log.Logger).Log("msg", "Cortex started") } |
| 470 | stopped := func() { level.Info(util_log.Logger).Log("msg", "Cortex stopped") } |
| 471 | serviceFailed := func(service services.Service) { |
| 472 | // if any service fails, stop entire Cortex |
| 473 | sm.StopAsync() |
| 474 | |
| 475 | // let's find out which module failed |
| 476 | for m, s := range t.ServiceMap { |
| 477 | if s == service { |
| 478 | if service.FailureCase() == modules.ErrStopProcess { |
| 479 | level.Info(util_log.Logger).Log("msg", "received stop signal via return error", "module", m, "err", service.FailureCase()) |
| 480 | } else { |
| 481 | level.Error(util_log.Logger).Log("msg", "module failed", "module", m, "err", service.FailureCase()) |
| 482 | } |
| 483 | return |
| 484 | } |
| 485 | } |
| 486 | |
| 487 | level.Error(util_log.Logger).Log("msg", "module failed", "module", "unknown", "err", service.FailureCase()) |
nothing calls this directly
no test coverage detected