Skip to content

Retention and limits

Checkstack stores health check runs at three resolution tiers and rolls them up automatically. This page tells you what the defaults are, what you can change from the UI, and the platform-wide ceilings you cannot exceed.

If you are a developer adding a new strategy, see Health check data management for the internals.

Every health check run is written to one of three tables, with older data rolling up automatically:

TierBacking tableDefault retentionWhat it stores
Rawhealth_check_runs7 daysThe full per-run payload (status, latency, strategy-specific result JSON) - the most detailed view.
Hourlyhealth_check_aggregates (bucket hourly)30 daysOne row per check per hour with aggregated metrics (run counts, success rate, latency p95) plus the strategy’s compact aggregatedResult.
Dailyhealth_check_aggregates (bucket daily)365 daysOne row per check per day with the same metric set but no strategy-specific payload.

Charts in the UI re-aggregate across tiers automatically when you zoom out, so the same view works for “the last hour” and “the last year”.

You can override the defaults per check assignment from the health-check editor. The override is stored alongside the assignment and validated against this schema:

const RetentionConfigSchema = z.object({
rawRetentionDays: z.number().int().min(1).max(30).default(7),
hourlyRetentionDays: z.number().int().min(7).max(90).default(30),
dailyRetentionDays: z.number().int().min(30).max(1095).default(365),
});
SettingMinMaxDefault
rawRetentionDays1307
hourlyRetentionDays79030
dailyRetentionDays301095 (3 years)365

The three values must strictly increase: rawRetentionDays < hourlyRetentionDays < dailyRetentionDays. Saving a configuration that violates this returns a BAD_REQUEST.

To reset an override back to the defaults, clear the retention block on the assignment (the RPC accepts null).

The Script plugin (shell scripts and inline TypeScript/JS run on the satellite) enforces a hardcoded execution-time ceiling per run:

FieldMinMaxDefault
timeout (ms)100300 000 (5 minutes)30 000 (30 seconds)

The timeout applies to both shell and inline collectors. The platform kills the spawned subprocess when the timeout fires and records timedOut: true on the run. For more detail on the script plugin model see Script health checks.

Plugin tarballs uploaded through the Plugin Manager (or fetched from npm/GitHub) are size-capped:

LimitValue
Max plugin tarball size50 MB

Uploads above this limit are rejected with HTTP 413 before any DB write. The same cap applies to the npm and GitHub installers.

The following ceilings are hardcoded in the platform and there is no env var or UI knob for them. Most of them exist to keep a single bad input from running the platform out of memory.

LimitValueWhere it lives
Max plugin tarball size50 MBMAX_TARBALL_SIZE_BYTES in core/backend
Script timeout ceiling5 minutesexecuteConfigSchemaV2 in the script plugin
Daily retention ceiling1095 daysRetentionConfigSchema
Health check probe wait timeout30 sREADY_WAIT_TIMEOUT_MS for the boot gate on /.checkstack/ready
SettingWhere to change it
Logging verbosityLOG_LEVEL env var (see Configuration reference)
Queue backend (in-memory vs BullMQ)Infrastructure settings UI
Cache backendInfrastructure settings UI
Auth strategiesAuthentication settings UI
Per-check schedule cadenceHealth check editor per assignment
Per-check retentionHealth check editor per assignment (see above)