Skip to main content
Returns Prometheus metrics in the text exposition format (version=0.0.4). Unlike /healthz and /readyz, this endpoint sits behind the API key when SCHEDY_API_KEY is set - queue depth and backlog are operational detail.

What’s exported

Counters reset when Schedy restarts, which is what Prometheus expects - rate() and increase() handle the reset for you. The schedy_tasks gauges are read from the store on every scrape, so they never drift from what is actually stored.
Go runtime metrics (go_goroutines, go_memstats_*) are not exported. Schedy emits the exposition format directly rather than depending on the Prometheus client library.

Scrape config

Leave SCHEDY_API_KEY unset and the endpoint is open, like /healthz.

The two that matter

schedy_tasks_overdue is the signal that Schedy is not keeping up. A healthy instance holds it near zero: tasks fire within a runner tick of their scheduled time. A sustained non-zero value means work is arriving faster than it can be delivered, or a target is slow enough to hold the worker goroutines. schedy_task_lateness_seconds is the same story as a distribution. Alert on its high quantiles rather than its mean - a p99 of several minutes with a healthy mean is a subset of targets timing out, which the failure counter alone will not tell you.
Time spent queued behind the concurrency cap counts as lateness, so saturation shows up in schedy_task_lateness_seconds rather than hiding behind it. See Catch-up.
The schedy_tasks gauges scan the key index on every scrape. That is one pass over task keys - no task bodies are read - which is fast into the millions, but worth knowing if you scrape aggressively with a very large store.