From 92c8d1e028bc6a102bb578e03ba19776bff379ed Mon Sep 17 00:00:00 2001
From: marie <marie.payne@hotmail.ca>
Date: Thu, 7 Oct 2021 06:10:11 -0400
Subject: [PATCH] Log shutdown gracefully (#428)

Log graceful shutdown at info level only

reference:
https://github.com/prometheus/pushgateway/commit/92c8d1e028bc6a102bb578e03ba19776bff379ed

Signed-off-by: mjip <marie.payne@hotmail.ca>
---
 main.go | 29 ++++++++++++++++++-----------
 1 file changed, 18 insertions(+), 11 deletions(-)

diff --git a/main.go b/main.go
index bdf61e8..2927d71 100644
--- a/main.go
+++ b/main.go
@@ -14,6 +14,7 @@
 package main
 
 import (
+	"context"
 	"fmt"
 	"net"
 	"net/http"
@@ -25,7 +26,6 @@ import (
 	"path/filepath"
 	"strings"
 	"syscall"
-	"time"
 
 	"github.com/go-kit/kit/log"
 	"github.com/go-kit/kit/log/level"
@@ -191,13 +191,20 @@ func main() {
 
 	mux.Handle(apiPath+"/v1/", http.StripPrefix(apiPath+"/v1", av1))
 
-	go closeListenerOnQuit(l, quitCh, logger)
-	err = (&http.Server{Addr: *listenAddress, Handler: mux}).Serve(l)
-	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 = (server).Serve(l)
+
+	// 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)
 	}
@@ -237,9 +244,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)
 
@@ -251,5 +258,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())
 }
-- 
2.30.0

