|
@@ -54,11 +54,12 @@ func NewGrafanaServer() *GrafanaServerImpl {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
type GrafanaServerImpl struct {
|
|
type GrafanaServerImpl struct {
|
|
|
- context context.Context
|
|
|
|
|
- shutdownFn context.CancelFunc
|
|
|
|
|
- childRoutines *errgroup.Group
|
|
|
|
|
- log log.Logger
|
|
|
|
|
- cfg *setting.Cfg
|
|
|
|
|
|
|
+ context context.Context
|
|
|
|
|
+ shutdownFn context.CancelFunc
|
|
|
|
|
+ childRoutines *errgroup.Group
|
|
|
|
|
+ log log.Logger
|
|
|
|
|
+ cfg *setting.Cfg
|
|
|
|
|
+ shutdownReason string
|
|
|
|
|
|
|
|
RouteRegister api.RouteRegister `inject:""`
|
|
RouteRegister api.RouteRegister `inject:""`
|
|
|
HttpServer *api.HTTPServer `inject:""`
|
|
HttpServer *api.HTTPServer `inject:""`
|
|
@@ -135,7 +136,8 @@ func (g *GrafanaServerImpl) Start() error {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
sendSystemdNotification("READY=1")
|
|
sendSystemdNotification("READY=1")
|
|
|
- return g.startHttpServer()
|
|
|
|
|
|
|
+
|
|
|
|
|
+ return g.childRoutines.Wait()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
func (g *GrafanaServerImpl) loadConfiguration() {
|
|
func (g *GrafanaServerImpl) loadConfiguration() {
|
|
@@ -154,28 +156,28 @@ func (g *GrafanaServerImpl) loadConfiguration() {
|
|
|
g.cfg.LogConfigSources()
|
|
g.cfg.LogConfigSources()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-func (g *GrafanaServerImpl) startHttpServer() error {
|
|
|
|
|
- g.HttpServer.Init()
|
|
|
|
|
-
|
|
|
|
|
- err := g.HttpServer.Start(g.context)
|
|
|
|
|
-
|
|
|
|
|
- if err != nil {
|
|
|
|
|
- return fmt.Errorf("Fail to start server. error: %v", err)
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- return nil
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-func (g *GrafanaServerImpl) Shutdown(code int, reason string) {
|
|
|
|
|
- g.log.Info("Shutdown started", "code", code, "reason", reason)
|
|
|
|
|
|
|
+func (g *GrafanaServerImpl) Shutdown(reason string) {
|
|
|
|
|
+ g.log.Info("Shutdown started", "reason", reason)
|
|
|
|
|
+ g.shutdownReason = reason
|
|
|
|
|
|
|
|
// call cancel func on root context
|
|
// call cancel func on root context
|
|
|
g.shutdownFn()
|
|
g.shutdownFn()
|
|
|
|
|
|
|
|
// wait for child routines
|
|
// wait for child routines
|
|
|
- if err := g.childRoutines.Wait(); err != nil && err != context.Canceled {
|
|
|
|
|
- g.log.Error("Server shutdown completed", "error", err)
|
|
|
|
|
|
|
+ g.childRoutines.Wait()
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+func (g *GrafanaServerImpl) Exit(reason error) {
|
|
|
|
|
+ // default exit code is 1
|
|
|
|
|
+ code := 1
|
|
|
|
|
+
|
|
|
|
|
+ if reason == context.Canceled && g.shutdownReason != "" {
|
|
|
|
|
+ reason = fmt.Errorf(g.shutdownReason)
|
|
|
|
|
+ code = 0
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ g.log.Error("Server shutdown", "reason", reason)
|
|
|
|
|
+ os.Exit(code)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
func (g *GrafanaServerImpl) writePIDFile() {
|
|
func (g *GrafanaServerImpl) writePIDFile() {
|