package feta import "fmt" import "os" import "time" import "net/http" import "github.com/rs/zerolog/log" import "github.com/gin-gonic/gin" import "github.com/dn365/gin-zerolog" type FetaAPIServer struct { feta *FetaProcess } func (self *FetaAPIServer) SetFeta(feta *FetaProcess) { self.feta = feta } func (a *FetaAPIServer) Serve() { if a.feta == nil { panic("must have feta app from which to serve stats") } s := a.getServer() err := s.ListenAndServe() if err != nil { log.Fatal().Msg("webserver failure: " + err.Error()) return } } func (a *FetaAPIServer) getRouter() *gin.Engine { if os.Getenv("DEBUG") == "" { gin.SetMode(gin.ReleaseMode) } // empty router r := gin.New() // wrap panics: r.Use(gin.Recovery()) // attach logger middleware r.Use(ginzerolog.Logger("gin")) r.GET("/.well-known/healthcheck.json", gin.WrapF(a.getHealthCheckHandler())) r.GET("/", func(c *gin.Context) { c.Redirect(http.StatusMovedPermanently, "/feta") }) r.GET("/feta", gin.WrapF(a.getIndexHandler())) r.GET("/feta/list/instances", gin.WrapF(a.getInstanceListHandler())) return r } func (a *FetaAPIServer) getServer() *http.Server { r := a.getRouter() port := "8080" if os.Getenv("PORT") != "" { port = os.Getenv("PORT") } log.Info().Str("port", port).Msg("starting webserver") s := &http.Server{ Addr: fmt.Sprintf(":%s", port), Handler: r, ReadTimeout: 10 * time.Second, WriteTimeout: 10 * time.Second, MaxHeaderBytes: 1 << 20, } return s }