Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.prism.byescaleira.com/llms.txt

Use this file to discover all available pages before exploring further.

Health Checks

Health checks let load balancers, orchestrators, and monitoring systems know if your server is ready to handle traffic. Prism’s PrismHealthMonitor runs checks on demand and serves results through a /health endpoint.

Quick Setup

Basic Health Endpoint
let health = PrismHealthMonitor()
await server.use(PrismHealthMiddleware(monitor: health))
// GET /health → {"status": "healthy", "checks": []}

Adding Checks

Register Health Checks
let health = PrismHealthMonitor()

// Simple status check
await health.register("memory") {
    let info = ProcessInfo.processInfo
    return info.physicalMemory > 0 ? .healthy : .unhealthy
}

// Detailed check with messages
await health.register(PrismHealthCheck(name: "database") {
    do {
        try await db.execute("SELECT 1")
        return PrismHealthCheckResult(name: "database", status: .healthy, message: "Connected")
    } catch {
        return PrismHealthCheckResult(name: "database", status: .unhealthy, message: error.localizedDescription)
    }
})

await health.register(PrismHealthCheck(name: "disk") {
    let free = freeDiskSpace()
    if free < 100_000_000 {
        return PrismHealthCheckResult(name: "disk", status: .unhealthy, message: "Less than 100MB free")
    } else if free < 1_000_000_000 {
        return PrismHealthCheckResult(name: "disk", status: .degraded, message: "Less than 1GB free")
    }
    return PrismHealthCheckResult(name: "disk", status: .healthy)
})

await server.use(PrismHealthMiddleware(monitor: health))

Health Status Levels

StatusHTTP CodeMeaning
.healthy200Everything is operational
.degraded503Running but with issues — may need attention
.unhealthy503Not ready to handle traffic
The overall status is the worst individual check: if any check is .unhealthy, the report is unhealthy. If any is .degraded (and none unhealthy), the report is degraded.

Response Format

GET /health Response
{
    "status": "degraded",
    "checks": [
        {"name": "database", "status": "healthy", "message": "Connected"},
        {"name": "disk", "status": "degraded", "message": "Less than 1GB free"},
        {"name": "memory", "status": "healthy"}
    ]
}

Custom Endpoint Path

Custom Path
await server.use(PrismHealthMiddleware(monitor: health, path: "/api/health"))
// Now at GET /api/health instead of /health

Programmatic Health Checks

Run checks without the middleware:
Manual Check
let report = await health.checkHealth()

if report.status == .unhealthy {
    print("Server is unhealthy!")
    for check in report.checks where check.status == .unhealthy {
        print("  Failed: \(check.name)\(check.message ?? "unknown")")
    }
}
Kubernetes uses two kinds of probes: liveness (is the process alive?) and readiness (can it handle traffic?). Use /health for readiness probes. For liveness, a simple 200-OK endpoint that doesn’t check dependencies is usually enough.
Each check’s execution time is measured automatically. This helps identify slow dependencies — a database check that takes 5 seconds is a red flag even if it returns healthy.