From 6856877cd42acf302776258142009c4ffc0d0fa0 Mon Sep 17 00:00:00 2001 From: Jay Madden Date: Wed, 27 Aug 2025 09:09:18 -0500 Subject: [PATCH] feat: add readiness and liveness probes for self healing (#734) * feat: add k8s readiness and liveness probes * fix: switch to single err var and add logging * chore: remove fmt import --- pkg/web/health.go | 34 ++++++++++++++++++++++++++++++++++ pkg/web/server.go | 3 +++ 2 files changed, 37 insertions(+) create mode 100644 pkg/web/health.go diff --git a/pkg/web/health.go b/pkg/web/health.go new file mode 100644 index 0000000000000000000000000000000000000000..850e08bf9e1aa280b13cd910735e4b67ec18a67e --- /dev/null +++ b/pkg/web/health.go @@ -0,0 +1,34 @@ +package web + +import ( + "context" + "net/http" + + "github.com/charmbracelet/log/v2" + "github.com/charmbracelet/soft-serve/pkg/db" + "github.com/gorilla/mux" +) + +// HealthController registers the health check routes for the web server. +func HealthController(_ context.Context, r *mux.Router) { + r.HandleFunc("/livez", getLiveness) + r.HandleFunc("/readyz", getReadiness) +} + +func getLiveness(w http.ResponseWriter, _ *http.Request) { + renderStatus(http.StatusOK)(w, nil) +} + +func getReadiness(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + logger := log.FromContext(ctx) + db := db.FromContext(ctx) + + if err := db.PingContext(ctx); err != nil { + logger.Error("error getting db readiness", "err", err) + renderStatus(http.StatusServiceUnavailable)(w, nil) + return + } + + renderStatus(http.StatusOK)(w, nil) +} diff --git a/pkg/web/server.go b/pkg/web/server.go index a5cb490ed4b20f54c49f93775affc640594a6970..e9d5fb5f3969f8b2722ff7cbb06108c2c7f8106a 100644 --- a/pkg/web/server.go +++ b/pkg/web/server.go @@ -14,6 +14,9 @@ func NewRouter(ctx context.Context) http.Handler { logger := log.FromContext(ctx).WithPrefix("http") router := mux.NewRouter() + // Health routes + HealthController(ctx, router) + // Git routes GitController(ctx, router)