35 lines
1.0 KiB
Go
35 lines
1.0 KiB
Go
|
|
package httpapi
|
||
|
|
|
||
|
|
import (
|
||
|
|
"context"
|
||
|
|
"encoding/json"
|
||
|
|
"net/http"
|
||
|
|
"time"
|
||
|
|
)
|
||
|
|
|
||
|
|
// NewHandler returns health endpoints. ping must honor its context deadline.
|
||
|
|
func NewHandler(ping func(context.Context) error) http.Handler {
|
||
|
|
mux := http.NewServeMux()
|
||
|
|
mux.HandleFunc("GET /healthz", func(w http.ResponseWriter, r *http.Request) {
|
||
|
|
writeStatus(w, http.StatusOK, "ok")
|
||
|
|
})
|
||
|
|
mux.HandleFunc("GET /readyz", func(w http.ResponseWriter, r *http.Request) {
|
||
|
|
ctx, cancel := context.WithTimeout(r.Context(), 2*time.Second)
|
||
|
|
defer cancel()
|
||
|
|
if err := ping(ctx); err != nil {
|
||
|
|
// Do not expose database connection details through a public endpoint.
|
||
|
|
writeStatus(w, http.StatusServiceUnavailable, "unavailable")
|
||
|
|
return
|
||
|
|
}
|
||
|
|
writeStatus(w, http.StatusOK, "ok")
|
||
|
|
})
|
||
|
|
return mux
|
||
|
|
}
|
||
|
|
|
||
|
|
func writeStatus(w http.ResponseWriter, code int, status string) {
|
||
|
|
w.Header().Set("Content-Type", "application/json; charset=utf-8")
|
||
|
|
w.Header().Set("Cache-Control", "no-store")
|
||
|
|
w.WriteHeader(code)
|
||
|
|
_ = json.NewEncoder(w).Encode(map[string]string{"status": status})
|
||
|
|
}
|