steadycron is the official Python code-monitoring SDK for SteadyCron.
Wrap your scheduled jobs with @steadycron.job and SteadyCron will:
- Know when a job started, succeeded, or failed
- Alert you when a job doesn't run on time (missed heartbeat)
- Detect stuck runs that start but never finish
The monitor must already exist — create it in the Dashboard, via YAML manifest, or Terraform. The SDK never creates monitors. For a fully code-driven workflow, declare the monitor in your Terraform configuration or YAML manifest and reference it from your application by key: the cron schedule, alert rules, and SDK instrumentation all live in the same repository.
pip install steadycronNo runtime dependencies — uses Python's standard library only.
import steadycron
steadycron.api_key = "sc_ro_..." # read-only key; or set STEADYCRON_API_KEY env var
@steadycron.job("nightly-db-backup")
def backup():
run_backup() # start on entry, success on return, fail (+re-raise) on exceptionwith steadycron.monitor("nightly-db-backup"):
run_backup()m = steadycron.Monitor("nightly-db-backup")
m.ping() # bare success heartbeat
m.ping(state="start")
m.ping(state="fail", message="disk full")The SDK uses a read-only API key to resolve monitor keys to ping tokens at startup. Create one in:
SteadyCron Dashboard → Settings → API keys → New key → Scope: Read-only
Set it via:
- Environment variable:
STEADYCRON_API_KEY=sc_ro_... - Module attribute:
steadycron.api_key = "sc_ro_..." steadycron.configure(api_key="sc_ro_...")
import steadycron
steadycron.configure(
api_key="sc_ro_...",
environment="production", # optional — sent on every ping
capture_errors=True, # include exception message on fail pings (default False)
ping_timeout=5.0, # seconds (default 5)
resolve_cache_ttl=3600.0, # seconds (default 3600 = 1 hour)
)| Setting | Default | Env var fallback |
|---|---|---|
api_key |
None |
STEADYCRON_API_KEY |
api_url |
https://api.steadycron.com |
STEADYCRON_API_URL |
ping_url |
https://ping.steadycron.com |
STEADYCRON_PING_URL |
environment |
None |
STEADYCRON_ENVIRONMENT |
capture_errors |
False |
— |
ping_timeout |
5.0 s |
— |
resolve_cache_ttl |
3600.0 s |
— |
- On first use, the SDK calls
GET /api/monitors/resolve?key=<your-key>with the read-only API key to retrieve the ping token. The token is cached for 1 hour (configurable). - All pings are fire-and-forget: a bounded
ping_timeoutis applied; any error is logged vialogging.getLogger("steadycron")at WARNING and discarded. They never raise. - Resolution errors (404 unknown key, 409 ambiguous key, wrong kind) raise immediately — they indicate misconfiguration.
- On exception, a
failping is sent and the original exception is re-raised unchanged.
If you cannot use API key resolution (e.g. air-gapped environments), set the ping token directly:
steadycron.monitors = {"nightly-db-backup": "hRkmWz8oZtlMFzvTAUdnRE"}The token is visible via Job detail → Code monitoring → Reveal ping token in the Dashboard.
- Ping failures are never raised. A transport error, timeout, or non-2xx response is logged and discarded.
- Resolution errors always raise. A 404 or 409 from the resolve endpoint raises on first use; fix the key or remove the decorator.
- Original exceptions pass through unchanged. The decorator and context manager do not wrap exceptions.
- No runtime dependencies. The SDK uses
urllib.requestfrom the standard library.
MIT