github.com/muhammadn/cortex@v1.9.1-0.20220510110439-46bb7000d03d/cmd/blocksconvert/main.go (about) 1 package main 2 3 import ( 4 "context" 5 "flag" 6 "fmt" 7 "os" 8 "strings" 9 10 "github.com/go-kit/log/level" 11 "github.com/grafana/dskit/services" 12 "github.com/prometheus/client_golang/prometheus" 13 "github.com/weaveworks/common/server" 14 "github.com/weaveworks/common/signals" 15 16 "github.com/cortexproject/cortex/pkg/cortex" 17 util_log "github.com/cortexproject/cortex/pkg/util/log" 18 "github.com/cortexproject/cortex/tools/blocksconvert" 19 "github.com/cortexproject/cortex/tools/blocksconvert/builder" 20 "github.com/cortexproject/cortex/tools/blocksconvert/cleaner" 21 "github.com/cortexproject/cortex/tools/blocksconvert/scanner" 22 "github.com/cortexproject/cortex/tools/blocksconvert/scheduler" 23 ) 24 25 type Config struct { 26 Target string 27 ServerConfig server.Config 28 29 SharedConfig blocksconvert.SharedConfig 30 ScannerConfig scanner.Config 31 BuilderConfig builder.Config 32 SchedulerConfig scheduler.Config 33 CleanerConfig cleaner.Config 34 } 35 36 func main() { 37 cfg := Config{} 38 flag.StringVar(&cfg.Target, "target", "", "Module to run: Scanner, Scheduler, Builder") 39 cfg.SharedConfig.RegisterFlags(flag.CommandLine) 40 cfg.ScannerConfig.RegisterFlags(flag.CommandLine) 41 cfg.BuilderConfig.RegisterFlags(flag.CommandLine) 42 cfg.SchedulerConfig.RegisterFlags(flag.CommandLine) 43 cfg.CleanerConfig.RegisterFlags(flag.CommandLine) 44 cfg.ServerConfig.RegisterFlags(flag.CommandLine) 45 flag.Parse() 46 47 util_log.InitLogger(&cfg.ServerConfig) 48 49 cortex.DisableSignalHandling(&cfg.ServerConfig) 50 serv, err := server.New(cfg.ServerConfig) 51 if err != nil { 52 level.Error(util_log.Logger).Log("msg", "Unable to initialize server", "err", err.Error()) 53 os.Exit(1) 54 } 55 56 cfg.Target = strings.ToLower(cfg.Target) 57 58 registry := prometheus.DefaultRegisterer 59 60 var targetService services.Service 61 switch cfg.Target { 62 case "scanner": 63 targetService, err = scanner.NewScanner(cfg.ScannerConfig, cfg.SharedConfig, util_log.Logger, registry) 64 case "builder": 65 targetService, err = builder.NewBuilder(cfg.BuilderConfig, cfg.SharedConfig, util_log.Logger, registry) 66 case "scheduler": 67 targetService, err = scheduler.NewScheduler(cfg.SchedulerConfig, cfg.SharedConfig, util_log.Logger, registry, serv.HTTP, serv.GRPC) 68 case "cleaner": 69 targetService, err = cleaner.NewCleaner(cfg.CleanerConfig, cfg.SharedConfig, util_log.Logger, registry) 70 default: 71 err = fmt.Errorf("unknown target") 72 } 73 74 if err != nil { 75 level.Error(util_log.Logger).Log("msg", "failed to initialize", "err", err) 76 os.Exit(1) 77 } 78 79 servService := cortex.NewServerService(serv, func() []services.Service { 80 return []services.Service{targetService} 81 }) 82 servManager, err := services.NewManager(servService, targetService) 83 if err == nil { 84 servManager.AddListener(services.NewManagerListener(nil, nil, func(service services.Service) { 85 servManager.StopAsync() 86 })) 87 88 err = services.StartManagerAndAwaitHealthy(context.Background(), servManager) 89 } 90 if err != nil { 91 level.Error(util_log.Logger).Log("msg", "Unable to start", "err", err.Error()) 92 os.Exit(1) 93 } 94 95 // Setup signal handler and ask service maanger to stop when signal arrives. 96 handler := signals.NewHandler(serv.Log) 97 go func() { 98 handler.Loop() 99 servManager.StopAsync() 100 }() 101 102 // We only wait for target service. If any other service fails, listener will stop it (via manager) 103 if err := targetService.AwaitTerminated(context.Background()); err != nil { 104 level.Error(util_log.Logger).Log("msg", cfg.Target+" failed", "err", targetService.FailureCase()) 105 os.Exit(1) 106 } 107 }