health: make health listener semantics match metrics one

This commit is contained in:
Ask Bjørn Hansen 2023-07-08 21:18:38 -07:00
parent 6b6b22092e
commit 03bde25c6d

View File

@ -7,11 +7,12 @@ import (
"time" "time"
"golang.org/x/exp/slog" "golang.org/x/exp/slog"
"golang.org/x/sync/errgroup"
) )
// HealthCheckListener runs simple http server on the specified port for // HealthCheckListener runs simple http server on the specified port for
// health check probes // health check probes
func HealthCheckListener(ctx context.Context, port int, log *slog.Logger) { func HealthCheckListener(ctx context.Context, port int, log *slog.Logger) error {
log.Info("Starting health listener", "port", port) log.Info("Starting health listener", "port", port)
serveMux := http.NewServeMux() serveMux := http.NewServeMux()
@ -26,19 +27,31 @@ func HealthCheckListener(ctx context.Context, port int, log *slog.Logger) {
Handler: serveMux, Handler: serveMux,
} }
go func() { g, ctx := errgroup.WithContext(ctx)
g.Go(func() error {
err := srv.ListenAndServe() err := srv.ListenAndServe()
if err != http.ErrServerClosed { if err != http.ErrServerClosed {
log.Warn("health check server done listening", "err", err) log.Warn("health check server done listening", "err", err)
return err
} }
}() return nil
})
<-ctx.Done() <-ctx.Done()
if err := srv.Shutdown(ctx); err != nil { ctx, cancel := context.WithTimeout(ctx, 2*time.Second)
log.Error("health check server shutdown failed", "err", err) defer cancel()
}
g.Go(func() error {
if err := srv.Shutdown(ctx); err != nil {
log.Error("health check server shutdown failed", "err", err)
return err
}
return nil
})
return g.Wait()
} }
func basicHealth(w http.ResponseWriter, r *http.Request) { func basicHealth(w http.ResponseWriter, r *http.Request) {