How to run these
Each check is a plain SELECT. Save it to a file and run it from whatever already runs jobs for you.
Cron and psql
# hourly; mails you when the query returns any rows (grep . exits 0 only when it sees output)
0 * * * * psql "$DATABASE_URL" -At -f freshness.sql | grep . && echo "freshness check failed" | mail -s "data check" [email protected]
dbt singular test
Save the zero rows version as tests/orders_freshness.sql. dbt fails the test when the query returns any row.
Airflow
Use the One number style with SQLValueCheckOperator. The operator fails the task when the query returns no rows, so the zero rows style would fail a healthy check. The count always returns one row, andpass_value=0 passes only when it is 0.
SQLValueCheckOperator(
task_id="orders_freshness",
conn_id="warehouse",
sql=FRESHNESS_SQL,
pass_value=0,
)
arcodash monitor
Paste the One number version as a query, save it, and add a monitor on the failing column with the condition above 0. The monitor runs on a schedule and posts to Slack or email when it trips.
PostgreSQL notes
Postgres folds unquoted names to lower case, so a table created as "Orders" has to be quoted every time. The generator quotes a name only when it has capitals, spaces or a reserved word, and says so under the check.
Time math uses now() and interval '30 hours'. If your column is timestamp without time zone, now() is compared in the session time zone, so store UTC and run the session in UTC to avoid a check that is off by your offset.
Every check is a plain SELECT with no extensions, so it runs the same on RDS, Aurora, Supabase, Neon and self-hosted Postgres.
Connecting PostgreSQL to arcodash is covered on the PostgreSQL connector page.