Feature: faster healthcheck, fix #283
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user