Files
sxchnge/backend/product/app/process/internal/server.go

67 lines
1.8 KiB
Go

package serverimp
import (
"flag"
"fmt"
"os"
"os/signal"
"syscall"
"git.sendico.io/tech/sxchnge/product/app/process"
"git.sendico.io/tech/sxchnge/shared/logging"
lf "git.sendico.io/tech/sxchnge/shared/logging/factory"
"git.sendico.io/tech/sxchnge/shared/version"
"github.com/google/uuid"
"go.uber.org/zap"
)
var (
configFileFlag = flag.String("config.file", "config.yml", "Path to the configuration file.")
versionFlag = flag.Bool("version", false, "Show version information.")
debugFlag = flag.Bool("debug", false, "Show debug information.")
)
func prepareLogger() mlogger.Logger {
flag.Parse()
return lf.NewLogger(*debugFlag)
}
func RunServer(rootLoggerName string, av version.Printer, factory server.ServerFactoryT) error {
logger := mlogger.Named(prepareLogger(), rootLoggerName)
logger = logger.With(zap.String("instance_id", uuid.NewString()))
defer func() {
_ = logger.Sync()
}()
// Show version information
if *versionFlag {
if _, err := fmt.Fprintln(os.Stdout, av.Print()); err != nil {
logger.Warn("Failed to print version", zap.Error(err))
}
return nil
}
// Create server instance
instance := NewInstance(factory, logger, *configFileFlag, *debugFlag)
// Interrupt handler
go func() {
c := make(chan os.Signal, 1)
signal.Notify(c, syscall.SIGINT, syscall.SIGTERM)
sig := <-c
logger.Info("Received sigint/segterm signal, shutting down", zap.String("signal", sig.String()))
instance.Shutdown()
}()
// Start server
logger.Info(fmt.Sprintf("Starting %s", av.Program()), zap.String("version", av.Info()))
logger.Info("Build context", zap.String("context", av.Context()))
if err := instance.Start(); err != nil {
logger.Error("Failed to start service", zap.Error(err))
return err
}
logger.Info("Server stopped")
return nil
}