mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Merge branch 'http_graceful'
This commit is contained in:
commit
defa81e4c1
@ -25,6 +25,8 @@ type HttpServer struct {
|
|||||||
macaron *macaron.Macaron
|
macaron *macaron.Macaron
|
||||||
context context.Context
|
context context.Context
|
||||||
streamManager *live.StreamManager
|
streamManager *live.StreamManager
|
||||||
|
|
||||||
|
httpSrv *http.Server
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewHttpServer() *HttpServer {
|
func NewHttpServer() *HttpServer {
|
||||||
@ -46,11 +48,20 @@ func (hs *HttpServer) Start(ctx context.Context) error {
|
|||||||
listenAddr := fmt.Sprintf("%s:%s", setting.HttpAddr, setting.HttpPort)
|
listenAddr := fmt.Sprintf("%s:%s", setting.HttpAddr, setting.HttpPort)
|
||||||
hs.log.Info("Initializing HTTP Server", "address", listenAddr, "protocol", setting.Protocol, "subUrl", setting.AppSubUrl)
|
hs.log.Info("Initializing HTTP Server", "address", listenAddr, "protocol", setting.Protocol, "subUrl", setting.AppSubUrl)
|
||||||
|
|
||||||
|
hs.httpSrv = &http.Server{Addr: listenAddr, Handler: hs.macaron}
|
||||||
switch setting.Protocol {
|
switch setting.Protocol {
|
||||||
case setting.HTTP:
|
case setting.HTTP:
|
||||||
err = http.ListenAndServe(listenAddr, hs.macaron)
|
err = hs.httpSrv.ListenAndServe()
|
||||||
|
if err == http.ErrServerClosed {
|
||||||
|
hs.log.Debug("server was shutdown gracefully")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
case setting.HTTPS:
|
case setting.HTTPS:
|
||||||
err = hs.listenAndServeTLS(listenAddr, setting.CertFile, setting.KeyFile)
|
err = hs.httpSrv.ListenAndServeTLS(setting.CertFile, setting.KeyFile)
|
||||||
|
if err == http.ErrServerClosed {
|
||||||
|
hs.log.Debug("server was shutdown gracefully")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
hs.log.Error("Invalid protocol", "protocol", setting.Protocol)
|
hs.log.Error("Invalid protocol", "protocol", setting.Protocol)
|
||||||
err = errors.New("Invalid Protocol")
|
err = errors.New("Invalid Protocol")
|
||||||
@ -59,6 +70,12 @@ func (hs *HttpServer) Start(ctx context.Context) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (hs *HttpServer) Shutdown(ctx context.Context) error {
|
||||||
|
err := hs.httpSrv.Shutdown(ctx)
|
||||||
|
hs.log.Info("stopped http server")
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
func (hs *HttpServer) listenAndServeTLS(listenAddr, certfile, keyfile string) error {
|
func (hs *HttpServer) listenAndServeTLS(listenAddr, certfile, keyfile string) error {
|
||||||
if certfile == "" {
|
if certfile == "" {
|
||||||
return fmt.Errorf("cert_file cannot be empty when using HTTPS")
|
return fmt.Errorf("cert_file cannot be empty when using HTTPS")
|
||||||
|
@ -3,7 +3,6 @@ package main
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"os"
|
"os"
|
||||||
"time"
|
|
||||||
|
|
||||||
"golang.org/x/sync/errgroup"
|
"golang.org/x/sync/errgroup"
|
||||||
|
|
||||||
@ -39,6 +38,8 @@ type GrafanaServerImpl struct {
|
|||||||
shutdownFn context.CancelFunc
|
shutdownFn context.CancelFunc
|
||||||
childRoutines *errgroup.Group
|
childRoutines *errgroup.Group
|
||||||
log log.Logger
|
log log.Logger
|
||||||
|
|
||||||
|
httpServer *api.HttpServer
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g *GrafanaServerImpl) Start() {
|
func (g *GrafanaServerImpl) Start() {
|
||||||
@ -74,9 +75,9 @@ func (g *GrafanaServerImpl) Start() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (g *GrafanaServerImpl) startHttpServer() {
|
func (g *GrafanaServerImpl) startHttpServer() {
|
||||||
httpServer := api.NewHttpServer()
|
g.httpServer = api.NewHttpServer()
|
||||||
|
|
||||||
err := httpServer.Start(g.context)
|
err := g.httpServer.Start(g.context)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
g.log.Error("Fail to start server", "error", err)
|
g.log.Error("Fail to start server", "error", err)
|
||||||
@ -88,24 +89,15 @@ func (g *GrafanaServerImpl) startHttpServer() {
|
|||||||
func (g *GrafanaServerImpl) Shutdown(code int, reason string) {
|
func (g *GrafanaServerImpl) Shutdown(code int, reason string) {
|
||||||
g.log.Info("Shutdown started", "code", code, "reason", reason)
|
g.log.Info("Shutdown started", "code", code, "reason", reason)
|
||||||
|
|
||||||
|
err := g.httpServer.Shutdown(g.context)
|
||||||
|
if err != nil {
|
||||||
|
g.log.Error("Failed to shutdown server", "error", err)
|
||||||
|
}
|
||||||
|
|
||||||
g.shutdownFn()
|
g.shutdownFn()
|
||||||
err := g.childRoutines.Wait()
|
err = g.childRoutines.Wait()
|
||||||
|
|
||||||
g.log.Info("Shutdown completed", "reason", err)
|
g.log.Info("Shutdown completed", "reason", err)
|
||||||
log.Close()
|
log.Close()
|
||||||
os.Exit(code)
|
os.Exit(code)
|
||||||
}
|
}
|
||||||
|
|
||||||
// implement context.Context
|
|
||||||
func (g *GrafanaServerImpl) Deadline() (deadline time.Time, ok bool) {
|
|
||||||
return g.context.Deadline()
|
|
||||||
}
|
|
||||||
func (g *GrafanaServerImpl) Done() <-chan struct{} {
|
|
||||||
return g.context.Done()
|
|
||||||
}
|
|
||||||
func (g *GrafanaServerImpl) Err() error {
|
|
||||||
return g.context.Err()
|
|
||||||
}
|
|
||||||
func (g *GrafanaServerImpl) Value(key interface{}) interface{} {
|
|
||||||
return g.context.Value(key)
|
|
||||||
}
|
|
||||||
|
@ -1,10 +1,6 @@
|
|||||||
package models
|
package models
|
||||||
|
|
||||||
import "context"
|
|
||||||
|
|
||||||
type GrafanaServer interface {
|
type GrafanaServer interface {
|
||||||
context.Context
|
|
||||||
|
|
||||||
Start()
|
Start()
|
||||||
Shutdown(code int, reason string)
|
Shutdown(code int, reason string)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user