feta/apiserver.go

73 lines
1.5 KiB
Go
Raw Normal View History

2019-11-05 02:53:11 +00:00
package feta
2019-11-02 06:56:17 +00:00
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"
2019-11-06 01:15:31 +00:00
type FetaAPIServer struct {
feta *FetaProcess
2019-11-02 06:56:17 +00:00
}
2019-11-06 01:15:31 +00:00
func (self *FetaAPIServer) SetFeta(feta *FetaProcess) {
self.feta = feta
2019-11-05 02:57:48 +00:00
}
2019-11-06 01:15:31 +00:00
func (a *FetaAPIServer) Serve() {
if a.feta == nil {
panic("must have feta app from which to serve stats")
2019-11-02 06:56:17 +00:00
}
s := a.getServer()
err := s.ListenAndServe()
if err != nil {
log.Fatal().Msg("webserver failure: " + err.Error())
return
}
}
2019-11-06 01:15:31 +00:00
func (a *FetaAPIServer) getRouter() *gin.Engine {
2019-11-02 06:56:17 +00:00
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"))
2019-11-05 23:32:09 +00:00
r.GET("/.well-known/healthcheck.json", gin.WrapF(a.getHealthCheckHandler()))
2019-11-06 07:03:42 +00:00
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()))
2019-11-02 06:56:17 +00:00
return r
}
2019-11-06 01:15:31 +00:00
func (a *FetaAPIServer) getServer() *http.Server {
2019-11-02 06:56:17 +00:00
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
}