Files
janus/server/server.go

108 lines
2.4 KiB
Go
Raw Permalink Normal View History

2021-03-25 13:24:08 +05:30
package server
import (
"net"
"net/http"
2022-10-01 13:28:15 +05:30
"strings"
2021-03-25 13:24:08 +05:30
"sync"
"com.navi.medici.janus/lib"
"github.com/gorilla/mux"
2022-10-01 13:28:15 +05:30
"github.com/pkg/errors"
2022-03-31 16:24:32 +05:30
"github.com/prometheus/client_golang/prometheus/promhttp"
2022-10-01 13:28:15 +05:30
"github.com/rs/cors"
"go.uber.org/zap"
2021-03-25 13:24:08 +05:30
)
type Server struct {
HttpServer *http.Server
Listener net.Listener
wg sync.WaitGroup
logger *zap.Logger
2021-03-25 13:24:08 +05:30
}
var (
2022-10-01 13:28:15 +05:30
networkTCP = "tcp"
2021-03-25 13:24:08 +05:30
)
func NewServer(port string, corsList string, workerPool *lib.WorkerPool, logger *zap.Logger) (*Server, error) {
2021-03-25 13:24:08 +05:30
network := networkTCP
2022-10-01 13:28:15 +05:30
listener, err := net.Listen(network, ":"+port)
2021-03-25 13:24:08 +05:30
if err != nil {
return nil, errors.Wrap(err, "failed to create listener")
}
router := mux.NewRouter()
router.HandleFunc("/events/json", eventsHandlerJson(workerPool)).Methods("POST")
2021-03-31 10:14:54 +05:30
router.HandleFunc("/health", healthHandler).Methods("GET")
httpServer := &http.Server{
Addr: ":" + port,
Handler: enableCors(router, corsList),
}
newServer := &Server{
HttpServer: httpServer,
Listener: listener,
logger: logger,
}
2021-03-25 13:24:08 +05:30
return newServer, nil
2021-03-25 13:24:08 +05:30
}
2022-10-01 13:28:15 +05:30
func enableCors(handler http.Handler, corsList string) http.Handler {
corsArray := strings.Split(corsList, ",")
c := cors.New(cors.Options{
AllowedOrigins: corsArray,
AllowCredentials: false,
Debug: false,
2022-10-01 13:28:15 +05:30
})
return c.Handler(handler)
}
func MetricServer(port string, logger *zap.Logger) (*Server, error) {
network := networkTCP
listener, err := net.Listen(network, ":"+port)
if err != nil {
return nil, errors.Wrap(err, "failed to create listener for metric server")
}
router := mux.NewRouter()
router.Path("/metrics").Handler(promhttp.Handler())
httpServer := &http.Server{
Addr: ":" + port,
Handler: router,
}
mServer := &Server{
HttpServer: httpServer,
Listener: listener,
logger: logger,
}
return mServer, nil
}
func (s *Server) StartServer() {
s.wg.Add(1)
go func() {
defer s.wg.Done()
s.logger.Info("Starting server", zap.String("address", s.HttpServer.Addr))
if err := s.HttpServer.Serve(s.Listener); err != nil && err != http.ErrServerClosed {
s.logger.Fatal("Server error", zap.Error(err))
}
}()
}
func (s *Server) StopServer() {
s.logger.Info("Stopping server", zap.String("address", s.HttpServer.Addr))
if err := s.HttpServer.Close(); err != nil {
s.logger.Error("Error stopping server", zap.Error(err))
}
s.wg.Wait()
s.logger.Info("Server stopped", zap.String("address", s.HttpServer.Addr))
}