gitlab.com/picnic-app/backend/role-api@v0.0.0-20230614140944-06a76ff3696d/cmd/main.go (about) 1 package main 2 3 import ( 4 "context" 5 "log" 6 "os" 7 "syscall" 8 "time" 9 10 "gitlab.com/picnic-app/backend/libs/golang/config" 11 "gitlab.com/picnic-app/backend/libs/golang/core" 12 "gitlab.com/picnic-app/backend/libs/golang/core/mw" 13 "gitlab.com/picnic-app/backend/libs/golang/graceful" 14 "gitlab.com/picnic-app/backend/libs/golang/logger" 15 "gitlab.com/picnic-app/backend/libs/golang/monitoring/monitoring" 16 "gitlab.com/picnic-app/backend/libs/golang/monitoring/tracing" 17 "gitlab.com/picnic-app/backend/role-api/internal/controller" 18 "gitlab.com/picnic-app/backend/role-api/internal/repo/spanner" 19 "gitlab.com/picnic-app/backend/role-api/internal/service" 20 ) 21 22 func main() { 23 ctx, cancel := context.WithCancel(context.Background()) 24 defer cancel() 25 26 err := config.Load(ctx) 27 if err != nil { 28 logger.Fatal(ctx, err) 29 } 30 31 logger.InitWithString(config.LogLevel()) 32 33 err = tracing.SetupExporter(ctx) 34 if err != nil { 35 logger.Errorf(ctx, "failed to set up tracing exporter: %v", err) 36 } 37 38 monitoring.RegisterPrometheusSuffix() 39 40 app, err := core.InitApp(ctx) 41 if err != nil { 42 log.Fatal(err) 43 } 44 app.WithMW(mw.NewServerContextInterceptor(config.String("env.auth.secret"))) 45 46 debugSrv, err := app.RunDebug(ctx) 47 if err != nil { 48 logger.Fatalf(ctx, "failed to start debug server: %v", err) 49 } 50 51 ctrl, cleanup, err := initController(ctx, app.Config()) 52 if err != nil { 53 logger.Fatalf(ctx, "failed to init controller: %v", err) 54 } 55 defer cleanup() 56 57 gracefulShutdown := graceful.New( 58 &graceful.ShutdownManagerOptions{Timeout: 60 * time.Second}, 59 graceful.Parallel( 60 &graceful.ParallelShutdownOptions{ 61 Name: "servers", 62 Timeout: 30 * time.Second, 63 }, 64 graceful.ShutdownErrorFunc(func() error { 65 app.Close() 66 return nil 67 }), 68 graceful.HTTPServer(debugSrv), 69 ), 70 graceful.Context(cancel), 71 graceful.Parallel( 72 &graceful.ParallelShutdownOptions{ 73 Name: "clients", 74 Timeout: 30 * time.Second, 75 }, 76 graceful.ShutdownErrorFunc(func() error { 77 cleanup() 78 return nil 79 }), 80 graceful.Tracer(), 81 ), 82 graceful.Logger(nil), 83 ) 84 gracefulShutdown.RegisterSignals(os.Interrupt, syscall.SIGTERM) 85 defer func() { 86 _ = gracefulShutdown.Shutdown(context.Background()) 87 }() 88 89 err = app.Run(ctx, ctrl) 90 if err != nil { 91 logger.Fatal(ctx, err) 92 } 93 94 logger.Info(ctx, "gRPC server closed gracefully") 95 } 96 97 func initController(ctx context.Context, cfg config.Config) (controller.Controller, func(), error) { 98 repo, err := spanner.NewRepo(ctx, cfg.Spanner) 99 if err != nil { 100 return controller.Controller{}, nil, err 101 } 102 103 svc := service.New(repo) 104 105 return controller.New(svc), func() { 106 repo.Close() 107 }, nil 108 }