diff --git a/platform/kubevirt/alerts.yaml b/platform/kubevirt/alerts.yaml index acb3c3a..fbaff98 100644 --- a/platform/kubevirt/alerts.yaml +++ b/platform/kubevirt/alerts.yaml @@ -43,12 +43,16 @@ spec: summary: "KubeVirt VM crash-looping: {{ $labels.namespace }}/{{ $labels.pod }}" description: "virt-launcher pod {{ $labels.namespace }}/{{ $labels.pod }} has restarted more than 3 times in 15m — the guest VM is crash-looping (panic / OOM / qemu crash)." runbook_url: "https://home.keithjackson.dev/runbooks/kubevirt-crashloop" - # Control plane down: virt-handler (the per-node virt agent) or the KubeVirt API is unreachable, - # so no VM lifecycle operations can proceed. absent() also fires if the whole target disappears. + # Control plane down: no virt-controller or virt-api replica reports ready, so no VM lifecycle + # operations can proceed. The metrics are `kubevirt_virt_{controller,api}_ready_status` (per-pod + # 1=ready); sum()==0 means every replica is unready. The absent() clause also fires if the whole + # KubeVirt metrics target disappears — its scrape job label is `kubevirt-prometheus-metrics` (the + # Service name), NOT `kubevirt`. - alert: KubeVirtControlPlaneDown expr: | - (kubevirt_virt_controller_ready == 0) - or (absent(up{job="kubevirt"} == 1)) + (sum(kubevirt_virt_controller_ready_status) == 0) + or (sum(kubevirt_virt_api_ready_status) == 0) + or (absent(up{job="kubevirt-prometheus-metrics"} == 1)) for: 10m labels: severity: critical