Skip to content

Alert rules

Alert rules are part of Vaicoa Pro and Vaicoa Team. A free account’s uptime checks show their results but send no alerts.

Every rule Vaicoa evaluates for your team. To follow an alert from the notification to the cause, see When something needs attention.

ColumnMeaning
Notificationon iPhone, the title of the push notification, after Critical: or Warning:
Rulethe rule_key first, then the rule’s internal name. The app shows the rule_key under the alert’s title (Warning · disk_space_low), webhooks send it as alert.rule, PagerDuty as custom_details.rule
Severitycritical or warning
Fires whenthe condition, and how long it must hold before the alert fires

Rules are evaluated every 30 seconds. The thresholds are the same for every team. The only values you set yourself are a check’s latency budget and a job’s maximum age.

For cloud servers in a connected project, from the metrics Hetzner reports for them. Dedicated servers have no Hetzner metrics, so these two rules do not cover them.

NotificationRuleSeverityFires when
server offlinehost_offline · HostOfflinecriticalHetzner lists the server as running but has sent no metrics for it for more than 3 minutes. Keeps firing for as long as that lasts; resolves when metrics return, or when the server is powered off or deleted
CPU saturatedcpu_saturated · CPUSaturatedwarningHetzner’s CPU value for the server is above 95 % for 15 minutes
  • server offline never fires for a server that Hetzner reports as off, including one powered off between two syncs, for a deleted server, while the Hetzner API cannot be reached or refuses the project’s token (the token alert covers that), or when Hetzner goes quiet for every team at once.
  • A server powered off without you doing it does not page either: Hetzner reports it as off and gives no reason. An uptime check on its address watches for that.

For servers that run the agent. The agent sends metrics every 30 seconds; this rule fires when they stop arriving.

NotificationRuleSeverityFires when
stopped reportingagent_silent · AgentSilentcriticalA dedicated server, or a cloud server that is not linked to its Hetzner resource, has sent no agent metrics for more than 5 minutes
stopped reportingagent_silent · AgentSilentwarningA cloud server’s agent has sent no metrics for more than 5 minutes while Hetzner still delivers the server’s own metrics
  • The alert keeps firing for as long as the server is silent and resolves with the first new report.
  • Critical where the agent is the only signal: a dedicated server, or a cloud server registered with its own agent token rather than a fleet token, which Vaicoa cannot match to its Hetzner resource. The alert cannot tell a server that is down from an agent that stopped; an uptime check on the server’s address can.
  • Warning for a cloud server that Hetzner still reports: the server runs, but until the agent reports again there are no disk, memory or log alerts for it. systemctl status cloudviewer-agent on the server shows why.
  • When Hetzner is silent too, only server offline fires, not both. A cloud server that is not linked to its Hetzner resource can get both.
  • It does not fire for a server that has never reported (Waiting for agent) or only sends job reports, a retired server, a server whose tokens are revoked, a team that is not on Pro or Team, a linked cloud server that Hetzner does not report as running (powered off, being rebuilt), or a check target.
  • If every team’s agents go silent at once, the cause is on our side, and the rule holds back instead of paging everyone.

For cloud and dedicated servers that run the agent, from what it measures on the host.

NotificationRuleSeverityFires when
disk space lowdisk_space_low · DiskSpaceLowwarningA filesystem is more than 80 % full for 10 minutes
disk almost fulldisk_space_critical · DiskSpaceCriticalcriticalA filesystem is more than 90 % full for 5 minutes
disk fills within a daydisk_fills_within_24h · DiskFillsWithin24hwarningA filesystem is more than 60 % full and, at the rate of both the last six hours and the last hour, full within 24 hours, for 90 minutes
disk fills within hoursdisk_fills_within_4h · DiskFillsWithin4hcriticalA filesystem is more than 70 % full and, at the rate of both the last two hours and the last half hour, full within 4 hours, for 45 minutes
memory pressurememory_pressure · MemoryPressurewarningMemory use is above 90 % for 10 minutes
  • Disk rules apply to each mount point separately. Memory-backed and image filesystems (tmpfs, devtmpfs, ramfs, squashfs, erofs, overlay and similar) are skipped, and so are the volume mounts of single pods on a Kubernetes node (/var/lib/kubelet/pods/…).
  • The two forecasts need both rates to agree, so a single burst, such as an image pull or a restore, does not fire them. Only steady growth does.
  • Memory use is total minus available memory, so page cache the kernel can free does not count.

