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  }