From 270cc77d312755367a1eac750c99dc4193ac49fe Mon Sep 17 00:00:00 2001 From: nquidox Date: Fri, 24 Apr 2026 12:57:00 +0300 Subject: [PATCH] metrics server added --- config/config.go | 17 +++++++++-- internal/app/handler.go | 23 +++++++++++++-- mandarake.env | 6 ++++ pkg/router/handler.go | 62 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 104 insertions(+), 4 deletions(-) create mode 100644 pkg/router/handler.go diff --git a/config/config.go b/config/config.go index 0825aa3..994bb61 100644 --- a/config/config.go +++ b/config/config.go @@ -3,8 +3,9 @@ package config import "runtime" type Config struct { - App AppConfig - Rabbit RabbitMQConfig + App AppConfig + Rabbit RabbitMQConfig + Metrics MetricsConfig } type AppConfig struct { @@ -27,6 +28,12 @@ type RabbitMQConfig struct { TaskResultQueue string } +type MetricsConfig struct { + Host string + Port string + GinMode string +} + func New() *Config { return &Config{ App: AppConfig{ @@ -48,5 +55,11 @@ func New() *Config { TaskSourceQueue: getEnv("TASK_SOURCE_QUEUE", "task-publisher-mandarake"), TaskResultQueue: getEnv("TASK_RESULT_QUEUE", "tasks-results"), }, + + Metrics: MetricsConfig{ + Host: getEnv("METRICS_HOST", "0.0.0.0"), + Port: getEnv("METRICS_PORT", "19080"), + GinMode: getEnv("METRICS_GIN_MODE", "dev"), + }, } } diff --git a/internal/app/handler.go b/internal/app/handler.go index b7b56f0..09dc91f 100644 --- a/internal/app/handler.go +++ b/internal/app/handler.go @@ -3,17 +3,20 @@ package app import ( "context" log "github.com/sirupsen/logrus" + "net" "scrapper-mandarake/config" "scrapper-mandarake/internal/scrapper" "scrapper-mandarake/internal/tasks" + "scrapper-mandarake/pkg/router" "time" ) const AppName string = "Mandarake parser" type App struct { - transport tasks.TaskTransport - scrapper scrapper.PriceScrapper + transport tasks.TaskTransport + scrapper scrapper.PriceScrapper + metricsSrv *router.Handler } func NewApp(cfg *config.Config) *App { @@ -37,6 +40,11 @@ func NewApp(cfg *config.Config) *App { TaskTimeout: cfg.App.TaskTimeoutSeconds, }) + a.metricsSrv = router.NewHandler(router.Deps{ + Addr: net.JoinHostPort(cfg.Metrics.Host, cfg.Metrics.Port), + GinMode: cfg.Metrics.GinMode, + }) + log.Infof("%v: %v", AppName, cfg.App.Mode) return &a } @@ -52,6 +60,13 @@ func (app *App) Run(ctx context.Context) error { return err } + //start metrics server + go func() { + if err := app.metricsSrv.Run(); err != nil { + log.Fatal(err) + } + }() + <-ctx.Done() return app.Shutdown(ctx) } @@ -63,6 +78,10 @@ func (app *App) Shutdown(ctx context.Context) error { app.scrapper.Stop() + if err := app.metricsSrv.Shutdown(ctx); err != nil { + log.WithError(err).Error("Failed to shutdown server") + } + _ = ctx return nil } diff --git a/mandarake.env b/mandarake.env index 111c8f6..8fc5ae4 100644 --- a/mandarake.env +++ b/mandarake.env @@ -14,3 +14,9 @@ RABBIT_LOGGING_ENABLED=false TASK_SOURCE_QUEUE=task-publisher-mandarake TASK_RESULT_QUEUE=tasks-results + + +METRICS_HOST=0.0.0.0 +METRICS_PORT=19080 +METRICS_GIN_MODE=release + diff --git a/pkg/router/handler.go b/pkg/router/handler.go new file mode 100644 index 0000000..0f924cc --- /dev/null +++ b/pkg/router/handler.go @@ -0,0 +1,62 @@ +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.New() + + 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 + } + } + + logGroup := engine.Group("") + logGroup.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) +}