6856877cd42acf302776258142009c4ffc0d0fa0

Author
Jay Madden <jaymaddencox@gmail.com>
Committer
GitHub <noreply@github.com>
Date

Message

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

Diff

 1diff --git a/pkg/web/health.go b/pkg/web/health.go
 2new file mode 100644
 3index 0000000000000000000000000000000000000000..850e08bf9e1aa280b13cd910735e4b67ec18a67e
 4--- /dev/null
 5+++ b/pkg/web/health.go
 6@@ -0,0 +1,34 @@
 7+package web
 8+
 9+import (
10+	"context"
11+	"net/http"
12+
13+	"github.com/charmbracelet/log/v2"
14+	"github.com/charmbracelet/soft-serve/pkg/db"
15+	"github.com/gorilla/mux"
16+)
17+
18+// HealthController registers the health check routes for the web server.
19+func HealthController(_ context.Context, r *mux.Router) {
20+	r.HandleFunc("/livez", getLiveness)
21+	r.HandleFunc("/readyz", getReadiness)
22+}
23+
24+func getLiveness(w http.ResponseWriter, _ *http.Request) {
25+	renderStatus(http.StatusOK)(w, nil)
26+}
27+
28+func getReadiness(w http.ResponseWriter, r *http.Request) {
29+	ctx := r.Context()
30+	logger := log.FromContext(ctx)
31+	db := db.FromContext(ctx)
32+
33+	if err := db.PingContext(ctx); err != nil {
34+		logger.Error("error getting db readiness", "err", err)
35+		renderStatus(http.StatusServiceUnavailable)(w, nil)
36+		return
37+	}
38+
39+	renderStatus(http.StatusOK)(w, nil)
40+}
41diff --git a/pkg/web/server.go b/pkg/web/server.go
42index a5cb490ed4b20f54c49f93775affc640594a6970..e9d5fb5f3969f8b2722ff7cbb06108c2c7f8106a 100644
43--- a/pkg/web/server.go
44+++ b/pkg/web/server.go
45@@ -14,6 +14,9 @@ func NewRouter(ctx context.Context) http.Handler {
46 	logger := log.FromContext(ctx).WithPrefix("http")
47 	router := mux.NewRouter()
48 
49+	// Health routes
50+	HealthController(ctx, router)
51+
52 	// Git routes
53 	GitController(ctx, router)
54