feat: add /health/live and /health/ready endpoints with legacy aliases

This commit is contained in:
2026-09-09 15:39:46 -05:00
parent 53e47ac967
commit dc54e12703
2 changed files with 28 additions and 11 deletions
+9 -5
View File
@@ -24,16 +24,18 @@ type ReadinessResponse struct {
Targets map[string]TargetHealth `json:"targets"`
}
// RegisterHealthRoutes mounts /healthz and /readyz probes
// RegisterHealthRoutes mounts /health/live, /health/ready, and backward-compatible /healthz, /readyz probes
func RegisterHealthRoutes(app *fiber.App, db *gorm.DB) {
app.Get("/healthz", func(c *fiber.Ctx) error {
liveHandler := func(c *fiber.Ctx) error {
return c.JSON(fiber.Map{
"status": "UP",
"timestamp": time.Now().UTC(),
})
})
}
app.Get("/health/live", liveHandler)
app.Get("/healthz", liveHandler)
app.Get("/readyz", func(c *fiber.Ctx) error {
readyHandler := func(c *fiber.Ctx) error {
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
defer cancel()
@@ -116,5 +118,7 @@ func RegisterHealthRoutes(app *fiber.App, db *gorm.DB) {
Timestamp: time.Now().UTC(),
Targets: targets,
})
})
}
app.Get("/health/ready", readyHandler)
app.Get("/readyz", readyHandler)
}
+19 -6
View File
@@ -86,11 +86,24 @@ func TestHealthRoutes(t *testing.T) {
controllers.RegisterHealthRoutes(app, db)
req, _ := http.NewRequest(http.MethodGet, "/healthz", nil)
resp, err := app.Test(req, -1)
assert.NoError(t, err)
assert.Equal(t, 200, resp.StatusCode)
// Liveness tests (/health/live and /healthz)
for _, path := range []string{"/health/live", "/healthz"} {
req, _ := http.NewRequest(http.MethodGet, path, nil)
resp, err := app.Test(req, -1)
assert.NoError(t, err, path)
assert.Equal(t, 200, resp.StatusCode, path)
body, _ := io.ReadAll(resp.Body)
assert.Contains(t, string(body), `"status":"UP"`)
body, _ := io.ReadAll(resp.Body)
assert.Contains(t, string(body), `"status":"UP"`, path)
}
// Readiness tests (/health/ready and /readyz)
for _, path := range []string{"/health/ready", "/readyz"} {
req, _ := http.NewRequest(http.MethodGet, path, nil)
resp, err := app.Test(req, -1)
assert.NoError(t, err, path)
// Since in-memory SQLite doesn't have dbresolver write/read targets, status is 503 DEGRADED or 200 UP
body, _ := io.ReadAll(resp.Body)
assert.Contains(t, string(body), `"targets"`, path)
}
}