prometheus metrics server
All checks were successful
/ Make image (push) Successful in 49s

This commit is contained in:
nquidox 2026-02-17 12:19:47 +03:00
parent 1a90f1e605
commit 4665c90c2c
4 changed files with 97 additions and 0 deletions

View file

@ -18,3 +18,7 @@ TASK_RETRY_MINUTES=5
ORIGIN_SURUGAYA_ENABLED=false ORIGIN_SURUGAYA_ENABLED=false
ORIGIN_MANDARAKE_ENABLED=false ORIGIN_MANDARAKE_ENABLED=false
ORIGIN_AMIAMI_ENABLED=false ORIGIN_AMIAMI_ENABLED=false
METRICS_HOST=
METRICS_PORT=
METRICS_GIN_MODE=

View file

@ -14,6 +14,7 @@ type Config struct {
GrpcCfg GrpcConfig GrpcCfg GrpcConfig
OriginEnabled OriginEnabled OriginEnabled OriginEnabled
ExternalBrowser string ExternalBrowser string
Metrics MetricsConfig
} }
type GrpcConfig struct { type GrpcConfig struct {
@ -36,6 +37,12 @@ type OriginEnabled struct {
Amiami bool Amiami bool
} }
type MetricsConfig struct {
Host string
Port string
GinMode string
}
func NewConfig() *Config { func NewConfig() *Config {
return &Config{ return &Config{
LogLevel: getEnv("APP_LOG_LEVEL", "debug"), LogLevel: getEnv("APP_LOG_LEVEL", "debug"),
@ -62,6 +69,12 @@ func NewConfig() *Config {
Mandarake: getEnvBool("ORIGIN_MANDARAKE_ENABLED", false), Mandarake: getEnvBool("ORIGIN_MANDARAKE_ENABLED", false),
Amiami: getEnvBool("ORIGIN_AMIAMI_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"),
},
} }
} }

View file

@ -15,6 +15,7 @@ import (
"task-processor/internal/processor" "task-processor/internal/processor"
"task-processor/internal/remote" "task-processor/internal/remote"
"task-processor/internal/shared" "task-processor/internal/shared"
"task-processor/pkg/router"
"time" "time"
) )
@ -59,6 +60,13 @@ func (app *App) Run() {
"Number of CPUs": app.numCPUs, "Number of CPUs": app.numCPUs,
}).Debug("App settings") }).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) server := newServer(app)
apiClient := newApiClient(app.config.GrpcCfg.ApiClientHost + ":" + app.config.GrpcCfg.ApiClientPort) 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 //gRPC Server for status response
go func() { go func() {
listener, err := net.Listen("tcp", app.config.GrpcCfg.ServerHost+":"+app.config.GrpcCfg.ServerPort) listener, err := net.Listen("tcp", app.config.GrpcCfg.ServerHost+":"+app.config.GrpcCfg.ServerPort)
@ -155,6 +170,10 @@ func (app *App) Run() {
period.Stop() period.Stop()
server.GracefulStop() server.GracefulStop()
cancel() cancel()
if err := mSrv.Shutdown(ctx); err != nil {
log.WithError(err).Error("Failed to shutdown server")
}
}() }()
<-ctx.Done() <-ctx.Done()
} }

61
pkg/router/handler.go Normal file
View file

@ -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)
}