traefik/pkg/server/server.go

111 lines
2.3 KiB
Go
Raw Permalink Normal View History

package server
import (
2016-08-16 15:26:10 +00:00
"context"
2020-11-06 08:26:03 +00:00
"errors"
"os"
"os/signal"
"time"
2022-11-21 17:36:05 +00:00
"github.com/rs/zerolog/log"
2023-02-03 14:24:05 +00:00
"github.com/traefik/traefik/v3/pkg/metrics"
"github.com/traefik/traefik/v3/pkg/safe"
"github.com/traefik/traefik/v3/pkg/server/middleware"
)
2020-05-11 10:06:07 +00:00
// Server is the reverse-proxy/load-balancer engine.
type Server struct {
watcher *ConfigurationWatcher
tcpEntryPoints TCPEntryPoints
udpEntryPoints UDPEntryPoints
observabilityMgr *middleware.ObservabilityMgr
2019-06-27 22:16:04 +00:00
signals chan os.Signal
stopChan chan bool
2019-06-27 22:16:04 +00:00
routinesPool *safe.Pool
2018-11-14 09:18:03 +00:00
}
// NewServer returns an initialized Server.
func NewServer(routinesPool *safe.Pool, entryPoints TCPEntryPoints, entryPointsUDP UDPEntryPoints, watcher *ConfigurationWatcher, observabilityMgr *middleware.ObservabilityMgr) *Server {
srv := &Server{
watcher: watcher,
tcpEntryPoints: entryPoints,
observabilityMgr: observabilityMgr,
signals: make(chan os.Signal, 1),
stopChan: make(chan bool, 1),
routinesPool: routinesPool,
udpEntryPoints: entryPointsUDP,
2019-09-06 13:08:04 +00:00
}
srv.configureSignals()
2018-11-14 09:18:03 +00:00
return srv
}
2020-05-11 10:06:07 +00:00
// Start starts the server and Stop/Close it when context is Done.
func (s *Server) Start(ctx context.Context) {
go func() {
<-ctx.Done()
2022-11-21 17:36:05 +00:00
logger := log.Ctx(ctx)
logger.Info().Msg("I have to go...")
logger.Info().Msg("Stopping server gracefully")
s.Stop()
}()
s.tcpEntryPoints.Start()
s.udpEntryPoints.Start()
s.watcher.Start()
s.routinesPool.GoCtx(s.listenSignals)
}
// Wait blocks until the server shutdown.
2017-11-24 18:18:03 +00:00
func (s *Server) Wait() {
<-s.stopChan
}
2020-05-11 10:06:07 +00:00
// Stop stops the server.
2017-11-24 18:18:03 +00:00
func (s *Server) Stop() {
2022-11-21 17:36:05 +00:00
defer log.Info().Msg("Server stopped")
2018-11-14 09:18:03 +00:00
s.tcpEntryPoints.Stop()
s.udpEntryPoints.Stop()
2018-11-14 09:18:03 +00:00
2017-11-24 18:18:03 +00:00
s.stopChan <- true
}
2020-05-11 10:06:07 +00:00
// Close destroys the server.
2017-11-24 18:18:03 +00:00
func (s *Server) Close() {
2018-03-14 12:14:03 +00:00
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
go func(ctx context.Context) {
<-ctx.Done()
2020-11-06 08:26:03 +00:00
if errors.Is(ctx.Err(), context.Canceled) {
return
2020-11-06 08:26:03 +00:00
} else if errors.Is(ctx.Err(), context.DeadlineExceeded) {
2018-03-14 12:14:03 +00:00
panic("Timeout while stopping traefik, killing instance ✝")
}
}(ctx)
2018-11-14 09:18:03 +00:00
stopMetricsClients()
s.routinesPool.Stop()
2017-11-24 18:18:03 +00:00
signal.Stop(s.signals)
close(s.signals)
2018-11-14 09:18:03 +00:00
close(s.stopChan)
2018-11-14 09:18:03 +00:00
s.observabilityMgr.Close()
2024-01-08 08:10:06 +00:00
cancel()
}
func stopMetricsClients() {
metrics.StopDatadog()
metrics.StopStatsd()
2022-02-09 14:32:12 +00:00
metrics.StopInfluxDB2()
metrics.StopOpenTelemetry()
}