TallySyncStale
sum by (cloud) (increase(tally_sync_runs_total{status="completed"}[30m])) == 0, with no for, so it fires on the first evaluation that finds the window empty.
Symptom
No reconciliation run of this cloud reached completed in the last 30 minutes. The expected cadence is one run every 10 minutes, so the window covers three of them and a single missed run does not fire the alert.
Impact on billing
Drift stops being corrected: a resource the projection holds and the cloud no longer has keeps accruing charges, and one the cloud holds and the projection never learned of stays unbilled. Every event the collector lost stays lost for as long as this holds, because a completed run is what books it.
First checks
- The Reporting API log for the sync runs of the cloud, and whatever calls
POST /internal/sync/{cloud}on the schedule. A run that never starts and a run that starts and fails both leave this counter flat. In the prod overlay the caller is CronJobtally-sync:kubectl -n tally get cronjob tally-syncshows its last schedule, andkubectl -n tally logs -l app.kubernetes.io/name=tally-sync --tail=20the answers of its recent Jobs. tally_sync_errors_totalfor the cloud and thesync_runsrow of the last run. A run that recorded any error at all endsfailed, is answered 500, and holds the reasons in that row.- The cloud's
adapter_configentry, the clouds.yaml the pod reads, and whether Keystone and the service APIs answer. A failure that names no single resource type ends the whole run before a type is observed. - The budget a run is bounded at,
TALLY_REPORTING_SYNC_BUDGET_S, 45 seconds by default. A cloud whose enumeration outgrows it never completes a run: every call is answered 500 and leavescontext deadline exceededin thestats.errorsof itssync_runsrow, while the counter stays flat. Give a large cloud a longer budget raises it.
The adapter, its runs, and what a partial outage does to one are described in how reconciliation observes a cloud, and the steps that configure a cloud and trigger a run are in reconcile a cloud.