Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Metrics and quality signals

cronoq reports two kinds of telemetry:

  1. Snapshots: per-pool quality metrics over a sliding window (60 s by default), returned by Scheduler::snapshot() (Rust), await sched.snapshot() (Python), GET /v1/snapshot and Admin/Snapshot.
  2. Exported metrics: OpenTelemetry instruments (library, otel feature) and Prometheus text at /metrics (server). See the metrics reference.

Pool snapshot fields

FieldMeaning
capacityCurrent worker slots.
busySlots running an attempt.
heldSlots held for upcoming fixed-start tasks.
desiredAutoscaler target.
pending_by_classPending tasks per class (critical, high, normal, low).
readyTasks queued for dispatch now.
reservationsFixed-start reservations booked.
dispatched, succeeded, failed, retriedCounts within the window.
priority_adherenceFraction of dispatches made with no strictly higher class waiting.
fixed_start_hit_rateFraction of fixed-start tasks started within their tolerance.
utilizationBusy slot-seconds ÷ capacity slot-seconds.
schedule_efficiencyCompleted work seconds ÷ capacity slot-seconds.
wait_mean, wait_p50/p90/p99Queue wait of first attempts (submission to dispatch).
run_p50, run_p99Run time of successful attempts.
worker_seconds, costSince start.

Snapshots also include totals since start (submitted, succeeded, failed, dead_lettered, cancelled, skipped, missed, shed, retries, timeouts, lease_expiries, stale_completions, recurring_conflicts, recurring_invalid).

Reading the signals

SignalHealthyInvestigate when
wait_p99Below your latency objectiveRising while utilization is high: capacity-bound; while low: resource-bound (check rate limits).
utilization0.5–0.85Near 1.0 with growing backlog (scale out); very low with desired at min (over-provisioned).
priority_adherenceClose to 1.0Drops: aging or deadlines override priorities often; review classes or caps.
fixed_start_hit_rate1.0Below 1.0: reservable capacity too small, or no workers connected around start times.
desired vs capacityEqual (in-process) or converging (server)Persistently desired > capacity in server mode: your scaler is not adding workers.
dead_lettered rateNear zeroSpikes indicate a failing dependency; inspect status messages.

Implementation notes

Window metrics use a ring of 12 buckets, and wait/run percentiles come from a log-linear histogram (about 9% resolution). Utilization integrates busy and capacity over time, so it is exact for the window, not sampled.