Health Checks

Storage & Runtime

Health Checks

6 min readUpdated August 2026

Health checks live on the app Settings tab → jump Health → Health Checks. Enable the probe and set an HTTP path on the app port. New revisions wait on that path before they take traffic.

This is not a top-level Service → Settings → Health Check page. After you change the fields, Commit on the canvas.

A curl to /health returns 200, the Runtime fields set the probe path, startup, timeout, and interval, and the new revision waits on the probe before taking traffic.

Probe types

Readiness probe

HTTP GET to your health check path. Returns 200–299 = pod is ready to receive traffic. Returns anything else or times out = pod is removed from the load balancer endpoints until it recovers. Checked every 10 seconds.

Liveness probe

HTTP GET to your health check path. If the pod fails 3 consecutive liveness checks, Kubernetes kills and restarts the pod. Catches processes that are stuck or deadlocked but haven't crashed. Checked every 15 seconds after startup.

Startup probe

Runs on pod start only. The liveness probe is paused until the startup probe succeeds. Configure a grace period of up to 300 seconds for services with slow initialization (JVM warmup, loading ML models, etc.).

Health endpoint examples

Node.js (Express)

server.js
const express = require('express')
const app = express()

// Minimal health check, always returns 200
app.get('/health', (req, res) => {
  res.json({ status: 'ok', uptime: process.uptime() })
})

// Advanced: check DB before declaring ready
app.get('/health/ready', async (req, res) => {
  try {
    await db.query('SELECT 1')
    res.json({ status: 'ready', db: 'connected' })
  } catch {
    res.status(503).json({ status: 'unhealthy', db: 'disconnected' })
  }
})

Python (FastAPI)

main.py
from fastapi import FastAPI, HTTPException
from sqlalchemy import text

app = FastAPI()

@app.get("/health")
async def health_check():
    try:
        await db.execute(text("SELECT 1"))
        return {"status": "ok"}
    except Exception as e:
        raise HTTPException(status_code=503, detail=str(e))

Under the hood

  • Settings → Health: enable Health Checks, then set Health Check Path, Startup Seconds, Timeout Seconds, and Interval Seconds. Commit on the canvas.
  • HTTP probe on your port: StackBlaze GETs the path on the app port. A 200 means the revision can take traffic. Keep the path fast and unauthenticated.
  • Startup Seconds: extra time for slow starts (JVM warmup, loading models). Raise this if deploys hang because the app is not ready yet.
  • Rolling deploy gating: a new revision must pass the health path before it takes traffic. If it never becomes ready, the previous revision keeps serving.

Step by step

01

Add a cheap HTTP path

Serve HTTP 200 on something like /health when the process can take traffic. Keep it fast. Do not hide it behind auth.

02

Open Settings → Health

On the app, open the Settings tab and jump to Health. Enable Health Checks. The dashboard copy is “HTTP probe on your port.” Set Health Check Path, Startup Seconds, Timeout Seconds, and Interval Seconds.

03

Commit the app

Commit the change on the canvas. New revisions wait on this path before they take traffic. If deploys hang, the path is wrong or the app never becomes ready.