Documentation Index
Fetch the complete documentation index at: https://mintlify.com/gofiber/fiber/llms.txt
Use this file to discover all available pages before exploring further.
Healthcheck middleware provides liveness, readiness, and startup probe endpoints for Fiber applications, following Kubernetes health check conventions.
Installation
go get -u github.com/gofiber/fiber/v3
go get -u github.com/gofiber/fiber/v3/middleware/healthcheck
Signatures
func New(config ...Config) fiber.Handler
Constants
const (
LivenessEndpoint = "/livez" // Liveness probe endpoint
ReadinessEndpoint = "/readyz" // Readiness probe endpoint
StartupEndpoint = "/startupz" // Startup probe endpoint
)
Usage
Basic Usage
package main
import (
"github.com/gofiber/fiber/v3"
"github.com/gofiber/fiber/v3/middleware/healthcheck"
)
func main() {
app := fiber.New()
// Use default health checks (always return true)
app.Get(healthcheck.LivenessEndpoint, healthcheck.New())
app.Get(healthcheck.ReadinessEndpoint, healthcheck.New())
app.Get(healthcheck.StartupEndpoint, healthcheck.New())
app.Listen(":3000")
}
Custom Probes
var (
dbReady = false
cacheReady = false
started = false
)
// Liveness: Is the application running?
app.Get(healthcheck.LivenessEndpoint, healthcheck.New())
// Readiness: Can the application handle requests?
app.Get(healthcheck.ReadinessEndpoint, healthcheck.New(healthcheck.Config{
Probe: func(c fiber.Ctx) bool {
return dbReady && cacheReady
},
}))
// Startup: Has the application finished starting up?
app.Get(healthcheck.StartupEndpoint, healthcheck.New(healthcheck.Config{
Probe: func(c fiber.Ctx) bool {
return started
},
}))
Custom Endpoints
// Use custom endpoint names
app.Get("/health", healthcheck.New())
app.Get("/ready", healthcheck.New(healthcheck.Config{
Probe: func(c fiber.Ctx) bool {
return checkDependencies()
},
}))
All Methods Support
// Respond to all HTTP methods
app.All("/healthz", healthcheck.New())
Configuration
Next
func(fiber.Ctx) bool
default:"nil"
Function to skip this middleware when it returns true. Note: If this returns true and no other handlers are defined for the route, Fiber returns 404 Not Found.
Probe
func(fiber.Ctx) bool
default:"func(c fiber.Ctx) bool { return true }"
Function executed to determine health state. Returning true indicates the application is healthy (200 OK), false indicates unhealthy (503 Service Unavailable).
Default Configuration
func defaultProbe(_ fiber.Ctx) bool { return true }
var ConfigDefault = Config{
Next: nil,
Probe: defaultProbe,
}
Best Practices
Probe Types
- Liveness: Checks if the application is running. If this fails, the container should be restarted.
- Readiness: Checks if the application is ready to accept traffic. If this fails, traffic should be stopped.
- Startup: Checks if the application has finished starting. Protects slow-starting containers from premature termination.
Kubernetes Configuration
apiVersion: v1
kind: Pod
metadata:
name: my-app
spec:
containers:
- name: app
image: my-app:latest
livenessProbe:
httpGet:
path: /livez
port: 3000
initialDelaySeconds: 3
periodSeconds: 10
readinessProbe:
httpGet:
path: /readyz
port: 3000
initialDelaySeconds: 5
periodSeconds: 5
startupProbe:
httpGet:
path: /startupz
port: 3000
failureThreshold: 30
periodSeconds: 10
Common Patterns
Database Health Check
func checkDatabase(db *sql.DB) bool {
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
defer cancel()
return db.PingContext(ctx) == nil
}
app.Get(healthcheck.ReadinessEndpoint, healthcheck.New(healthcheck.Config{
Probe: func(c fiber.Ctx) bool {
return checkDatabase(db)
},
}))
Multiple Service Dependencies
type HealthChecker struct {
db *sql.DB
cache *redis.Client
}
func (h *HealthChecker) IsReady() bool {
// Check all dependencies
dbOK := h.db.Ping() == nil
cacheOK := h.cache.Ping(context.Background()).Err() == nil
return dbOK && cacheOK
}
checker := &HealthChecker{db: db, cache: cache}
app.Get(healthcheck.ReadinessEndpoint, healthcheck.New(healthcheck.Config{
Probe: func(c fiber.Ctx) bool {
return checker.IsReady()
},
}))
Startup Probe with Initialization
var startupComplete atomic.Bool
func main() {
app := fiber.New()
// Startup probe
app.Get(healthcheck.StartupEndpoint, healthcheck.New(healthcheck.Config{
Probe: func(c fiber.Ctx) bool {
return startupComplete.Load()
},
}))
// Run initialization in background
go func() {
initializeDatabase()
warmupCache()
startupComplete.Store(true)
}()
app.Listen(":3000")
}
Graceful Shutdown
var shutdownInitiated atomic.Bool
app.Get(healthcheck.ReadinessEndpoint, healthcheck.New(healthcheck.Config{
Probe: func(c fiber.Ctx) bool {
// Stop receiving traffic during shutdown
return !shutdownInitiated.Load()
},
}))
// Graceful shutdown handler
go func() {
<-sigChan
shutdownInitiated.Store(true)
time.Sleep(5 * time.Second) // Allow load balancer to drain
app.Shutdown()
}()
Response Codes
- 200 OK: Probe returned
true (healthy)
- 503 Service Unavailable: Probe returned
false (unhealthy)
- 404 Not Found:
Next function returned true and no other handlers are defined