15
"go.avito.ru/DO/moira"
16
"go.avito.ru/DO/moira/api/handler"
17
"go.avito.ru/DO/moira/cmd"
18
"go.avito.ru/DO/moira/database/neo4j"
19
"go.avito.ru/DO/moira/database/redis"
20
"go.avito.ru/DO/moira/logging"
21
"go.avito.ru/DO/moira/metrics"
22
"go.avito.ru/DO/moira/panicwrap"
23
"go.avito.ru/DO/moira/sentry"
32
configFileName = flag.String("config", "/etc/moira/api.yml", "Path to configuration file")
33
printVersion = flag.Bool("version", false, "Print version and exit")
34
printDefaultConfigFlag = flag.Bool("default-config", false, "Print default config and exit")
39
MoiraVersion = "unknown"
45
rand.Seed(time.Now().UnixNano())
49
fmt.Println("Moira Api")
50
fmt.Println("Version:", MoiraVersion)
51
fmt.Println("Git Commit:", GitCommit)
52
fmt.Println("Go Version:", GoVersion)
56
config := getDefault()
57
if *printDefaultConfigFlag {
58
cmd.PrintConfig(config)
62
err := cmd.ReadConfig(*configFileName, &config)
64
_, _ = fmt.Fprintf(os.Stderr, "Can not read settings: %s\n", err.Error())
68
apiConfig := config.API.getSettings()
69
apiConfig.Netbox = config.Netbox.GetSettings()
71
if err = metrics.Init(config.Statsd.GetSettings(), apiConfig.LimitMetrics); err != nil {
72
_, _ = fmt.Fprintf(os.Stderr, "Can not configure metrics: %v\n", err)
76
if err = logging.Init(logging.ComponentApi, config.Rsyslog.GetSettings(), apiConfig.LimitLogger); err != nil {
77
_, _ = fmt.Fprintf(os.Stderr, "Can not configure log: %v\n", err)
81
if err = sentry.Init(apiConfig.Sentry, serviceName); err != nil {
82
_, _ = fmt.Fprintf(os.Stderr, "Can not configure sentry: %v\n", err)
85
panicwrap.Init(serviceName)
87
logger = logging.GetLogger("")
88
defer logger.InfoF("Moira API Stopped. Version: %s", MoiraVersion)
90
configFileContent, err := moira.GetFileContent(config.API.WebConfigPath)
92
logger.WarnF("Failed to read web config file by path '%s', method 'api/config' will be return 404, error: %s'", config.API.WebConfigPath, err.Error())
95
if config.Pprof.Listen != "" {
96
logger.InfoF("Starting pprof server at: [%s]", config.Pprof.Listen)
97
cmd.StartProfiling(logger, config.Pprof)
100
if config.Liveness.Listen != "" {
101
logger.InfoF("Starting liveness server at: [%s]", config.Liveness.Listen)
102
cmd.StartLiveness(logger, config.Liveness)
105
databaseSettings := config.Redis.GetSettings()
106
database := redis.NewDatabase(logger, databaseSettings)
108
neo4jDb, err := neo4j.NewDatabase(logger, config.Neo4j)
110
logger.FatalF("Can not configure Neo4j: %s\n", err.Error())
113
listener, err := net.Listen("tcp", apiConfig.Listen)
115
logger.Fatal(err.Error())
118
logger.InfoF("Start listening by address: [%s]", apiConfig.Listen)
120
httpHandler := handler.NewHandler(database, neo4jDb, logger, apiConfig, []byte(configFileContent), MoiraVersion)
121
server := &http.Server{
122
Handler: httpHandler,
126
_ = server.Serve(listener)
128
defer Stop(logger, server)
130
logger.InfoF("Moira Api Started (version: %s)", MoiraVersion)
131
ch := make(chan os.Signal, 1)
132
signal.Notify(ch, syscall.SIGINT, syscall.SIGTERM)
133
logger.Info(fmt.Sprint(<-ch))
134
logger.Info("Moira API shutting down.")
138
func Stop(logger moira.Logger, server *http.Server) {
139
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
141
if err := server.Shutdown(ctx); err != nil {
142
logger.ErrorF("Can't stop Moira API correctly: %v", err)
144
logger.InfoF("Moira API Stopped. Version: %s", MoiraVersion)