Second checkpoint
This commit is contained in:
50
internal/transport/http/health.go
Normal file
50
internal/transport/http/health.go
Normal file
@@ -0,0 +1,50 @@
|
||||
package http
|
||||
|
||||
import (
|
||||
"context"
|
||||
"net/http"
|
||||
|
||||
"gis/pkg/httputil"
|
||||
)
|
||||
|
||||
// ReadinessCheck reports whether a dependency is reachable.
|
||||
type ReadinessCheck func(ctx context.Context) error
|
||||
|
||||
// HealthHandler serves liveness and readiness probes.
|
||||
type HealthHandler struct {
|
||||
checks map[string]ReadinessCheck
|
||||
}
|
||||
|
||||
// NewHealthHandler builds a HealthHandler with the given named readiness checks.
|
||||
func NewHealthHandler(checks map[string]ReadinessCheck) *HealthHandler {
|
||||
return &HealthHandler{checks: checks}
|
||||
}
|
||||
|
||||
// Live reports that the process is up.
|
||||
func (h *HealthHandler) Live(w http.ResponseWriter, r *http.Request) {
|
||||
httputil.WriteJSON(w, http.StatusOK, map[string]string{"status": "ok"})
|
||||
}
|
||||
|
||||
// Ready runs all readiness checks and reports per-dependency status. It returns
|
||||
// 503 if any check fails.
|
||||
func (h *HealthHandler) Ready(w http.ResponseWriter, r *http.Request) {
|
||||
results := make(map[string]string, len(h.checks))
|
||||
ready := true
|
||||
for name, check := range h.checks {
|
||||
if err := check(r.Context()); err != nil {
|
||||
results[name] = "error: " + err.Error()
|
||||
ready = false
|
||||
continue
|
||||
}
|
||||
results[name] = "ok"
|
||||
}
|
||||
|
||||
status := http.StatusOK
|
||||
if !ready {
|
||||
status = http.StatusServiceUnavailable
|
||||
}
|
||||
httputil.WriteJSON(w, status, map[string]any{
|
||||
"ready": ready,
|
||||
"components": results,
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user