Runbook: Ingest Service Down
Symptoms
POST /v1/eventsorPOST /v1/transcriptsreturning 5xx or timing out.- Hook CLIs on developer machines reporting delivery failures / queuing events locally.
GET /healthonapps/ingestnot returning{"ok":true}.
Observe
Metrics: Grafana — http://localhost:3001 (see on-call.md)
Grafana: http://localhost:3001 (see on-call.md)Key panels to check on the Ingest Service dashboard:
- Error Rate (5xx) — spike indicates handler failures.
- p99 Latency — high values suggest DB or S3 saturation.
- Ingest QPS — sudden drop to 0 with expected traffic is a signal the service is down.
Logs:
# Docker Compose stackbun run docker:app:logs# or filter to ingest onlydocker compose -f docker-compose.app.yml logs -f ingestHealth check:
curl http://localhost:4000/healthcurl http://localhost:4000/readyz/readyz reports checks.postgres and checks.s3 individually — use this to isolate the failing dependency.
Diagnose
- Service process exited? — Check Docker exit code. OOM kills show exit code 137.
- Postgres down? —
checks.postgres: "error"in/readyz. Seetimescale-slow.md. - MinIO/S3 down? —
checks.s3: "error"in/readyz. Seeminio-full.md. - Config missing? — Service fails at startup with a Zod validation error. Check env vars against
.env.example. - Port conflict? — Default port 4000.
lsof -i :4000to find the occupying process.
Mitigate
- Restart the service:
docker compose -f docker-compose.app.yml restart ingest - If DB is the cause, the hook CLI queues events locally (SQLite) — no data loss for up to the local queue TTL.
- If S3 is the cause, transcript uploads fail but event ingestion continues (they are independent routes).
Escalate
If the service cannot be restored within 30 min, or if DB corruption is suspected, escalate to the team lead. See on-call.md for the escalation path.