mirror of
https://git.mirrors.martin98.com/https://github.com/SigNoz/signoz
synced 2025-06-04 11:25:52 +08:00
70 lines
1.6 KiB
Go
70 lines
1.6 KiB
Go
package server
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"net/http"
|
|
"time"
|
|
|
|
"github.com/SigNoz/signoz/pkg/factory"
|
|
"go.uber.org/zap"
|
|
)
|
|
|
|
var _ factory.Service = (*Server)(nil)
|
|
|
|
type Server struct {
|
|
srv *http.Server
|
|
logger *zap.Logger
|
|
handler http.Handler
|
|
cfg Config
|
|
}
|
|
|
|
func New(logger *zap.Logger, cfg Config, handler http.Handler) (*Server, error) {
|
|
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,
|
|
logger: logger.Named("go.signoz.io/pkg/http/server"),
|
|
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
|
|
}
|