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"
|
|
|
|
|
|
2024-08-23 15:24:00 +05:30
|
|
|
"com.navi.medici.janus/lib"
|
2021-03-30 16:03:09 +05:30
|
|
|
"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"
|
2024-08-23 15:24:00 +05:30
|
|
|
"go.uber.org/zap"
|
2021-03-25 13:24:08 +05:30
|
|
|
)
|
|
|
|
|
|
|
|
|
|
type Server struct {
|
|
|
|
|
HttpServer *http.Server
|
|
|
|
|
Listener net.Listener
|
|
|
|
|
wg sync.WaitGroup
|
2024-08-23 15:24:00 +05:30
|
|
|
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
|
|
|
)
|
|
|
|
|
|
2024-08-23 15:24:00 +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")
|
|
|
|
|
}
|
|
|
|
|
|
2021-03-30 16:03:09 +05:30
|
|
|
router := mux.NewRouter()
|
2024-08-23 15:24:00 +05:30
|
|
|
router.HandleFunc("/events/json", eventsHandlerJson(workerPool)).Methods("POST")
|
2021-03-31 10:14:54 +05:30
|
|
|
router.HandleFunc("/health", healthHandler).Methods("GET")
|
2021-03-30 16:03:09 +05:30
|
|
|
|
2024-08-23 15:24:00 +05:30
|
|
|
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
|
|
|
|
2024-08-23 15:24:00 +05:30
|
|
|
return newServer, nil
|
2021-03-25 13:24:08 +05:30
|
|
|
}
|
2022-06-22 19:26:24 +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,
|
2024-08-23 15:24:00 +05:30
|
|
|
Debug: false,
|
2022-10-01 13:28:15 +05:30
|
|
|
})
|
|
|
|
|
return c.Handler(handler)
|
|
|
|
|
}
|
2024-08-23 15:24:00 +05:30
|
|
|
|
|
|
|
|
func MetricServer(port string, logger *zap.Logger) (*Server, error) {
|
2022-06-22 19:26:24 +05:30
|
|
|
network := networkTCP
|
|
|
|
|
|
|
|
|
|
listener, err := net.Listen(network, ":"+port)
|
|
|
|
|
if err != nil {
|
2024-08-23 15:24:00 +05:30
|
|
|
return nil, errors.Wrap(err, "failed to create listener for metric server")
|
2022-06-22 19:26:24 +05:30
|
|
|
}
|
|
|
|
|
|
|
|
|
|
router := mux.NewRouter()
|
|
|
|
|
router.Path("/metrics").Handler(promhttp.Handler())
|
|
|
|
|
|
2024-08-23 15:24:00 +05:30
|
|
|
httpServer := &http.Server{
|
|
|
|
|
Addr: ":" + port,
|
|
|
|
|
Handler: router,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
mServer := &Server{
|
|
|
|
|
HttpServer: httpServer,
|
|
|
|
|
Listener: listener,
|
|
|
|
|
logger: logger,
|
|
|
|
|
}
|
|
|
|
|
|
2022-06-22 19:26:24 +05:30
|
|
|
return mServer, nil
|
|
|
|
|
}
|
2024-08-23 15:24:00 +05:30
|
|
|
|
|
|
|
|
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))
|
|
|
|
|
}
|