Skip to content

Commit

Permalink
Log shutdown gracefully (#428)
Browse files Browse the repository at this point in the history
Log graceful shutdown at info level only

Signed-off-by: mjip <[email protected]>
  • Loading branch information
mjip authored Oct 7, 2021
1 parent 079d8d8 commit 92c8d1e
Showing 1 changed file with 19 additions and 11 deletions.
30 changes: 19 additions & 11 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
package main

import (
"context"
"fmt"
"net"
"net/http"
Expand All @@ -25,7 +26,6 @@ import (
"path/filepath"
"strings"
"syscall"
"time"

"github.com/go-kit/log"
"github.com/go-kit/log/level"
Expand Down Expand Up @@ -194,13 +194,21 @@ func main() {

mux.Handle(apiPath+"/v1/", http.StripPrefix(apiPath+"/v1", av1))

go closeListenerOnQuit(l, quitCh, logger)
err = web.Serve(l, &http.Server{Addr: *listenAddress, Handler: mux}, *webConfig, logger)
level.Error(logger).Log("msg", "HTTP server stopped", "err", err)
// To give running connections a chance to submit their payload, we wait
// for 1sec, but we don't want to wait long (e.g. until all connections
// are done) to not delay the shutdown.
time.Sleep(time.Second)
server := &http.Server{
Addr: *listenAddress,
Handler: mux,
}

go shutdownServerOnQuit(server, quitCh, logger)
err = web.Serve(l, server, *webConfig, logger)

// In the case of a graceful shutdown, do not log the error.
if err == http.ErrServerClosed {
level.Info(logger).Log("msg", "HTTP server stopped")
} else {
level.Error(logger).Log("msg", "HTTP server stopped", "err", err)
}

if err := ms.Shutdown(); err != nil {
level.Error(logger).Log("msg", "problem shutting down metric storage", "err", err)
}
Expand Down Expand Up @@ -240,9 +248,9 @@ func computeRoutePrefix(prefix string, externalURL *url.URL) string {
return prefix
}

// closeListenerOnQuite closes the provided listener upon closing the provided
// shutdownServerOnQuit shutdowns the provided server upon closing the provided
// quitCh or upon receiving a SIGINT or SIGTERM.
func closeListenerOnQuit(l net.Listener, quitCh <-chan struct{}, logger log.Logger) {
func shutdownServerOnQuit(server *http.Server, quitCh <-chan struct{}, logger log.Logger) error {
notifier := make(chan os.Signal, 1)
signal.Notify(notifier, os.Interrupt, syscall.SIGTERM)

Expand All @@ -254,5 +262,5 @@ func closeListenerOnQuit(l net.Listener, quitCh <-chan struct{}, logger log.Logg
level.Warn(logger).Log("msg", "received termination request via web service, exiting gracefully...")
break
}
l.Close()
return server.Shutdown(context.Background())
}

0 comments on commit 92c8d1e

Please sign in to comment.