Regions and checks
US-East and EU-West, the fixed 30 second scrape, and what a check row contains.
Regions and checks
HTTP, TCP, ping and DNS monitors are probed from two regions, US-East and EU-West, each running its own Blackbox Exporter. A monitor with no explicit location assignment is probed from every region; assigning it to specific locations narrows that.
The fixed 30 second scrape
Every active monitor is discovered by both regional Prometheus instances
(service discovery refreshes every 30 seconds) and scraped by that region's
Blackbox Exporter on a fixed 30 second interval. This is not per-monitor: a
monitor's own interval_seconds gates which plan can create it (see
Monitors), but it does not change how often the probe
actually runs. Every monitor, on every plan, is probed on the same 30 second
cadence.
A separate worker reads the latest probe result from Prometheus every 60 seconds and writes one check row per monitor per tick, using whatever the most recent scrape sample was at that moment. So in practice, a monitor's check history gets a new row roughly once a minute, drawn from a probe that itself refreshes twice as often.
What a check row contains
Check rows live in ClickHouse, not PostgreSQL, and are read back through
GET /api/v1/me/monitors/{id}/checks:
{
"checks": [
{
"id": "76d8caea-cbbe-48e3-bcb8-704c4e9af6eb",
"monitor_id": "76d8caea-cbbe-48e3-bcb8-704c4e9af6eb",
"is_successful": true,
"response_time_ms": 261,
"status_code": 200,
"error_message": null,
"created_at": "2026-09-16T13:00:10.136000Z"
}
],
"total": 1,
"limit": 20,
"offset": 0
}status_code is only populated for HTTP checks. A failed check (timeout,
connection refused, TLS error) carries no meaningful response_time_ms and is
excluded from response-time averages for that reason.
Pending, and how long it lasts
A monitor is created in pending status and has never had a check yet. It
moves to up or down on the first check row the 60-second worker writes for
it, which means pending typically lasts under two minutes and, once the
regional scrape has already picked the target up, often well under one. There
is no separate "first check" fast path. The monitor simply waits for the same
tick every other monitor waits for.
Walking this live (kind cluster): four monitors, one of each active-probe
type, went from pending to up within one to two worker ticks of creation,
each confirmed by polling GET /api/v1/me/monitors/{id} until status
changed.
Pause, resume and status
Pausing a monitor (POST /{id}/pause) stops it from being probed and sets
status to paused; it keeps its existing check history. Resuming
(POST /{id}/resume) does not restore the monitor's last known status. It
returns to pending and re-earns up or down from the next check, the same
as a brand-new monitor.