For servers that report their LVM thin pools as node_lvm_thin_pool_data_percent and node_lvm_thin_pool_metadata_percent (by vg and lv, the percentages lvs shows), as PaaSbox hosts do.

NotificationRuleSeverityFires when
thin pool fillingthin_pool_space_low · ThinPoolSpaceLowwarningA thin pool’s data is more than 80 % full for 15 minutes
thin pool almost fullthin_pool_space_critical · ThinPoolSpaceCriticalcriticalA thin pool’s data is more than 90 % full for 5 minutes
thin-pool metadata fillingthin_pool_metadata_low · ThinPoolMetadataLowwarningA thin pool’s metadata is more than 80 % full for 15 minutes
thin-pool metadata almost fullthin_pool_metadata_critical · ThinPoolMetadataCriticalcriticalA thin pool’s metadata is more than 90 % full for 5 minutes
  • A full pool, or full metadata, fails every write to every volume in the pool, even when each volume’s own filesystem has space left.

From the warning-level journald lines the agent sends for log context. Only lines that were stored count, after the per-server limit of 120 lines a minute.

NotificationRuleSeverityFires when
critical log lineslog_critical_lines · CriticalLogLinewarningAt least one line at priority 0–2 (emergency, alert, critical: for example a kernel oops or an out-of-memory kill) in the last 10 minutes. Fires at once and resolves 10 minutes after the last such line
error-log burstlog_error_burst · ErrorLogBurstwarningMore than 30 lines at priority 0–3 (error or worse) within 15 minutes, for 5 minutes

SSH and sudo lines have no rule.

From your job reports.

NotificationRuleSeverityFires when
job faileduser_job_failed · UserJobFailedwarningThe job’s latest report has a non-zero exit code, for 5 minutes
job staleuser_job_stale · UserJobStalewarningThe job’s last successful run is older than the max_age_seconds it declared, for 5 minutes
  • A job that declares no max_age_seconds only gets job failed.
  • Stale counts from the last successful run. A job that has never succeeded never goes stale.

From your uptime checks. A check is Down only when both networks agree. Mixed and No data never alert.

NotificationRuleSeverityFires when
unreachable from outsidecheck_down · CheckDowncriticalThe check is Down for 1 minute
certificate expiringcheck_cert_expiring · CheckCertExpiringwarningThe certificate has less than 14 days left, for 15 minutes
certificate expires imminentlycheck_cert_expiring_critical · CheckCertExpiringCriticalcriticalThe certificate has less than 3 days left, for 15 minutes
slower than its budgetcheck_slow · CheckSlowwarningThe response time from either network is above the check’s latency budget for 10 minutes. Only for checks with a budget, which you set in the portal

The notification says “unreachable” rather than “down”, because it can appear next to a resource that Hetzner still reports as running.

While the critical alert fires, the matching warning is not sent.

While this firesit suppresseson the same
disk_space_criticaldisk_space_lowserver and mount point
disk_fills_within_4hdisk_fills_within_24hserver and mount point
thin_pool_space_criticalthin_pool_space_lowserver and thin pool
thin_pool_metadata_criticalthin_pool_metadata_lowserver and thin pool
check_cert_expiring_criticalcheck_cert_expiringcheck
ChannelSeveritiesMuted alerts
The app: Active alerts, History, the resource’s screenallshown, marked as muted
Push notificationsall; critical ones are time-sensitive on iPhonenot sent
Email digestwarning and critical, or critical onlynever included
Alert targets: webhook, PagerDutywarning and critical, or critical only, per targetnever sent

The digest and alert targets never carry alerts with severity info. None of the rules on this page is info. Setting up the digest and targets: Send alerts where you work.

  • Durations: 1 hour, 4 hours or 24 hours. The app can end a mute early with Unmute and lengthen it with Extend mute.
  • A muted alert keeps firing. It stays visible, marked as muted, and is recorded in the history.
  • Any team member can mute an alert in the app.
  • Alert history is kept for 90 days.
  • History in the app shows the last 30 days. Fired N× this week counts the last 7 days.
  • The Claude connector’s get_alert_history returns the last 7 days.
  • Load balancers, floating IPs, volumes, networks and primary IPs have no rules of their own. To watch a load balancer or a floating IP, add an uptime check anchored to it in the portal; its alerts then appear on that resource.
  • CPU on dedicated servers: the CPU rule reads Hetzner’s Cloud metrics, which dedicated servers do not have.
  • Load average, disk I/O and network traffic: charted, no rule.