diff --git a/config.env b/config.env index 3937a61..7633de5 100644 --- a/config.env +++ b/config.env @@ -18,3 +18,7 @@ TASK_RETRY_MINUTES=5 ORIGIN_SURUGAYA_ENABLED=false ORIGIN_MANDARAKE_ENABLED=false ORIGIN_AMIAMI_ENABLED=false + +METRICS_HOST= +METRICS_PORT= +METRICS_GIN_MODE= diff --git a/config/config.go b/config/config.go index 8b5babe..b19ffe0 100644 --- a/config/config.go +++ b/config/config.go @@ -14,6 +14,7 @@ type Config struct { GrpcCfg GrpcConfig OriginEnabled OriginEnabled ExternalBrowser string + Metrics MetricsConfig } type GrpcConfig struct { @@ -36,6 +37,12 @@ type OriginEnabled struct { Amiami bool } +type MetricsConfig struct { + Host string + Port string + GinMode string +} + func NewConfig() *Config { return &Config{ LogLevel: getEnv("APP_LOG_LEVEL", "debug"), @@ -62,6 +69,12 @@ func NewConfig() *Config { Mandarake: getEnvBool("ORIGIN_MANDARAKE_ENABLED", false), Amiami: getEnvBool("ORIGIN_AMIAMI_ENABLED", false), }, + + Metrics: MetricsConfig{ + Host: getEnv("METRICS_HOST", "0.0.0.0"), + Port: getEnv("METRICS_PORT", "49060"), + GinMode: getEnv("METRICS_GIN_MODE", "dev"), + }, } } diff --git a/internal/app/app.go b/internal/app/app.go index 3fcc103..6353e7c 100644 --- a/internal/app/app.go +++ b/internal/app/app.go @@ -15,6 +15,7 @@ import ( "task-processor/internal/processor" "task-processor/internal/remote" "task-processor/internal/shared" + "task-processor/pkg/router" "time" ) @@ -59,6 +60,13 @@ func (app *App) Run() { "Number of CPUs": app.numCPUs, }).Debug("App settings") + //metrics + mSrv := router.NewHandler(router.Deps{ + Addr: net.JoinHostPort(app.config.Metrics.Host, app.config.Metrics.Port), + GinMode: app.config.Metrics.GinMode, + }) + + //main server := newServer(app) apiClient := newApiClient(app.config.GrpcCfg.ApiClientHost + ":" + app.config.GrpcCfg.ApiClientPort) @@ -133,6 +141,13 @@ func (app *App) Run() { } }() + //start metrics server + go func() { + if err := mSrv.Run(); err != nil { + log.WithError(err).Error("Metrics server run failed") + } + }() + //gRPC Server for status response go func() { listener, err := net.Listen("tcp", app.config.GrpcCfg.ServerHost+":"+app.config.GrpcCfg.ServerPort) @@ -155,6 +170,10 @@ func (app *App) Run() { period.Stop() server.GracefulStop() cancel() + if err := mSrv.Shutdown(ctx); err != nil { + log.WithError(err).Error("Failed to shutdown server") + } }() + <-ctx.Done() } diff --git a/pkg/router/handler.go b/pkg/router/handler.go new file mode 100644 index 0000000..ddd1b91 --- /dev/null +++ b/pkg/router/handler.go @@ -0,0 +1,61 @@ +package router + +import ( + "context" + "errors" + "github.com/gin-gonic/gin" + log "github.com/sirupsen/logrus" + ginprometheus "github.com/zsais/go-gin-prometheus" + "net/http" +) + +type Handler struct { + srv *http.Server +} + +type Deps struct { + Addr string + GinMode string +} + +const pkgLogHeader string = "Router |" + +func NewHandler(deps Deps) *Handler { + engine := gin.Default() + + if deps.GinMode == "release" { + gin.SetMode(gin.ReleaseMode) + err := engine.SetTrustedProxies([]string{"172.20.0.0/16"}) + if err != nil { + log.WithError(err).Errorf("%v Set proxies failed", pkgLogHeader) + return nil + } + } + + engine.GET("/", func(c *gin.Context) { c.JSON(200, gin.H{"msg": "v2"}) }) + + p := ginprometheus.NewPrometheus("gin") + p.Use(engine) + + srv := http.Server{ + Addr: deps.Addr, + Handler: engine, + } + + return &Handler{ + srv: &srv, + } +} + +func (h *Handler) Run() error { + log.Infof("Starting server on %s", h.srv.Addr) + if err := h.srv.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) { + log.WithError(err).Errorf("%v ListenAndServe failed", pkgLogHeader) + return err + } + return nil +} + +func (h *Handler) Shutdown(ctx context.Context) error { + return h.srv.Shutdown(ctx) +}