Feature: faster healthcheck, fix #283

This commit is contained in:
Quentin McGaw
2020-12-30 19:34:11 +00:00
parent 6f3a074e00
commit 11338b6382
4 changed files with 84 additions and 18 deletions

View File

@@ -1,21 +1,25 @@
package healthcheck
import (
"net"
"errors"
"net/http"
"sync"
"github.com/qdm12/golibs/logging"
)
type handler struct {
logger logging.Logger
resolver *net.Resolver
logger logging.Logger
healthErr error
healthErrMu sync.RWMutex
}
func newHandler(logger logging.Logger, resolver *net.Resolver) http.Handler {
var errHealthcheckNotRunYet = errors.New("healthcheck did not run yet")
func newHandler(logger logging.Logger) *handler {
return &handler{
logger: logger,
resolver: resolver,
logger: logger,
healthErr: errHealthcheckNotRunYet,
}
}
@@ -24,11 +28,22 @@ func (h *handler) ServeHTTP(responseWriter http.ResponseWriter, request *http.Re
http.Error(responseWriter, "method not supported for healthcheck", http.StatusBadRequest)
return
}
err := healthCheck(request.Context(), h.resolver)
if err != nil {
if err := h.getErr(); err != nil {
h.logger.Error(err)
http.Error(responseWriter, err.Error(), http.StatusInternalServerError)
return
}
responseWriter.WriteHeader(http.StatusOK)
}
func (h *handler) setErr(err error) {
h.healthErrMu.Lock()
defer h.healthErrMu.Unlock()
h.healthErr = err
}
func (h *handler) getErr() (err error) {
h.healthErrMu.RLock()
defer h.healthErrMu.RUnlock()
return h.healthErr
}