2024-08-22 14:24:02 +05:30
|
|
|
package server
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"context"
|
|
|
|
|
"fmt"
|
|
|
|
|
"net/http"
|
|
|
|
|
"time"
|
|
|
|
|
|
2025-03-20 21:01:41 +05:30
|
|
|
"github.com/SigNoz/signoz/pkg/factory"
|
2024-08-22 14:24:02 +05:30
|
|
|
"go.uber.org/zap"
|
|
|
|
|
)
|
|
|
|
|
|
2025-01-20 17:45:33 +05:30
|
|
|
var _ factory.Service = (*Server)(nil)
|
2024-08-22 14:24:02 +05:30
|
|
|
|
|
|
|
|
type Server struct {
|
|
|
|
|
srv *http.Server
|
|
|
|
|
logger *zap.Logger
|
|
|
|
|
handler http.Handler
|
|
|
|
|
cfg Config
|
|
|
|
|
}
|
|
|
|
|
|
2025-01-20 17:45:33 +05:30
|
|
|
func New(logger *zap.Logger, cfg Config, handler http.Handler) (*Server, error) {
|
2024-08-22 14:24:02 +05:30
|
|
|
if handler == nil {
|
|
|
|
|
return nil, fmt.Errorf("cannot build http server, handler is required")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if logger == nil {
|
|
|
|
|
return nil, fmt.Errorf("cannot build http server, logger is required")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
srv := &http.Server{
|
|
|
|
|
Addr: cfg.Address,
|
|
|
|
|
Handler: handler,
|
|
|
|
|
ReadTimeout: 10 * time.Second,
|
|
|
|
|
WriteTimeout: 10 * time.Second,
|
|
|
|
|
MaxHeaderBytes: 1 << 20,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return &Server{
|
|
|
|
|
srv: srv,
|
2025-03-24 19:30:14 +05:30
|
|
|
logger: logger.Named("go.signoz.io/pkg/http/server"),
|
2024-08-22 14:24:02 +05:30
|
|
|
handler: handler,
|
|
|
|
|
cfg: cfg,
|
|
|
|
|
}, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (server *Server) Start(ctx context.Context) error {
|
|
|
|
|
server.logger.Info("starting http server", zap.String("address", server.srv.Addr))
|
|
|
|
|
if err := server.srv.ListenAndServe(); err != nil {
|
|
|
|
|
if err != http.ErrServerClosed {
|
|
|
|
|
server.logger.Error("failed to start server", zap.Error(err), zap.Any("context", ctx))
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (server *Server) Stop(ctx context.Context) error {
|
|
|
|
|
ctx, cancel := context.WithTimeout(ctx, 5*time.Second)
|
|
|
|
|
defer cancel()
|
|
|
|
|
|
|
|
|
|
if err := server.srv.Shutdown(ctx); err != nil {
|
|
|
|
|
server.logger.Error("failed to stop server", zap.Error(err), zap.Any("context", ctx))
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
server.logger.Info("server stopped gracefully", zap.Any("context", ctx))
|
|
|
|
|
return nil
|
|
|
|
|
}
|