OAK CREEK

What Oak Creek checks, and how it tells you

Every feature is built around one question: did this job run when it should have, and did it finish cleanly? Here is how schedules, signals, alerts and the API work.

Two kinds of schedule

Period checks expect a ping every N minutes or hours, which suits queue workers and loops. Cron checks take a standard five-field expression plus an IANA time zone, so a job set for 02:15 in America/Los_Angeles is expected at 02:15 local time all year.

The grace period is how long Oak Creek waits after the expected time before marking the check Late. A second threshold marks it Down and triggers escalation.

Illustrative product interface

Signals your job can send

Each check has one ping URL. Append a suffix to say what happened. GET, HEAD and POST all work; POST bodies are stored as the run log.

/start
Job began. Starts the duration timer and catches jobs that start but never finish.
/ (empty) or /0
Job finished successfully.
/fail or /1–255
Job failed. The exit code is stored with the run.
/log
Attach output to the current run without changing status.

run_export.py

import subprocess, requests

PING = "https://ping.oakcreekventures.xyz/b41e09d2"

requests.get(f"{PING}/start", timeout=10)
result = subprocess.run(["/opt/etl/export_orders.sh"], capture_output=True, text=True)

# Exit code becomes the status; the last 10 KB of output is kept with the run
requests.post(f"{PING}/{result.returncode}", data=result.stdout[-10000:], timeout=10)

Illustrative example

Illustrative product interface

Alert routes and escalation

An alert route is a list of channels with delays. Attach routes to checks directly or by tag.

  • Channels: Slack, Microsoft Teams, PagerDuty, email and signed JSON webhooks
  • Escalation steps after 15, 30 or 60 minutes, or a custom delay
  • Quiet hours per route, and maintenance windows per tag
  • Recovery notices sent to the same channels that got the alert

Manage checks from code

The REST API uses JSON and project-scoped bearer keys. Create a check in the same Terraform run or deploy script that creates the job, pause it during migrations, and pull run history into your own dashboards. Starter includes read-only keys; Team and Business add read-write keys.

POST /api/v1/checks

201 Created

{
  "name": "client-acme-wp-cron",
  "schedule": "*/15 * * * *",
  "tz": "America/New_York",
  "grace": 600,
  "tags": ["client-acme", "wordpress"],
  "channels": ["slack:#client-acme", "email:oncall"],
  "status": "new",
  "ping_url": "https://ping.oakcreekventures.xyz/c93a51f0"
}

Illustrative example

Works wherever a job can make an HTTPS request

Try it on one job first