Skip to content

Kubernetes and Monitoring Stack Alerts⚓︎


xView runs its Kubernetes monitoring on the victoria-metrics-k8s-stack Helm chart, which ships a large body of alerting rules of its own: the Kubernetes and node_exporter mixins, the etcd mixin, and VictoriaMetrics' rules for its own components. This page is the reference for those alerts. They are evaluated and routed exactly like Expeto's own rules, which are documented separately on Platform and Infrastructure Alerts, xCore Alerts, and xControl Alerts.

Note

These rules are written and maintained upstream, not by Expeto. Their thresholds, wording, and severities change when the chart is upgraded. Everything below is generated from the chart version currently vendored in xView, so it describes what is actually deployed rather than what upstream publishes today.

How to read these alerts⚓︎

Each entry gives the alert's severity, how long its condition must hold before it fires, the trigger expression as deployed, the upstream description, and — where upstream provides one — a link to its runbook. The {{ ... }} placeholders in a description are substituted with the firing series' own labels when the notification is delivered.

Severity means the same thing here as on the Expeto alert pages:

Severity Meaning
Critical Service is impacted or imminently at risk — act now.
Warning Something is off and needs investigation soon, but service is not yet impacted.
Info An awareness signal. Review, but no immediate action is implied.
None Deliberately never routed to an operator. Only Watchdog and InfoInhibitor use it; both exist to drive Alertmanager itself.
— The rule ships no severity label at all, so Alertmanager applies its default route. Every etcd alert is in this category.

Some alerts are defined more than once under a single name — usually as a warning and a critical variant of the same condition at different thresholds, and in one case as four error-budget burn rate windows. Those appear as one entry with a row per variant.

Important

Unlike Expeto's rules, none of these carry the site_state guard, so putting a Site into maintenance does not suppress them. Silence them in Alertmanager for the duration of planned work instead.

Alerts operators most often ask about⚓︎

Operators integrating against the platform ask about the alerts below more than any others. It is a starting point for triage, not a statement of which alerts you should route or page on; the full reference follows.

Alert Group Severity
TargetDown General Warning
InfoInhibitor General None
KubePodCrashLooping Kubernetes workloads Warning
KubeStatefulSetReplicasMismatch Kubernetes workloads Warning
KubeDaemonSetRolloutStuck Kubernetes workloads Warning
KubeDaemonSetMisScheduled Kubernetes workloads Warning
CPUThrottlingHigh Kubernetes resource usage Info
KubeAggregatedAPIDown Kubernetes API server Warning
KubeControllerManagerInstanceUnreachable Kubernetes controller manager Warning
KubeSchedulerInstanceUnreachable Kubernetes scheduler Warning
KubeNodeNotReady Kubelet and node readiness Warning
KubeletInstanceUnreachable Kubelet and node readiness Warning
etcdMembersDown etcd —
etcdInsufficientMembers etcd —
NodeMemoryHighUtilization Host and node health Warning
NodeMemoryMajorPagesFaults Host and node health Warning
RemoteWriteConnectionIsSaturated vmagent metric collection Warning
TooHighSlowInsertsRate VictoriaMetrics single-node storage Warning
TooHighSlowInsertsRate VictoriaMetrics cluster storage Warning
TooManyLogs VictoriaMetrics process health Warning
TooHighCPUUsage VictoriaMetrics process health Critical

Alert summary⚓︎

Alert Group Severity Fires after
TargetDown General Warning 10m
Watchdog General None Immediately
InfoInhibitor General None Immediately
KubePodCrashLooping Kubernetes workloads Warning 15m
KubePodNotReady Kubernetes workloads Warning 15m
KubeDeploymentGenerationMismatch Kubernetes workloads Warning 15m
KubeDeploymentReplicasMismatch Kubernetes workloads Warning 15m
KubeDeploymentRolloutStuck Kubernetes workloads Warning 15m
KubeStatefulSetReplicasMismatch Kubernetes workloads Warning 15m
KubeStatefulSetGenerationMismatch Kubernetes workloads Warning 15m
KubeStatefulSetUpdateNotRolledOut Kubernetes workloads Warning 15m
KubeDaemonSetRolloutStuck Kubernetes workloads Warning 15m
KubeContainerWaiting Kubernetes workloads Warning 1h
KubeDaemonSetNotScheduled Kubernetes workloads Warning 10m
KubeDaemonSetMisScheduled Kubernetes workloads Warning 15m
KubeJobNotCompleted Kubernetes workloads Warning Immediately
KubeJobFailed Kubernetes workloads Warning 15m
KubeHpaReplicasMismatch Kubernetes workloads Warning 15m
KubeHpaMaxedOut Kubernetes workloads Warning 15m
KubePdbNotEnoughHealthyPods Kubernetes workloads Warning 15m
KubeCPUOvercommit Kubernetes resource usage Warning 10m
KubeMemoryOvercommit Kubernetes resource usage Warning 10m
KubeCPUQuotaOvercommit Kubernetes resource usage Warning 5m
KubeMemoryQuotaOvercommit Kubernetes resource usage Warning 5m
KubeQuotaAlmostFull Kubernetes resource usage Info 15m
KubeQuotaFullyUsed Kubernetes resource usage Info 15m
KubeQuotaExceeded Kubernetes resource usage Warning 15m
CPUThrottlingHigh Kubernetes resource usage Info 15m
KubePersistentVolumeFillingUp Kubernetes storage Critical / Warning 1m / 1h
KubePersistentVolumeInodesFillingUp Kubernetes storage Critical / Warning 1m / 1h
KubePersistentVolumeErrors Kubernetes storage Critical 5m
KubeVersionMismatch Kubernetes system components Warning 15m
KubeClientErrors Kubernetes system components Warning 15m
KubeClientCertificateExpiration Kubernetes API server Warning / Critical 5m
KubeAggregatedAPIErrors Kubernetes API server Warning 10m
KubeAggregatedAPIDown Kubernetes API server Warning 5m
KubeAPIDown Kubernetes API server Critical 15m
KubeAPIInstanceUnreachable Kubernetes API server Warning 15m
KubeAPITerminatedRequests Kubernetes API server Warning 5m
KubeAPIErrorBudgetBurn Kubernetes API server error budget Critical / Warning 2m / 15m / 1h / 3h
KubeControllerManagerDown Kubernetes controller manager Critical 15m
KubeControllerManagerInstanceUnreachable Kubernetes controller manager Warning 15m
KubeSchedulerDown Kubernetes scheduler Critical 15m
KubeSchedulerInstanceUnreachable Kubernetes scheduler Warning 15m
KubeNodeNotReady Kubelet and node readiness Warning 15m
KubeNodePressure Kubelet and node readiness Info 10m
KubeNodeUnreachable Kubelet and node readiness Warning 15m
KubeletTooManyPods Kubelet and node readiness Info 15m
KubeNodeReadinessFlapping Kubelet and node readiness Warning 15m
KubeNodeEviction Kubelet and node readiness Info Immediately
KubeletPlegDurationHigh Kubelet and node readiness Warning 5m
KubeletPodStartUpLatencyHigh Kubelet and node readiness Warning 15m
KubeletClientCertificateExpiration Kubelet and node readiness Warning / Critical Immediately
KubeletServerCertificateExpiration Kubelet and node readiness Warning / Critical Immediately
KubeletClientCertificateRenewalErrors Kubelet and node readiness Warning 15m
KubeletServerCertificateRenewalErrors Kubelet and node readiness Warning 15m
KubeletInstanceUnreachable Kubelet and node readiness Warning 15m
KubeletDown Kubelet and node readiness Critical 15m
KubeStateMetricsListErrors kube-state-metrics Critical 15m
KubeStateMetricsWatchErrors kube-state-metrics Critical 15m
KubeStateMetricsShardingMismatch kube-state-metrics Critical 15m
KubeStateMetricsShardsMissing kube-state-metrics Critical 15m
etcdMembersDown etcd — Immediately
etcdInsufficientMembers etcd — Immediately
etcdNoLeader etcd — Immediately
etcdHighNumberOfLeaderChanges etcd — Immediately
etcdHighNumberOfFailedGRPCRequests etcd — Immediately
etcdGRPCRequestsSlow etcd — Immediately
etcdMemberCommunicationSlow etcd — Immediately
etcdHighNumberOfFailedProposals etcd — Immediately
etcdHighFsyncDurations etcd — Immediately
etcdHighCommitDurations etcd — Immediately
etcdDatabaseQuotaLowSpace etcd — Immediately
etcdExcessiveDatabaseGrowth etcd — Immediately
etcdDatabaseHighFragmentationRatio etcd — Immediately
NodeFilesystemSpaceFillingUp Host and node health Warning / Critical 1h
NodeFilesystemAlmostOutOfSpace Host and node health Warning / Critical 30m
NodeFilesystemFilesFillingUp Host and node health Warning / Critical 1h
NodeFilesystemAlmostOutOfFiles Host and node health Warning / Critical 1h
NodeNetworkReceiveErrs Host and node health Warning 1h
NodeNetworkTransmitErrs Host and node health Warning 1h
NodeHighNumberConntrackEntriesUsed Host and node health Warning Immediately
NodeTextFileCollectorScrapeError Host and node health Warning Immediately
NodeClockSkewDetected Host and node health Warning 10m
NodeClockNotSynchronising Host and node health Warning 10m
NodeRAIDDegraded Host and node health Critical 15m
NodeRAIDDiskFailure Host and node health Warning Immediately
NodeFileDescriptorLimit Host and node health Warning / Critical 15m
NodeCPUHighUsage Host and node health Info 15m
NodeSystemSaturation Host and node health Warning 15m
NodeMemoryMajorPagesFaults Host and node health Warning 15m
NodeMemoryHighUtilization Host and node health Warning 15m
NodeDiskIOSaturation Host and node health Warning 30m
NodeSystemdServiceFailed Host and node health Warning 5m
NodeSystemdServiceCrashlooping Host and node health Warning 15m
NodeBondingDegraded Host and node health Warning 5m
NodeNetworkInterfaceFlapping Host networking Warning 2m
AlertmanagerFailedReload Alertmanager Critical 10m
AlertmanagerMembersInconsistent Alertmanager Critical 15m
AlertmanagerFailedToSendAlerts Alertmanager Warning 5m
AlertmanagerClusterFailedToSendAlerts Alertmanager Critical / Warning 5m
AlertmanagerConfigInconsistent Alertmanager Critical 20m
AlertmanagerClusterDown Alertmanager Critical 5m
AlertmanagerClusterCrashlooping Alertmanager Critical 5m
PersistentQueueIsDroppingData vmagent metric collection Critical 10m
RejectedRemoteWriteDataBlocksAreDropped vmagent metric collection Warning 15m
TooManyScrapeErrors vmagent metric collection Warning 15m
ScrapePoolHasNoTargets vmagent metric collection Warning 30m
TooManyWriteErrors vmagent metric collection Warning 15m
TooManyRemoteWriteErrors vmagent metric collection Warning 15m
RemoteWriteConnectionIsSaturated vmagent metric collection Warning 15m
PersistentQueueForWritesIsSaturated vmagent metric collection Warning 15m
PersistentQueueForReadsIsSaturated vmagent metric collection Warning 15m
SeriesLimitHourReached vmagent metric collection Critical Immediately
SeriesLimitDayReached vmagent metric collection Critical Immediately
ConfigurationReloadFailure vmagent metric collection Warning Immediately
StreamAggrFlushTimeout vmagent metric collection Warning Immediately
StreamAggrDedupFlushTimeout vmagent metric collection Warning Immediately
PersistentQueueRunsOutOfSpaceIn12Hours vmagent metric collection Warning 10m
PersistentQueueRunsOutOfSpaceIn4Hours vmagent metric collection Critical 10m
ConfigurationReloadFailure vmalert rule evaluation Warning Immediately
AlertingRulesError vmalert rule evaluation Warning 5m
RecordingRulesError vmalert rule evaluation Warning 5m
RecordingRulesNoData vmalert rule evaluation Info 30m
TooManyMissedIterations vmalert rule evaluation Warning 15m
RemoteWriteErrors vmalert rule evaluation Warning 15m
RemoteWriteDroppingData vmalert rule evaluation Critical 5m
RemoteWriteQueueHighUsage vmalert rule evaluation Warning 15m
AlertmanagerErrors vmalert rule evaluation Warning 15m
DiskRunsOutOfSpaceIn3Days VictoriaMetrics single-node storage Critical 30m
NodeBecomesReadonlyIn3Days VictoriaMetrics single-node storage Warning 30m
DiskRunsOutOfSpace VictoriaMetrics single-node storage Critical 30m
RequestErrorsToAPI VictoriaMetrics single-node storage Warning 15m
TooHighChurnRate VictoriaMetrics single-node storage Warning 15m
TooHighChurnRate24h VictoriaMetrics single-node storage Warning 15m
TooHighSlowInsertsRate VictoriaMetrics single-node storage Warning 15m
MetadataCacheUtilizationIsTooHigh VictoriaMetrics single-node storage Warning 15m
DiskRunsOutOfSpaceIn3Days VictoriaMetrics cluster storage Critical 30m
NodeBecomesReadonlyIn3Days VictoriaMetrics cluster storage Warning 30m
DiskRunsOutOfSpace VictoriaMetrics cluster storage Critical 30m
RequestErrorsToAPI VictoriaMetrics cluster storage Warning 15m
RPCErrors VictoriaMetrics cluster storage Warning 15m
TooHighChurnRate VictoriaMetrics cluster storage Warning 15m
TooHighChurnRate24h VictoriaMetrics cluster storage Warning 15m
TooHighSlowInsertsRate VictoriaMetrics cluster storage Warning 15m
VminsertVmstorageConnectionIsSaturated VictoriaMetrics cluster storage Warning 15m
MetadataCacheUtilizationIsTooHigh VictoriaMetrics cluster storage Warning 15m
MetricNameStatsCacheUtilizationIsTooHigh VictoriaMetrics cluster storage Warning 15m
IndexDBRecordsDrop VictoriaMetrics cluster storage Critical Immediately
TooManyTSIDMisses VictoriaMetrics cluster storage Critical 15m
TooManyRestarts VictoriaMetrics process health Critical Immediately
ServiceDown VictoriaMetrics process health Critical 2m
ProcessNearFDLimits VictoriaMetrics process health Critical 5m
TooHighMemoryUsage VictoriaMetrics process health Critical 5m
TooHighCPUUsage VictoriaMetrics process health Critical 5m
TooHighGoroutineSchedulingLatency VictoriaMetrics process health Critical 15m
TooManyLogs VictoriaMetrics process health Warning 15m
ConcurrentInsertsHitTheLimit VictoriaMetrics process health Warning 15m
TooHighQueryLoad VictoriaMetrics process health Warning 15m
RowsRejectedOnIngestion VictoriaMetrics process health Warning 15m
LogErrors VictoriaMetrics operator Warning 15m
ReconcileErrors VictoriaMetrics operator Warning 10m
HighQueueDepth VictoriaMetrics operator Warning 15m

General⚓︎

Chart-wide signals rather than alerts about any one component. TargetDown reports that a meaningful share of a scrape job's targets are unreachable. The other two never reach an operator: Watchdog fires permanently so that a dead alerting pipeline can be detected by its absence, and InfoInhibitor exists so Alertmanager can suppress info-level noise while a real alert is already firing for the same namespace.

TargetDown⚓︎

Severity Fires after
Warning 10m

One or more targets are unreachable.

{{ printf "%.4g" $value }}% of the {{ $labels.job }}/{{ $labels.service }} targets in {{ $labels.namespace }} namespace are down.

Trigger condition

(100 * (count(up == 0) by(cluster,job,namespace,service) / count(up) by(cluster,job,namespace,service))) > 10

Upstream runbook for TargetDown

Watchdog⚓︎

Severity Fires after
None Immediately

An alert that should always be firing to certify that Alertmanager is working properly.

This is an alert meant to ensure that the entire alerting pipeline is functional. This alert is always firing, therefore it should always be firing in Alertmanager and always fire against a receiver. There are integrations with various notification mechanisms that send a notification when this alert is not firing. For example the "DeadMansSnitch" integration in PagerDuty.

Trigger condition

vector(1)

Upstream runbook for Watchdog

InfoInhibitor⚓︎

Severity Fires after
None Immediately

Info-level alert inhibition.

This is an alert that is used to inhibit info alerts. By themselves, the info-level alerts are sometimes very noisy, but they are relevant when combined with other alerts. This alert fires whenever there's a severity="info" alert, and stops firing when another alert with a severity of 'warning' or 'critical' starts firing on the same namespace. This alert should be routed to a null receiver and configured to inhibit alerts with severity="info".

Trigger condition

group(ALERTS{severity="info"} == 1) by(namespace,cluster) unless on(namespace,cluster) group(ALERTS{alertname!="InfoInhibitor",alertstate="firing",severity=~"warning|critical"} == 1) by(namespace,cluster)

Upstream runbook for InfoInhibitor

Kubernetes workloads⚓︎

Workload-level alerts derived from kube-state-metrics: Deployments, StatefulSets, DaemonSets, Jobs, HorizontalPodAutoscalers, PodDisruptionBudgets, and individual Pods. Most wait 15 minutes before firing, which is long enough to ride out a normal rollout.

KubePodCrashLooping⚓︎

Severity Fires after
Warning 15m

Pod is crash looping.

Pod {{ $labels.namespace }}/{{ $labels.pod }} ({{ $labels.container }}) is in waiting state (reason: "CrashLoopBackOff") on cluster {{ $labels.cluster }}.

Trigger condition

max_over_time(kube_pod_container_status_waiting_reason{reason="CrashLoopBackOff",namespace=~".*",job="kube-state-metrics"}[5m]) >= 1

Upstream runbook for KubePodCrashLooping

KubePodNotReady⚓︎

Severity Fires after
Warning 15m

Pod has been in a non-ready state for more than 15 minutes.

Pod {{ $labels.namespace }}/{{ $labels.pod }} has been in a non-ready state for longer than 15 minutes on cluster {{ $labels.cluster }}.

Trigger condition

sum(max(kube_pod_status_phase{namespace=~".*",job="kube-state-metrics",phase=~"Pending|Unknown"}) by(namespace,pod,job,cluster) * on(namespace,pod,cluster) group_left() topk(1, max(kube_pod_owner{owner_kind!="Job"}) by(namespace,pod,owner_kind,cluster)) by(namespace,pod,cluster)) by(namespace,pod,job,cluster) > 0

Upstream runbook for KubePodNotReady

KubeDeploymentGenerationMismatch⚓︎

Severity Fires after
Warning 15m

Deployment generation mismatch due to possible roll-back

Deployment generation for {{ $labels.namespace }}/{{ $labels.deployment }} does not match, this indicates that the Deployment has failed but has not been rolled back on cluster {{ $labels.cluster }}.

Trigger condition

kube_deployment_status_observed_generation{namespace=~".*",job="kube-state-metrics"} != kube_deployment_metadata_generation{namespace=~".*",job="kube-state-metrics"}

Upstream runbook for KubeDeploymentGenerationMismatch

KubeDeploymentReplicasMismatch⚓︎

Severity Fires after
Warning 15m

Deployment has not matched the expected number of replicas.

Deployment {{ $labels.namespace }}/{{ $labels.deployment }} has not matched the expected number of replicas for longer than 15 minutes on cluster {{ $labels.cluster }}.

Trigger condition

(kube_deployment_spec_replicas{namespace=~".*",job="kube-state-metrics"} > kube_deployment_status_replicas_available{namespace=~".*",job="kube-state-metrics"}) and (changes(kube_deployment_status_replicas_updated{namespace=~".*",job="kube-state-metrics"}[10m]) == 0)

Upstream runbook for KubeDeploymentReplicasMismatch

KubeDeploymentRolloutStuck⚓︎

Severity Fires after
Warning 15m

Deployment rollout is not progressing.

Rollout of deployment {{ $labels.namespace }}/{{ $labels.deployment }} is not progressing for longer than 15 minutes on cluster {{ $labels.cluster }}.

Trigger condition

kube_deployment_status_condition{condition="Progressing",status="false",namespace=~".*",job="kube-state-metrics"} != 0

Upstream runbook for KubeDeploymentRolloutStuck

KubeStatefulSetReplicasMismatch⚓︎

Severity Fires after
Warning 15m

StatefulSet has not matched the expected number of replicas.

StatefulSet {{ $labels.namespace }}/{{ $labels.statefulset }} has not matched the expected number of replicas for longer than 15 minutes on cluster {{ $labels.cluster }}.

Trigger condition

(kube_statefulset_status_replicas_ready{namespace=~".*",job="kube-state-metrics"} != kube_statefulset_replicas{namespace=~".*",job="kube-state-metrics"}) and (changes(kube_statefulset_status_replicas_updated{namespace=~".*",job="kube-state-metrics"}[10m]) == 0)

Upstream runbook for KubeStatefulSetReplicasMismatch

KubeStatefulSetGenerationMismatch⚓︎

Severity Fires after
Warning 15m

StatefulSet generation mismatch due to possible roll-back

StatefulSet generation for {{ $labels.namespace }}/{{ $labels.statefulset }} does not match, this indicates that the StatefulSet has failed but has not been rolled back on cluster {{ $labels.cluster }}.

Trigger condition

kube_statefulset_status_observed_generation{namespace=~".*",job="kube-state-metrics"} != kube_statefulset_metadata_generation{namespace=~".*",job="kube-state-metrics"}

Upstream runbook for KubeStatefulSetGenerationMismatch

KubeStatefulSetUpdateNotRolledOut⚓︎

Severity Fires after
Warning 15m

StatefulSet update has not been rolled out.

StatefulSet {{ $labels.namespace }}/{{ $labels.statefulset }} update has not been rolled out on cluster {{ $labels.cluster }}.

Trigger condition

(max(kube_statefulset_status_current_revision{namespace=~".*",job="kube-state-metrics"} unless kube_statefulset_status_update_revision{namespace=~".*",job="kube-state-metrics"}) by(namespace,statefulset,job,cluster) * on(namespace,statefulset,job,cluster) (kube_statefulset_replicas{namespace=~".*",job="kube-state-metrics"} != kube_statefulset_status_replicas_updated{namespace=~".*",job="kube-state-metrics"})) and on(namespace,statefulset,job,cluster) (changes(kube_statefulset_status_replicas_updated{namespace=~".*",job="kube-state-metrics"}[5m]) == 0)

Upstream runbook for KubeStatefulSetUpdateNotRolledOut

KubeDaemonSetRolloutStuck⚓︎

Severity Fires after
Warning 15m

DaemonSet rollout is stuck.

DaemonSet {{ $labels.namespace }}/{{ $labels.daemonset }} has not finished or progressed for at least 15m on cluster {{ $labels.cluster }}.

Trigger condition

((((kube_daemonset_status_current_number_scheduled{namespace=~".*",job="kube-state-metrics"} != kube_daemonset_status_desired_number_scheduled{namespace=~".*",job="kube-state-metrics"}) or (kube_daemonset_status_number_misscheduled{namespace=~".*",job="kube-state-metrics"} != 0)) or (kube_daemonset_status_updated_number_scheduled{namespace=~".*",job="kube-state-metrics"} != kube_daemonset_status_desired_number_scheduled{namespace=~".*",job="kube-state-metrics"})) or (kube_daemonset_status_number_available{namespace=~".*",job="kube-state-metrics"} != kube_daemonset_status_desired_number_scheduled{namespace=~".*",job="kube-state-metrics"})) and (changes(kube_daemonset_status_updated_number_scheduled{namespace=~".*",job="kube-state-metrics"}[5m]) == 0)

Upstream runbook for KubeDaemonSetRolloutStuck

KubeContainerWaiting⚓︎

Severity Fires after
Warning 1h

Pod container waiting longer than 1 hour

pod/{{ $labels.pod }} in namespace {{ $labels.namespace }} on container {{ $labels.container}} has been in waiting state for longer than 1 hour. (reason: "{{ $labels.reason }}") on cluster {{ $labels.cluster }}.

Trigger condition

kube_pod_container_status_waiting_reason{reason!="CrashLoopBackOff",namespace=~".*",job="kube-state-metrics"} > 0

Upstream runbook for KubeContainerWaiting

KubeDaemonSetNotScheduled⚓︎

Severity Fires after
Warning 10m

DaemonSet pods are not scheduled.

{{ $value }} Pods of DaemonSet {{ $labels.namespace }}/{{ $labels.daemonset }} are not scheduled on cluster {{ $labels.cluster }}.

Trigger condition

(kube_daemonset_status_desired_number_scheduled{namespace=~".*",job="kube-state-metrics"} - kube_daemonset_status_current_number_scheduled{namespace=~".*",job="kube-state-metrics"}) > 0

Upstream runbook for KubeDaemonSetNotScheduled

KubeDaemonSetMisScheduled⚓︎

Severity Fires after
Warning 15m

DaemonSet pods are misscheduled.

{{ $value }} Pods of DaemonSet {{ $labels.namespace }}/{{ $labels.daemonset }} are running where they are not supposed to run on cluster {{ $labels.cluster }}.

Trigger condition

kube_daemonset_status_number_misscheduled{namespace=~".*",job="kube-state-metrics"} > 0

Upstream runbook for KubeDaemonSetMisScheduled

KubeJobNotCompleted⚓︎

Severity Fires after
Warning Immediately

Job did not complete in time

Job {{ $labels.namespace }}/{{ $labels.job_name }} is taking more than {{ "43200" | humanizeDuration }} to complete on cluster {{ $labels.cluster }}.

Trigger condition

(time() - max(kube_job_status_start_time{namespace=~".*",job="kube-state-metrics"} and (kube_job_status_active{namespace=~".*",job="kube-state-metrics"} > 0)) by(namespace,job_name,cluster)) > 43200

Upstream runbook for KubeJobNotCompleted

KubeJobFailed⚓︎

Severity Fires after
Warning 15m

Job failed to complete.

Job {{ $labels.namespace }}/{{ $labels.job_name }} failed to complete. Removing failed job after investigation should clear this alert on cluster {{ $labels.cluster }}.

Trigger condition

kube_job_failed{namespace=~".*",job="kube-state-metrics"} > 0

Upstream runbook for KubeJobFailed

KubeHpaReplicasMismatch⚓︎

Severity Fires after
Warning 15m

HPA has not matched desired number of replicas.

HPA {{ $labels.namespace }}/{{ $labels.horizontalpodautoscaler }} has not matched the desired number of replicas for longer than 15 minutes on cluster {{ $labels.cluster }}.

Trigger condition

(((kube_horizontalpodautoscaler_status_desired_replicas{namespace=~".*",job="kube-state-metrics"} != kube_horizontalpodautoscaler_status_current_replicas{namespace=~".*",job="kube-state-metrics"}) and (kube_horizontalpodautoscaler_status_current_replicas{namespace=~".*",job="kube-state-metrics"} > kube_horizontalpodautoscaler_spec_min_replicas{namespace=~".*",job="kube-state-metrics"})) and (kube_horizontalpodautoscaler_status_current_replicas{namespace=~".*",job="kube-state-metrics"} < kube_horizontalpodautoscaler_spec_max_replicas{namespace=~".*",job="kube-state-metrics"})) and (changes(kube_horizontalpodautoscaler_status_current_replicas{namespace=~".*",job="kube-state-metrics"}[15m]) == 0)

Upstream runbook for KubeHpaReplicasMismatch

KubeHpaMaxedOut⚓︎

Severity Fires after
Warning 15m

HPA is running at max replicas

HPA {{ $labels.namespace }}/{{ $labels.horizontalpodautoscaler }} has been running at max replicas for longer than 15 minutes on cluster {{ $labels.cluster }}.

Trigger condition

(kube_horizontalpodautoscaler_status_current_replicas{namespace=~".*",job="kube-state-metrics"} == kube_horizontalpodautoscaler_spec_max_replicas{namespace=~".*",job="kube-state-metrics"}) and on(namespace,horizontalpodautoscaler,cluster) (kube_horizontalpodautoscaler_spec_max_replicas{namespace=~".*",job="kube-state-metrics"} != kube_horizontalpodautoscaler_spec_min_replicas{namespace=~".*",job="kube-state-metrics"})

Upstream runbook for KubeHpaMaxedOut

KubePdbNotEnoughHealthyPods⚓︎

Severity Fires after
Warning 15m

PDB does not have enough healthy pods.

PDB {{ $labels.cluster }}/{{ $labels.namespace }}/{{ $labels.poddisruptionbudget }} expects {{ $value }} more healthy pods. The desired number of healthy pods has not been met for at least 15m.

Trigger condition

(kube_poddisruptionbudget_status_desired_healthy{namespace=~".*",job="kube-state-metrics"} - kube_poddisruptionbudget_status_current_healthy{namespace=~".*",job="kube-state-metrics"}) > 0

Upstream runbook for KubePdbNotEnoughHealthyPods

Kubernetes resource usage⚓︎

Pod requests, limits, and namespace quotas measured against what the cluster can actually schedule. These describe capacity planning rather than a live outage — an overcommitted cluster runs fine until a node is lost.

KubeCPUOvercommit⚓︎

Severity Fires after
Warning 10m

Cluster has overcommitted CPU resource requests.

Cluster {{ $labels.cluster }} has overcommitted CPU resource requests for Pods by {{ printf "%.2f" $value }} CPU shares and cannot tolerate node failure.

Trigger condition

(((sum(namespace_cpu:kube_pod_container_resource_requests:sum) by(cluster) - sum(kube_node_status_allocatable{job="kube-state-metrics",resource="cpu"}) by(cluster)) > 0) and (count(max(kube_node_role{job="kube-state-metrics",role="control-plane"}) by(cluster,node)) by(cluster) < 3)) or ((sum(namespace_cpu:kube_pod_container_resource_requests:sum) by(cluster) - ((sum(kube_node_status_allocatable{job="kube-state-metrics",resource="cpu"}) by(cluster) - max(kube_node_status_allocatable{job="kube-state-metrics",resource="cpu"}) by(cluster)) > 0)) > 0)

Upstream runbook for KubeCPUOvercommit

KubeMemoryOvercommit⚓︎

Severity Fires after
Warning 10m

Cluster has overcommitted memory resource requests.

Cluster {{ $labels.cluster }} has overcommitted memory resource requests for Pods by {{ $value | humanize }} bytes and cannot tolerate node failure.

Trigger condition

(((sum(namespace_memory:kube_pod_container_resource_requests:sum) by(cluster) - sum(kube_node_status_allocatable{job="kube-state-metrics",resource="memory"}) by(cluster)) > 0) and (count(max(kube_node_role{job="kube-state-metrics",role="control-plane"}) by(cluster,node)) by(cluster) < 3)) or ((sum(namespace_memory:kube_pod_container_resource_requests:sum) by(cluster) - ((sum(kube_node_status_allocatable{job="kube-state-metrics",resource="memory"}) by(cluster) - max(kube_node_status_allocatable{job="kube-state-metrics",resource="memory"}) by(cluster)) > 0)) > 0)

Upstream runbook for KubeMemoryOvercommit

KubeCPUQuotaOvercommit⚓︎

Severity Fires after
Warning 5m

Cluster has overcommitted CPU resource requests.

Cluster {{ $labels.cluster }} has overcommitted CPU resource requests for Namespaces.

Trigger condition

(sum(min(kube_resourcequota{job="kube-state-metrics",type="hard",resource=~"(cpu|requests.cpu)"}) without(resource)) by(cluster) / sum(kube_node_status_allocatable{resource="cpu",job="kube-state-metrics"}) by(cluster)) > 1.5

Upstream runbook for KubeCPUQuotaOvercommit

KubeMemoryQuotaOvercommit⚓︎

Severity Fires after
Warning 5m

Cluster has overcommitted memory resource requests.

Cluster {{ $labels.cluster }} has overcommitted memory resource requests for Namespaces.

Trigger condition

(sum(min(kube_resourcequota{job="kube-state-metrics",type="hard",resource=~"(memory|requests.memory)"}) without(resource)) by(cluster) / sum(kube_node_status_allocatable{resource="memory",job="kube-state-metrics"}) by(cluster)) > 1.5

Upstream runbook for KubeMemoryQuotaOvercommit

KubeQuotaAlmostFull⚓︎

Severity Fires after
Info 15m

Namespace quota is going to be full.

Namespace {{ $labels.namespace }} is using {{ $value | humanizePercentage }} of its {{ $labels.resource }} quota on cluster {{ $labels.cluster }}.

Trigger condition

((max(kube_resourcequota{job="kube-state-metrics",type="used"}) without(instance,job,type) / on(cluster,namespace,resource,resourcequota) group_left() (max(kube_resourcequota{job="kube-state-metrics",type="hard"}) without(instance,job,type) > 0)) > 0.9) < 1

Upstream runbook for KubeQuotaAlmostFull

KubeQuotaFullyUsed⚓︎

Severity Fires after
Info 15m

Namespace quota is fully used.

Namespace {{ $labels.namespace }} is using {{ $value | humanizePercentage }} of its {{ $labels.resource }} quota on cluster {{ $labels.cluster }}.

Trigger condition

(max(kube_resourcequota{job="kube-state-metrics",type="used"}) without(instance,job,type) / on(cluster,namespace,resource,resourcequota) group_left() (max(kube_resourcequota{job="kube-state-metrics",type="hard"}) without(instance,job,type) > 0)) == 1

Upstream runbook for KubeQuotaFullyUsed

KubeQuotaExceeded⚓︎

Severity Fires after
Warning 15m

Namespace quota has exceeded the limits.

Namespace {{ $labels.namespace }} is using {{ $value | humanizePercentage }} of its {{ $labels.resource }} quota on cluster {{ $labels.cluster }}.

Trigger condition

(max(kube_resourcequota{job="kube-state-metrics",type="used"}) without(instance,job,type) / on(cluster,namespace,resource,resourcequota) group_left() (max(kube_resourcequota{job="kube-state-metrics",type="hard"}) without(instance,job,type) > 0)) > 1

Upstream runbook for KubeQuotaExceeded

CPUThrottlingHigh⚓︎

Severity Fires after
Info 15m

Processes experience elevated CPU throttling.

{{ $value | humanizePercentage }} throttling of CPU in namespace {{ $labels.namespace }} for container {{ $labels.container }} in pod {{ $labels.pod }} on cluster {{ $labels.cluster }}.

Trigger condition

(sum(topk(1, increase(container_cpu_cfs_throttled_periods_total{container!="",job="kubelet",metrics_path="/metrics/cadvisor"}[5m])) by(cluster,namespace,pod,container,instance)) without(id,metrics_path,name,image,endpoint,job,node) / on(cluster,namespace,pod,container,instance) group_left() sum(topk(1, increase(container_cpu_cfs_periods_total{job="kubelet",metrics_path="/metrics/cadvisor"}[5m])) by(cluster,namespace,pod,container,instance)) without(id,metrics_path,name,image,endpoint,job,node)) > 0.25

Upstream runbook for CPUThrottlingHigh

Kubernetes storage⚓︎

PersistentVolume capacity, inode exhaustion, and provisioning failures. The two filling-up alerts combine a current threshold with a predict_linear forecast, so they fire before the volume is actually full.

KubePersistentVolumeFillingUp⚓︎

Severity Fires after
Critical 1m
Warning 1h

PersistentVolume is filling up.

This alert is defined in 2 variants:

Critical, fires after 1m

The PersistentVolume claimed by {{ $labels.persistentvolumeclaim }} in Namespace {{ $labels.namespace }} on Cluster {{ $labels.cluster }} is only {{ $value | humanizePercentage }} free.

((((kubelet_volume_stats_available_bytes{namespace=~".*",job="kubelet",metrics_path="/metrics"} / kubelet_volume_stats_capacity_bytes{namespace=~".*",job="kubelet",metrics_path="/metrics"}) < 0.03) and (kubelet_volume_stats_used_bytes{namespace=~".*",job="kubelet",metrics_path="/metrics"} > 0)) unless on(cluster,namespace,persistentvolumeclaim) (kube_persistentvolumeclaim_access_mode{access_mode="ReadOnlyMany"} == 1)) unless on(cluster,namespace,persistentvolumeclaim) (kube_persistentvolumeclaim_labels{label_excluded_from_alerts="true"} == 1)

Warning, fires after 1h

Based on recent sampling, the PersistentVolume claimed by {{ $labels.persistentvolumeclaim }} in Namespace {{ $labels.namespace }} on Cluster {{ $labels.cluster }} is expected to fill up within four days. Currently {{ $value | humanizePercentage }} is available.

(((((kubelet_volume_stats_available_bytes{namespace=~".*",job="kubelet",metrics_path="/metrics"} / kubelet_volume_stats_capacity_bytes{namespace=~".*",job="kubelet",metrics_path="/metrics"}) < 0.15) and (kubelet_volume_stats_used_bytes{namespace=~".*",job="kubelet",metrics_path="/metrics"} > 0)) and (predict_linear(kubelet_volume_stats_available_bytes{namespace=~".*",job="kubelet",metrics_path="/metrics"}[6h], 345600) < 0)) unless on(cluster,namespace,persistentvolumeclaim) (kube_persistentvolumeclaim_access_mode{access_mode="ReadOnlyMany"} == 1)) unless on(cluster,namespace,persistentvolumeclaim) (kube_persistentvolumeclaim_labels{label_excluded_from_alerts="true"} == 1)

Upstream runbook for KubePersistentVolumeFillingUp

KubePersistentVolumeInodesFillingUp⚓︎

Severity Fires after
Critical 1m
Warning 1h

PersistentVolumeInodes are filling up.

This alert is defined in 2 variants:

Critical, fires after 1m

The PersistentVolume claimed by {{ $labels.persistentvolumeclaim }} in Namespace {{ $labels.namespace }} on Cluster {{ $labels.cluster }} only has {{ $value | humanizePercentage }} free inodes.

((((kubelet_volume_stats_inodes_free{namespace=~".*",job="kubelet",metrics_path="/metrics"} / kubelet_volume_stats_inodes{namespace=~".*",job="kubelet",metrics_path="/metrics"}) < 0.03) and (kubelet_volume_stats_inodes_used{namespace=~".*",job="kubelet",metrics_path="/metrics"} > 0)) unless on(cluster,namespace,persistentvolumeclaim) (kube_persistentvolumeclaim_access_mode{access_mode="ReadOnlyMany"} == 1)) unless on(cluster,namespace,persistentvolumeclaim) (kube_persistentvolumeclaim_labels{label_excluded_from_alerts="true"} == 1)

Warning, fires after 1h

Based on recent sampling, the PersistentVolume claimed by {{ $labels.persistentvolumeclaim }} in Namespace {{ $labels.namespace }} on Cluster {{ $labels.cluster }} is expected to run out of inodes within four days. Currently {{ $value | humanizePercentage }} of its inodes are free.

(((((kubelet_volume_stats_inodes_free{namespace=~".*",job="kubelet",metrics_path="/metrics"} / kubelet_volume_stats_inodes{namespace=~".*",job="kubelet",metrics_path="/metrics"}) < 0.15) and (kubelet_volume_stats_inodes_used{namespace=~".*",job="kubelet",metrics_path="/metrics"} > 0)) and (predict_linear(kubelet_volume_stats_inodes_free{namespace=~".*",job="kubelet",metrics_path="/metrics"}[6h], 345600) < 0)) unless on(cluster,namespace,persistentvolumeclaim) (kube_persistentvolumeclaim_access_mode{access_mode="ReadOnlyMany"} == 1)) unless on(cluster,namespace,persistentvolumeclaim) (kube_persistentvolumeclaim_labels{label_excluded_from_alerts="true"} == 1)

Upstream runbook for KubePersistentVolumeInodesFillingUp

KubePersistentVolumeErrors⚓︎

Severity Fires after
Critical 5m

PersistentVolume is having issues with provisioning.

The persistent volume {{ $labels.persistentvolume }} on Cluster {{ $labels.cluster }} has status {{ $labels.phase }}.

Trigger condition

kube_persistentvolume_status_phase{phase=~"Failed|Pending",job="kube-state-metrics"} > 0

Upstream runbook for KubePersistentVolumeErrors

Kubernetes system components⚓︎

Cross-component consistency: version skew between control-plane components, and Kubernetes API clients whose requests are failing.

KubeVersionMismatch⚓︎

Severity Fires after
Warning 15m

Different semantic versions of Kubernetes components running.

There are {{ $value }} different semantic versions of Kubernetes components running on cluster {{ $labels.cluster }}.

Trigger condition

count(count(label_replace(kubernetes_build_info{job!~"kube-dns|coredns"}, "git_version", "$1", "git_version", "(v[0-9]*.[0-9]*).*")) by(git_version,cluster)) by(cluster) > 1

Upstream runbook for KubeVersionMismatch

KubeClientErrors⚓︎

Severity Fires after
Warning 15m

Kubernetes API server client is experiencing errors.

Kubernetes API server client '{{ $labels.job }}/{{ $labels.instance }}' is experiencing {{ $value | humanizePercentage }} errors on cluster {{ $labels.cluster }}.

Trigger condition

(sum(rate(rest_client_requests_total{job="apiserver",code=~"5.."}[5m])) by(cluster,instance,job,namespace) / sum(rate(rest_client_requests_total{job="apiserver"}[5m])) by(cluster,instance,job,namespace)) > 0.01

Upstream runbook for KubeClientErrors

Kubernetes API server⚓︎

Availability of the API server itself, certificate expiry for its clients, health of aggregated (extension) APIs, and requests the server is terminating under load. A failure here disables scheduling and rollouts even while running workloads keep serving traffic.

KubeClientCertificateExpiration⚓︎

Severity Fires after
Warning 5m
Critical 5m

Client certificate is about to expire.

This alert is defined in 2 variants:

Warning, fires after 5m

A client certificate used to authenticate to kubernetes apiserver is expiring in less than 7.0 days on cluster {{ $labels.cluster }}.

(histogram_quantile(0.01, sum(rate(apiserver_client_certificate_expiration_seconds_bucket{job="apiserver"}[5m])) without(namespace,service,endpoint)) < 604800) and on(job,cluster,instance) (apiserver_client_certificate_expiration_seconds_count{job="apiserver"} > 0)

Critical, fires after 5m

A client certificate used to authenticate to kubernetes apiserver is expiring in less than 24.0 hours on cluster {{ $labels.cluster }}.

(histogram_quantile(0.01, sum(rate(apiserver_client_certificate_expiration_seconds_bucket{job="apiserver"}[5m])) without(namespace,service,endpoint)) < 86400) and on(job,cluster,instance) (apiserver_client_certificate_expiration_seconds_count{job="apiserver"} > 0)

Upstream runbook for KubeClientCertificateExpiration

KubeAggregatedAPIErrors⚓︎

Severity Fires after
Warning 10m

Kubernetes aggregated API has reported errors.

Kubernetes aggregated API {{ $labels.instance }}/{{ $labels.name }} has reported {{ $labels.reason }} errors on cluster {{ $labels.cluster }}.

Trigger condition

sum(increase(aggregator_unavailable_apiservice_total{job="apiserver"}[1m])) by(cluster,instance,name,reason) > 0

Upstream runbook for KubeAggregatedAPIErrors

KubeAggregatedAPIDown⚓︎

Severity Fires after
Warning 5m

Kubernetes aggregated API is down.

Kubernetes aggregated API {{ $labels.name }}/{{ $labels.namespace }} has been only {{ $value | humanize }}% available over the last 10m on cluster {{ $labels.cluster }}.

Trigger condition

((1 - max(avg_over_time(aggregator_unavailable_apiservice{job="apiserver"}[10m])) by(name,namespace,cluster)) * 100) < 85

Upstream runbook for KubeAggregatedAPIDown

KubeAPIDown⚓︎

Severity Fires after
Critical 15m

Target disappeared from Prometheus target discovery.

KubeAPI has disappeared from Prometheus target discovery.

Trigger condition

absent(up{job="apiserver"})

Upstream runbook for KubeAPIDown

KubeAPIInstanceUnreachable⚓︎

Severity Fires after
Warning 15m

KubeAPI instance is unreachable.

A KubeAPI instance has been unreachable for more than 15 minutes.

Trigger condition

up{job="apiserver"} == 0

Upstream runbook for KubeAPIInstanceUnreachable

KubeAPITerminatedRequests⚓︎

Severity Fires after
Warning 5m

The kubernetes apiserver has terminated {{ $value | humanizePercentage }} of its incoming requests.

The kubernetes apiserver has terminated {{ $value | humanizePercentage }} of its incoming requests on cluster {{ $labels.cluster }}.

Trigger condition

(sum(rate(apiserver_request_terminations_total{job="apiserver"}[10m])) by(cluster) / (sum(rate(apiserver_request_total{job="apiserver"}[10m])) by(cluster) + sum(rate(apiserver_request_terminations_total{job="apiserver"}[10m])) by(cluster))) > 0.20

Upstream runbook for KubeAPITerminatedRequests

Kubernetes API server error budget⚓︎

A single alert, defined as four multi-window burn rate variants of the API server's availability SLO. Each variant pairs a long and a short window so that a brief spike does not fire the slow burn rate, and a sustained failure escalates. Read the variants together: the 1h/5m pair means the error budget is being consumed fast enough to exhaust it within roughly two days.

KubeAPIErrorBudgetBurn⚓︎

Severity Fires after
Critical 2m
Critical 15m
Warning 1h
Warning 3h

The API server is burning too much error budget.

This alert is defined in 4 variants:

Critical, fires after 2m

The API server is burning too much error budget on cluster {{ $labels.cluster }}.

(sum(apiserver_request:burnrate1h) by(cluster) > 0.14400000000000002) and on(cluster) (sum(apiserver_request:burnrate5m) by(cluster) > 0.14400000000000002)

Critical, fires after 15m

The API server is burning too much error budget on cluster {{ $labels.cluster }}.

(sum(apiserver_request:burnrate6h) by(cluster) > 0.06) and on(cluster) (sum(apiserver_request:burnrate30m) by(cluster) > 0.06)

Warning, fires after 1h

The API server is burning too much error budget on cluster {{ $labels.cluster }}.

(sum(apiserver_request:burnrate1d) by(cluster) > 0.03) and on(cluster) (sum(apiserver_request:burnrate2h) by(cluster) > 0.03)

Warning, fires after 3h

The API server is burning too much error budget on cluster {{ $labels.cluster }}.

(sum(apiserver_request:burnrate3d) by(cluster) > 0.01) and on(cluster) (sum(apiserver_request:burnrate6h) by(cluster) > 0.01)

Upstream runbook for KubeAPIErrorBudgetBurn

Kubernetes controller manager⚓︎

Reachability of the controller manager. If it is down, controllers stop reconciling — Deployments do not scale, and failed Pods are not replaced.

KubeControllerManagerDown⚓︎

Severity Fires after
Critical 15m

Target disappeared from Prometheus target discovery.

KubeControllerManager has disappeared from Prometheus target discovery.

Trigger condition

absent(up{job="kube-controller-manager"})

Upstream runbook for KubeControllerManagerDown

KubeControllerManagerInstanceUnreachable⚓︎

Severity Fires after
Warning 15m

KubeControllerManager instance is unreachable.

A KubeControllerManager instance has been unreachable for more than 15 minutes.

Trigger condition

up{job="kube-controller-manager"} == 0

Upstream runbook for KubeControllerManagerInstanceUnreachable

Kubernetes scheduler⚓︎

Reachability of the scheduler. If it is down, existing Pods keep running but nothing new is placed on a node.

KubeSchedulerDown⚓︎

Severity Fires after
Critical 15m

Target disappeared from Prometheus target discovery.

KubeScheduler has disappeared from Prometheus target discovery.

Trigger condition

absent(up{job="kube-scheduler"})

Upstream runbook for KubeSchedulerDown

KubeSchedulerInstanceUnreachable⚓︎

Severity Fires after
Warning 15m

KubeScheduler instance is unreachable.

A KubeScheduler instance has been unreachable for more than 15 minutes.

Trigger condition

up{job="kube-scheduler"} == 0

Upstream runbook for KubeSchedulerInstanceUnreachable

Kubelet and node readiness⚓︎

The largest group in the bundle: node conditions, evictions, pod capacity, container runtime and PLEG latency, and kubelet certificate expiry and renewal. This is where a failing node shows up first.

KubeNodeNotReady⚓︎

Severity Fires after
Warning 15m

Node is not ready.

{{ $labels.node }} has been unready for more than 15 minutes on cluster {{ $labels.cluster }}.

Trigger condition

(kube_node_status_condition{job="kube-state-metrics",condition="Ready",status="true"} == 0) and on(cluster,node) (kube_node_spec_unschedulable{job="kube-state-metrics"} == 0)

Upstream runbook for KubeNodeNotReady

KubeNodePressure⚓︎

Severity Fires after
Info 10m

Node has as active Condition.

{{ $labels.node }} on cluster {{ $labels.cluster }} has active Condition {{ $labels.condition }}. This is caused by resource usage exceeding eviction thresholds.

Trigger condition

(kube_node_status_condition{job="kube-state-metrics",condition=~"(MemoryPressure|DiskPressure|PIDPressure)",status="true"} == 1) and on(cluster,node) (kube_node_spec_unschedulable{job="kube-state-metrics"} == 0)

Upstream runbook for KubeNodePressure

KubeNodeUnreachable⚓︎

Severity Fires after
Warning 15m

Node is unreachable.

{{ $labels.node }} is unreachable and some workloads may be rescheduled on cluster {{ $labels.cluster }}.

Trigger condition

(kube_node_spec_taint{job="kube-state-metrics",key="node.kubernetes.io/unreachable",effect="NoSchedule"} unless ignoring(key,value) kube_node_spec_taint{job="kube-state-metrics",key=~"ToBeDeletedByClusterAutoscaler|cloud.google.com/impending-node-termination|aws-node-termination-handler/spot-itn"}) == 1

Upstream runbook for KubeNodeUnreachable

KubeletTooManyPods⚓︎

Severity Fires after
Info 15m

Kubelet is running at capacity.

Kubelet '{{ $labels.node }}' is running at {{ $value | humanizePercentage }} of its Pod capacity on cluster {{ $labels.cluster }}.

Trigger condition

((max(kubelet_running_pods{job="kubelet",metrics_path="/metrics"} > 1) by(cluster,instance) * on(cluster,instance) group_left(node) max(kubelet_node_name{job="kubelet",metrics_path="/metrics"}) by(cluster,instance,node)) / on(cluster,node) group_left() max(kube_node_status_capacity{job="kube-state-metrics",resource="pods"} != 1) by(cluster,node)) > 0.95

Upstream runbook for KubeletTooManyPods

KubeNodeReadinessFlapping⚓︎

Severity Fires after
Warning 15m

Node readiness status is flapping.

The readiness status of node {{ $labels.node }} has changed {{ $value }} times in the last 15 minutes on cluster {{ $labels.cluster }}.

Trigger condition

(sum(changes(kube_node_status_condition{job="kube-state-metrics",status="true",condition="Ready"}[15m])) by(cluster,node) > 2) and on(cluster,node) (kube_node_spec_unschedulable{job="kube-state-metrics"} == 0)

Upstream runbook for KubeNodeReadinessFlapping

KubeNodeEviction⚓︎

Severity Fires after
Info Immediately

Node is evicting pods.

Node {{ $labels.node }} on {{ $labels.cluster }} is evicting Pods due to {{ $labels.eviction_signal }}. Eviction occurs when eviction thresholds are crossed, typically caused by Pods exceeding RAM/ephemeral-storage limits.

Trigger condition

(sum(rate(kubelet_evictions{job="kubelet",metrics_path="/metrics"}[15m])) by(cluster,eviction_signal,instance) * on(cluster,instance) group_left(node) max(kubelet_node_name{job="kubelet",metrics_path="/metrics"}) by(cluster,instance,node)) > 0

Upstream runbook for KubeNodeEviction

KubeletPlegDurationHigh⚓︎

Severity Fires after
Warning 5m

Kubelet Pod Lifecycle Event Generator is taking too long to relist.

The Kubelet Pod Lifecycle Event Generator has a 99th percentile duration of {{ $value }} seconds on node {{ $labels.node }} on cluster {{ $labels.cluster }}.

Trigger condition

node_quantile:kubelet_pleg_relist_duration_seconds:histogram_quantile{quantile="0.99"} >= 10

Upstream runbook for KubeletPlegDurationHigh

KubeletPodStartUpLatencyHigh⚓︎

Severity Fires after
Warning 15m

Kubelet Pod startup latency is too high.

Kubelet Pod startup 99th percentile latency is {{ $value }} seconds on node {{ $labels.node }} on cluster {{ $labels.cluster }}.

Trigger condition

(histogram_quantile(0.99, sum(topk(1, rate(kubelet_pod_worker_duration_seconds_bucket{job="kubelet",metrics_path="/metrics"}[5m])) by(cluster,instance,le,operation_type)) by(cluster,instance,le)) * on(cluster,instance) group_left(node) topk(1, kubelet_node_name{job="kubelet",metrics_path="/metrics"}) by(cluster,instance,node)) > 60

Upstream runbook for KubeletPodStartUpLatencyHigh

KubeletClientCertificateExpiration⚓︎

Severity Fires after
Warning Immediately
Critical Immediately

Kubelet client certificate is about to expire.

This alert is defined in 2 variants:

Warning, fires immediately

Client certificate for Kubelet on node {{ $labels.node }} expires in {{ $value | humanizeDuration }} on cluster {{ $labels.cluster }}.

kubelet_certificate_manager_client_ttl_seconds < 604800

Critical, fires immediately

Client certificate for Kubelet on node {{ $labels.node }} expires in {{ $value | humanizeDuration }} on cluster {{ $labels.cluster }}.

kubelet_certificate_manager_client_ttl_seconds < 86400

Upstream runbook for KubeletClientCertificateExpiration

KubeletServerCertificateExpiration⚓︎

Severity Fires after
Warning Immediately
Critical Immediately

Kubelet server certificate is about to expire.

This alert is defined in 2 variants:

Warning, fires immediately

Server certificate for Kubelet on node {{ $labels.node }} expires in {{ $value | humanizeDuration }} on cluster {{ $labels.cluster }}.

kubelet_certificate_manager_server_ttl_seconds < 604800

Critical, fires immediately

Server certificate for Kubelet on node {{ $labels.node }} expires in {{ $value | humanizeDuration }} on cluster {{ $labels.cluster }}.

kubelet_certificate_manager_server_ttl_seconds < 86400

Upstream runbook for KubeletServerCertificateExpiration

KubeletClientCertificateRenewalErrors⚓︎

Severity Fires after
Warning 15m

Kubelet has failed to renew its client certificate.

Kubelet on node {{ $labels.node }} has failed to renew its client certificate ({{ $value | humanize }} errors in the last 5 minutes) on cluster {{ $labels.cluster }}.

Trigger condition

increase(kubelet_certificate_manager_client_expiration_renew_errors[5m]) > 0

Upstream runbook for KubeletClientCertificateRenewalErrors

KubeletServerCertificateRenewalErrors⚓︎

Severity Fires after
Warning 15m

Kubelet has failed to renew its server certificate.

Kubelet on node {{ $labels.node }} has failed to renew its server certificate ({{ $value | humanize }} errors in the last 5 minutes) on cluster {{ $labels.cluster }}.

Trigger condition

increase(kubelet_server_expiration_renew_errors[5m]) > 0

Upstream runbook for KubeletServerCertificateRenewalErrors

KubeletInstanceUnreachable⚓︎

Severity Fires after
Warning 15m

Kubelet instance is unreachable.

A Kubelet instance has been unreachable for more than 15 minutes.

Trigger condition

up{job="kubelet",metrics_path="/metrics"} == 0

Upstream runbook for KubeletInstanceUnreachable

KubeletDown⚓︎

Severity Fires after
Critical 15m

Target disappeared from Prometheus target discovery.

Kubelet has disappeared from Prometheus target discovery on cluster {{ $labels.cluster }}.

Trigger condition

count(kube_node_info{job="kube-state-metrics"}) by(cluster) unless on(cluster) count(up{job="kubelet",metrics_path="/metrics"} == 1) by(cluster)

Upstream runbook for KubeletDown

kube-state-metrics⚓︎

Health of the exporter that supplies the metrics behind most of the Kubernetes alerts above. Treat these as meta-alerts: while kube-state-metrics is degraded, the workload and resource alerts go quiet whether or not anything is wrong.

KubeStateMetricsListErrors⚓︎

Severity Fires after
Critical 15m

kube-state-metrics is experiencing errors in list operations.

kube-state-metrics is experiencing errors at an elevated rate in list operations. This is likely causing it to not be able to expose metrics about Kubernetes objects correctly or at all.

Trigger condition

(sum(rate(kube_state_metrics_list_total{job="kube-state-metrics",result="error"}[5m])) by(cluster) / sum(rate(kube_state_metrics_list_total{job="kube-state-metrics"}[5m])) by(cluster)) > 0.01

Upstream runbook for KubeStateMetricsListErrors

KubeStateMetricsWatchErrors⚓︎

Severity Fires after
Critical 15m

kube-state-metrics is experiencing errors in watch operations.

kube-state-metrics is experiencing errors at an elevated rate in watch operations. This is likely causing it to not be able to expose metrics about Kubernetes objects correctly or at all.

Trigger condition

(sum(rate(kube_state_metrics_watch_total{job="kube-state-metrics",result="error"}[5m])) by(cluster) / sum(rate(kube_state_metrics_watch_total{job="kube-state-metrics"}[5m])) by(cluster)) > 0.01

Upstream runbook for KubeStateMetricsWatchErrors

KubeStateMetricsShardingMismatch⚓︎

Severity Fires after
Critical 15m

kube-state-metrics sharding is misconfigured.

kube-state-metrics pods are running with different --total-shards configuration, some Kubernetes objects may be exposed multiple times or not exposed at all.

Trigger condition

stdvar(kube_state_metrics_total_shards{job="kube-state-metrics"}) by(cluster) != 0

Upstream runbook for KubeStateMetricsShardingMismatch

KubeStateMetricsShardsMissing⚓︎

Severity Fires after
Critical 15m

kube-state-metrics shards are missing.

kube-state-metrics shards are missing, some Kubernetes objects are not being exposed.

Trigger condition

(((2 ^ max(kube_state_metrics_total_shards{job="kube-state-metrics"}) by(cluster)) - 1) - sum(2 ^ max(kube_state_metrics_shard_ordinal{job="kube-state-metrics"}) by(cluster,shard_ordinal)) by(cluster)) != 0

Upstream runbook for KubeStateMetricsShardsMissing

etcd⚓︎

Cluster membership, leader stability, request and fsync latency, and database growth against the storage quota. Losing quorum here takes the whole control plane with it.

Note

None of the etcd rules carry a severity label. They are routed by Alertmanager's default route, not by severity, so check that route before relying on them.

etcdMembersDown⚓︎

Severity Fires after
— Immediately

etcd cluster members are down.

etcd cluster "{{ $labels.job }}": members are down ({{ $value }}).

Trigger condition

max(sum(up{job=~".*etcd.*"} ==bool 0) without(instance) or count(sum(rate(etcd_network_peer_sent_failures_total{job=~".*etcd.*"}[120s])) without(instance) > 0.01) without(To)) without(endpoint) > 0

etcdInsufficientMembers⚓︎

Severity Fires after
— Immediately

etcd cluster has insufficient number of members.

etcd cluster "{{ $labels.job }}": insufficient members ({{ $value }}).

Trigger condition

sum(up{job=~".*etcd.*"} ==bool 1) without(instance) < ((count(up{job=~".*etcd.*"}) without(instance) + 1) / 2)

etcdNoLeader⚓︎

Severity Fires after
— Immediately

etcd cluster has no leader.

etcd cluster "{{ $labels.job }}": member {{ $labels.instance }} has no leader.

Trigger condition

etcd_server_has_leader{job=~".*etcd.*"} == 0

etcdHighNumberOfLeaderChanges⚓︎

Severity Fires after
— Immediately

etcd cluster has high number of leader changes.

etcd cluster "{{ $labels.job }}": {{ $value }} leader changes within the last 15 minutes. Frequent elections may be a sign of insufficient resources, high network latency, or disruptions by other components and should be investigated.

Trigger condition

increase((max(etcd_server_leader_changes_seen_total{job=~".*etcd.*"}) without(instance) or (0 * absent(etcd_server_leader_changes_seen_total{job=~".*etcd.*"})))[15m:1m]) >= 4

etcdHighNumberOfFailedGRPCRequests⚓︎

Severity Fires after
— Immediately
— Immediately

etcd cluster has high number of failed grpc requests.

This alert is defined in 2 variants:

—, fires immediately

etcd cluster "{{ $labels.job }}": {{ $value }}% of requests for {{ $labels.grpc_method }} failed on etcd instance {{ $labels.instance }}.

((100 * sum(rate(grpc_server_handled_total{job=~".*etcd.*",grpc_code=~"Unknown|FailedPrecondition|ResourceExhausted|Internal|Unavailable|DataLoss|DeadlineExceeded"}[5m])) without(grpc_type,grpc_code)) / sum(rate(grpc_server_handled_total{job=~".*etcd.*"}[5m])) without(grpc_type,grpc_code)) > 1

—, fires immediately

etcd cluster "{{ $labels.job }}": {{ $value }}% of requests for {{ $labels.grpc_method }} failed on etcd instance {{ $labels.instance }}.

((100 * sum(rate(grpc_server_handled_total{job=~".*etcd.*",grpc_code=~"Unknown|FailedPrecondition|ResourceExhausted|Internal|Unavailable|DataLoss|DeadlineExceeded"}[5m])) without(grpc_type,grpc_code)) / sum(rate(grpc_server_handled_total{job=~".*etcd.*"}[5m])) without(grpc_type,grpc_code)) > 5

etcdGRPCRequestsSlow⚓︎

Severity Fires after
— Immediately

etcd grpc requests are slow

etcd cluster "{{ $labels.job }}": 99th percentile of gRPC requests is {{ $value }}s on etcd instance {{ $labels.instance }} for {{ $labels.grpc_method }} method.

Trigger condition

histogram_quantile(0.99, sum(rate(grpc_server_handling_seconds_bucket{job=~".*etcd.*",grpc_method!="Defragment",grpc_type="unary"}[5m])) without(grpc_type)) > 0.15

etcdMemberCommunicationSlow⚓︎

Severity Fires after
— Immediately

etcd cluster member communication is slow.

etcd cluster "{{ $labels.job }}": member communication with {{ $labels.To }} is taking {{ $value }}s on etcd instance {{ $labels.instance }}.

Trigger condition

histogram_quantile(0.99, rate(etcd_network_peer_round_trip_time_seconds_bucket{job=~".*etcd.*"}[5m])) > 0.15

etcdHighNumberOfFailedProposals⚓︎

Severity Fires after
— Immediately

etcd cluster has high number of proposal failures.

etcd cluster "{{ $labels.job }}": {{ $value }} proposal failures within the last 30 minutes on etcd instance {{ $labels.instance }}.

Trigger condition

rate(etcd_server_proposals_failed_total{job=~".*etcd.*"}[15m]) > 5

etcdHighFsyncDurations⚓︎

Severity Fires after
— Immediately
— Immediately

etcd cluster 99th percentile fsync durations are too high.

This alert is defined in 2 variants:

—, fires immediately

etcd cluster "{{ $labels.job }}": 99th percentile fsync durations are {{ $value }}s on etcd instance {{ $labels.instance }}.

histogram_quantile(0.99, rate(etcd_disk_wal_fsync_duration_seconds_bucket{job=~".*etcd.*"}[5m])) > 0.5

—, fires immediately

etcd cluster "{{ $labels.job }}": 99th percentile fsync durations are {{ $value }}s on etcd instance {{ $labels.instance }}.

histogram_quantile(0.99, rate(etcd_disk_wal_fsync_duration_seconds_bucket{job=~".*etcd.*"}[5m])) > 1

etcdHighCommitDurations⚓︎

Severity Fires after
— Immediately

etcd cluster 99th percentile commit durations are too high.

etcd cluster "{{ $labels.job }}": 99th percentile commit durations {{ $value }}s on etcd instance {{ $labels.instance }}.

Trigger condition

histogram_quantile(0.99, rate(etcd_disk_backend_commit_duration_seconds_bucket{job=~".*etcd.*"}[5m])) > 0.25

etcdDatabaseQuotaLowSpace⚓︎

Severity Fires after
— Immediately

etcd cluster database is running full.

etcd cluster "{{ $labels.job }}": database size exceeds the defined quota on etcd instance {{ $labels.instance }}, please defrag or increase the quota as the writes to etcd will be disabled when it is full.

Trigger condition

((last_over_time(etcd_mvcc_db_total_size_in_bytes{job=~".*etcd.*"}[5m]) / last_over_time(etcd_server_quota_backend_bytes{job=~".*etcd.*"}[5m])) * 100) > 95

etcdExcessiveDatabaseGrowth⚓︎

Severity Fires after
— Immediately

etcd cluster database growing very fast.

etcd cluster "{{ $labels.job }}": Predicting running out of disk space in the next four hours, based on write observations within the past four hours on etcd instance {{ $labels.instance }}, please check as it might be disruptive.

Trigger condition

predict_linear(etcd_mvcc_db_total_size_in_bytes{job=~".*etcd.*"}[4h], 14400) > etcd_server_quota_backend_bytes{job=~".*etcd.*"}

etcdDatabaseHighFragmentationRatio⚓︎

Severity Fires after
— Immediately

etcd database size in use is less than 50% of the actual allocated storage.

etcd cluster "{{ $labels.job }}": database size in use on instance {{ $labels.instance }} is {{ $value | humanizePercentage }} of the actual allocated disk space, please run defragmentation (e.g. etcdctl defrag) to retrieve the unused fragmented disk space.

Trigger condition

((last_over_time(etcd_mvcc_db_total_size_in_use_in_bytes{job=~".*etcd.*"}[5m]) / last_over_time(etcd_mvcc_db_total_size_in_bytes{job=~".*etcd.*"}[5m])) < 0.5) and (etcd_mvcc_db_total_size_in_use_in_bytes{job=~".*etcd.*"} > 104857600)

Upstream runbook for etcdDatabaseHighFragmentationRatio

Host and node health⚓︎

Host-level alerts from node_exporter, covering the same ground as the VM alerts on Platform and Infrastructure Alerts but for Kubernetes nodes: filesystem space and inodes, memory, CPU and I/O saturation, clock synchronization, file descriptors, RAID, bonding, and failed systemd units.

NodeFilesystemSpaceFillingUp⚓︎

Severity Fires after
Warning 1h
Critical 1h

Filesystem is predicted to run out of space within the next 24 hours.

This alert is defined in 2 variants:

Warning, fires after 1h

Filesystem on {{ $labels.device }}, mounted on {{ $labels.mountpoint }}, at {{ $labels.instance }} has only {{ printf "%.2f" $value }}% available space left and is filling up.

((((node_filesystem_avail_bytes{job="node-exporter",fstype!="",mountpoint!=""} / node_filesystem_size_bytes{job="node-exporter",fstype!="",mountpoint!=""}) * 100) < 15) and (predict_linear(node_filesystem_avail_bytes{job="node-exporter",fstype!="",mountpoint!=""}[6h], 86400) < 0)) and (node_filesystem_readonly{job="node-exporter",fstype!="",mountpoint!=""} == 0)

Critical, fires after 1h

Filesystem on {{ $labels.device }}, mounted on {{ $labels.mountpoint }}, at {{ $labels.instance }} has only {{ printf "%.2f" $value }}% available space left and is filling up fast.

((((node_filesystem_avail_bytes{job="node-exporter",fstype!="",mountpoint!=""} / node_filesystem_size_bytes{job="node-exporter",fstype!="",mountpoint!=""}) * 100) < 10) and (predict_linear(node_filesystem_avail_bytes{job="node-exporter",fstype!="",mountpoint!=""}[6h], 14400) < 0)) and (node_filesystem_readonly{job="node-exporter",fstype!="",mountpoint!=""} == 0)

Upstream runbook for NodeFilesystemSpaceFillingUp

NodeFilesystemAlmostOutOfSpace⚓︎

Severity Fires after
Warning 30m
Critical 30m

Filesystem has less than 5% space left.

This alert is defined in 2 variants:

Warning, fires after 30m

Filesystem on {{ $labels.device }}, mounted on {{ $labels.mountpoint }}, at {{ $labels.instance }} has only {{ printf "%.2f" $value }}% available space left.

(((node_filesystem_avail_bytes{job="node-exporter",fstype!="",mountpoint!=""} / node_filesystem_size_bytes{job="node-exporter",fstype!="",mountpoint!=""}) * 100) < 5) and (node_filesystem_readonly{job="node-exporter",fstype!="",mountpoint!=""} == 0)

Critical, fires after 30m

Filesystem on {{ $labels.device }}, mounted on {{ $labels.mountpoint }}, at {{ $labels.instance }} has only {{ printf "%.2f" $value }}% available space left.

(((node_filesystem_avail_bytes{job="node-exporter",fstype!="",mountpoint!=""} / node_filesystem_size_bytes{job="node-exporter",fstype!="",mountpoint!=""}) * 100) < 3) and (node_filesystem_readonly{job="node-exporter",fstype!="",mountpoint!=""} == 0)

Upstream runbook for NodeFilesystemAlmostOutOfSpace

NodeFilesystemFilesFillingUp⚓︎

Severity Fires after
Warning 1h
Critical 1h

Filesystem is predicted to run out of inodes within the next 24 hours.

This alert is defined in 2 variants:

Warning, fires after 1h

Filesystem on {{ $labels.device }}, mounted on {{ $labels.mountpoint }}, at {{ $labels.instance }} has only {{ printf "%.2f" $value }}% available inodes left and is filling up.

((((node_filesystem_files_free{job="node-exporter",fstype!="",mountpoint!=""} / node_filesystem_files{job="node-exporter",fstype!="",mountpoint!=""}) * 100) < 40) and (predict_linear(node_filesystem_files_free{job="node-exporter",fstype!="",mountpoint!=""}[6h], 86400) < 0)) and (node_filesystem_readonly{job="node-exporter",fstype!="",mountpoint!=""} == 0)

Critical, fires after 1h

Filesystem on {{ $labels.device }}, mounted on {{ $labels.mountpoint }}, at {{ $labels.instance }} has only {{ printf "%.2f" $value }}% available inodes left and is filling up fast.

((((node_filesystem_files_free{job="node-exporter",fstype!="",mountpoint!=""} / node_filesystem_files{job="node-exporter",fstype!="",mountpoint!=""}) * 100) < 20) and (predict_linear(node_filesystem_files_free{job="node-exporter",fstype!="",mountpoint!=""}[6h], 14400) < 0)) and (node_filesystem_readonly{job="node-exporter",fstype!="",mountpoint!=""} == 0)

Upstream runbook for NodeFilesystemFilesFillingUp

NodeFilesystemAlmostOutOfFiles⚓︎

Severity Fires after
Warning 1h
Critical 1h

Filesystem has less than 5% inodes left.

This alert is defined in 2 variants:

Warning, fires after 1h

Filesystem on {{ $labels.device }}, mounted on {{ $labels.mountpoint }}, at {{ $labels.instance }} has only {{ printf "%.2f" $value }}% available inodes left.

(((node_filesystem_files_free{job="node-exporter",fstype!="",mountpoint!=""} / node_filesystem_files{job="node-exporter",fstype!="",mountpoint!=""}) * 100) < 5) and (node_filesystem_readonly{job="node-exporter",fstype!="",mountpoint!=""} == 0)

Critical, fires after 1h

Filesystem on {{ $labels.device }}, mounted on {{ $labels.mountpoint }}, at {{ $labels.instance }} has only {{ printf "%.2f" $value }}% available inodes left.

(((node_filesystem_files_free{job="node-exporter",fstype!="",mountpoint!=""} / node_filesystem_files{job="node-exporter",fstype!="",mountpoint!=""}) * 100) < 3) and (node_filesystem_readonly{job="node-exporter",fstype!="",mountpoint!=""} == 0)

Upstream runbook for NodeFilesystemAlmostOutOfFiles

NodeNetworkReceiveErrs⚓︎

Severity Fires after
Warning 1h

Network interface is reporting many receive errors.

{{ $labels.instance }} interface {{ $labels.device }} has encountered {{ printf "%.0f" $value }} receive errors in the last two minutes.

Trigger condition

(rate(node_network_receive_errs_total{job="node-exporter"}[2m]) / rate(node_network_receive_packets_total{job="node-exporter"}[2m])) > 0.01

Upstream runbook for NodeNetworkReceiveErrs

NodeNetworkTransmitErrs⚓︎

Severity Fires after
Warning 1h

Network interface is reporting many transmit errors.

{{ $labels.instance }} interface {{ $labels.device }} has encountered {{ printf "%.0f" $value }} transmit errors in the last two minutes.

Trigger condition

(rate(node_network_transmit_errs_total{job="node-exporter"}[2m]) / rate(node_network_transmit_packets_total{job="node-exporter"}[2m])) > 0.01

Upstream runbook for NodeNetworkTransmitErrs

NodeHighNumberConntrackEntriesUsed⚓︎

Severity Fires after
Warning Immediately

Number of conntrack are getting close to the limit.

{{ $labels.instance }} {{ $value | humanizePercentage }} of conntrack entries are used.

Trigger condition

(node_nf_conntrack_entries{job="node-exporter"} / node_nf_conntrack_entries_limit) > 0.75

Upstream runbook for NodeHighNumberConntrackEntriesUsed

NodeTextFileCollectorScrapeError⚓︎

Severity Fires after
Warning Immediately

Node Exporter text file collector failed to scrape.

Node Exporter text file collector on {{ $labels.instance }} failed to scrape.

Trigger condition

node_textfile_scrape_error{job="node-exporter"} == 1

Upstream runbook for NodeTextFileCollectorScrapeError

NodeClockSkewDetected⚓︎

Severity Fires after
Warning 10m

Clock skew detected.

Clock at {{ $labels.instance }} is out of sync by more than 0.05s. Ensure NTP is configured correctly on this host.

Trigger condition

((node_timex_offset_seconds{job="node-exporter"} > 0.05) and (deriv(node_timex_offset_seconds{job="node-exporter"}[5m]) >= 0)) or ((node_timex_offset_seconds{job="node-exporter"} < -0.05) and (deriv(node_timex_offset_seconds{job="node-exporter"}[5m]) <= 0))

Upstream runbook for NodeClockSkewDetected

NodeClockNotSynchronising⚓︎

Severity Fires after
Warning 10m

Clock not synchronising.

Clock at {{ $labels.instance }} is not synchronising. Ensure NTP is configured on this host.

Trigger condition

(min_over_time(node_timex_sync_status{job="node-exporter"}[5m]) == 0) and (node_timex_maxerror_seconds{job="node-exporter"} >= 16)

Upstream runbook for NodeClockNotSynchronising

NodeRAIDDegraded⚓︎

Severity Fires after
Critical 15m

RAID Array is degraded.

RAID array '{{ $labels.device }}' at {{ $labels.instance }} is in degraded state due to one or more disks failures. Number of spare drives is insufficient to fix issue automatically.

Trigger condition

(node_md_disks_required{job="node-exporter",device=~"(/dev/)?(mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|md.+|dasd.+)"} - ignoring(state) node_md_disks{state="active",job="node-exporter",device=~"(/dev/)?(mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|md.+|dasd.+)"}) > 0

Upstream runbook for NodeRAIDDegraded

NodeRAIDDiskFailure⚓︎

Severity Fires after
Warning Immediately

Failed device in RAID array.

At least one device in RAID array at {{ $labels.instance }} failed. Array '{{ $labels.device }}' needs attention and possibly a disk swap.

Trigger condition

node_md_disks{state="failed",job="node-exporter",device=~"(/dev/)?(mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|md.+|dasd.+)"} > 0

Upstream runbook for NodeRAIDDiskFailure

NodeFileDescriptorLimit⚓︎

Severity Fires after
Warning 15m
Critical 15m

Kernel is predicted to exhaust file descriptors limit soon.

This alert is defined in 2 variants:

Warning, fires after 15m

File descriptors limit at {{ $labels.instance }} is currently at {{ printf "%.2f" $value }}%.

((node_filefd_allocated{job="node-exporter"} * 100) / node_filefd_maximum{job="node-exporter"}) > 70

Critical, fires after 15m

File descriptors limit at {{ $labels.instance }} is currently at {{ printf "%.2f" $value }}%.

((node_filefd_allocated{job="node-exporter"} * 100) / node_filefd_maximum{job="node-exporter"}) > 90

Upstream runbook for NodeFileDescriptorLimit

NodeCPUHighUsage⚓︎

Severity Fires after
Info 15m

High CPU usage.

CPU usage at {{ $labels.instance }} has been above 90% for the last 15 minutes, is currently at {{ printf "%.2f" $value }}%.

Trigger condition

(sum(avg(rate(node_cpu_seconds_total{job="node-exporter",mode!~"idle|iowait"}[2m])) without(cpu)) without(mode) * 100) > 90

Upstream runbook for NodeCPUHighUsage

NodeSystemSaturation⚓︎

Severity Fires after
Warning 15m

System saturated, load per core is very high.

System load per core at {{ $labels.instance }} has been above 2 for the last 15 minutes, is currently at {{ printf "%.2f" $value }}. This might indicate this instance resources saturation and can cause it becoming unresponsive.

Trigger condition

(node_load1{job="node-exporter"} / count(node_cpu_seconds_total{job="node-exporter",mode="idle"}) without(cpu,mode)) > 2

Upstream runbook for NodeSystemSaturation

NodeMemoryMajorPagesFaults⚓︎

Severity Fires after
Warning 15m

Memory major page faults are occurring at very high rate.

Memory major pages are occurring at very high rate at {{ $labels.instance }}, 500 major page faults per second for the last 15 minutes, is currently at {{ printf "%.2f" $value }}. Please check that there is enough memory available at this instance.

Trigger condition

rate(node_vmstat_pgmajfault{job="node-exporter"}[5m]) > 500

Upstream runbook for NodeMemoryMajorPagesFaults

NodeMemoryHighUtilization⚓︎

Severity Fires after
Warning 15m

Host is running out of memory.

Memory is filling up at {{ $labels.instance }}, has been above 90% for the last 15 minutes, is currently at {{ printf "%.2f" $value }}%.

Trigger condition

(100 - ((node_memory_MemAvailable_bytes{job="node-exporter"} / node_memory_MemTotal_bytes{job="node-exporter"}) * 100)) > 90

Upstream runbook for NodeMemoryHighUtilization

NodeDiskIOSaturation⚓︎

Severity Fires after
Warning 30m

Disk IO queue is high.

Disk IO queue (aqu-sq) is high on {{ $labels.device }} at {{ $labels.instance }}, has been above 10 for the last 30 minutes, is currently at {{ printf "%.2f" $value }}. This symptom might indicate disk saturation.

Trigger condition

rate(node_disk_io_time_weighted_seconds_total{job="node-exporter",device=~"(/dev/)?(mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|md.+|dasd.+)"}[5m]) > 10

Upstream runbook for NodeDiskIOSaturation

NodeSystemdServiceFailed⚓︎

Severity Fires after
Warning 5m

Systemd service has entered failed state.

Systemd service {{ $labels.name }} has entered failed state at {{ $labels.instance }}

Trigger condition

node_systemd_unit_state{job="node-exporter",state="failed"} == 1

Upstream runbook for NodeSystemdServiceFailed

NodeSystemdServiceCrashlooping⚓︎

Severity Fires after
Warning 15m

Systemd service keeps restaring, possibly crash looping.

Systemd service {{ $labels.name }} has being restarted too many times at {{ $labels.instance }} for the last 15 minutes. Please check if service is crash looping.

Trigger condition

increase(node_systemd_service_restart_total{job="node-exporter"}[5m]) > 2

Upstream runbook for NodeSystemdServiceCrashlooping

NodeBondingDegraded⚓︎

Severity Fires after
Warning 5m

Bonding interface is degraded.

Bonding interface {{ $labels.master }} on {{ $labels.instance }} is in degraded state due to one or more slave failures.

Trigger condition

(node_bonding_slaves{job="node-exporter"} - node_bonding_active{job="node-exporter"}) != 0

Upstream runbook for NodeBondingDegraded

Host networking⚓︎

Physical and virtual interfaces changing state repeatedly, which usually points at the cable, switch port, or virtual NIC below the host rather than at Kubernetes.

NodeNetworkInterfaceFlapping⚓︎

Severity Fires after
Warning 2m

Network interface is often changing its status

Network interface "{{ $labels.device }}" changing its up status often on node-exporter {{ $labels.namespace }}/{{ $labels.pod }}

Trigger condition

changes(node_network_up{job="node-exporter",device!~"veth.+"}[2m]) > 2

Upstream runbook for NodeNetworkInterfaceFlapping

Alertmanager⚓︎

The notification path itself: configuration reloads, cluster membership between Alertmanager replicas, and failures delivering to a receiver. An alert here means other alerts may not be reaching anyone.

AlertmanagerFailedReload⚓︎

Severity Fires after
Critical 10m

Reloading an Alertmanager configuration has failed.

Configuration has failed to load for {{ $labels.namespace }}/{{ $labels.pod}}.

Trigger condition

max_over_time(alertmanager_config_last_reload_successful{job="vmalertmanager-xview-victoria-metrics-k8s-stack",container="alertmanager",namespace="default"}[5m]) == 0

Upstream runbook for AlertmanagerFailedReload

AlertmanagerMembersInconsistent⚓︎

Severity Fires after
Critical 15m

A member of an Alertmanager cluster has not found all other cluster members.

Alertmanager {{ $labels.namespace }}/{{ $labels.pod}} has only found {{ $value }} members of the {{$labels.job}} cluster.

Trigger condition

max_over_time(alertmanager_cluster_members{job="vmalertmanager-xview-victoria-metrics-k8s-stack",container="alertmanager",namespace="default"}[5m]) < on(namespace,service,cluster) group_left() count(max_over_time(alertmanager_cluster_members{job="vmalertmanager-xview-victoria-metrics-k8s-stack",container="alertmanager",namespace="default"}[5m])) by(namespace,service,cluster)

Upstream runbook for AlertmanagerMembersInconsistent

AlertmanagerFailedToSendAlerts⚓︎

Severity Fires after
Warning 5m

An Alertmanager instance failed to send notifications.

Alertmanager {{ $labels.namespace }}/{{ $labels.pod}} failed to send {{ $value | humanizePercentage }} of notifications to {{ $labels.integration }}.

Trigger condition

(rate(alertmanager_notifications_failed_total{job="vmalertmanager-xview-victoria-metrics-k8s-stack",container="alertmanager",namespace="default"}[15m]) / ignoring(reason) group_left() rate(alertmanager_notifications_total{job="vmalertmanager-xview-victoria-metrics-k8s-stack",container="alertmanager",namespace="default"}[15m])) > 0.01

Upstream runbook for AlertmanagerFailedToSendAlerts

AlertmanagerClusterFailedToSendAlerts⚓︎

Severity Fires after
Critical 5m
Warning 5m

All Alertmanager instances in a cluster failed to send notifications to a critical integration.

This alert is defined in 2 variants:

Critical, fires after 5m

The minimum notification failure rate to {{ $labels.integration }} sent from any instance in the {{$labels.job}} cluster is {{ $value | humanizePercentage }}.

min((rate(alertmanager_notifications_failed_total{job="vmalertmanager-xview-victoria-metrics-k8s-stack",container="alertmanager",namespace="default",integration=~".*"}[15m]) / ignoring(reason) group_left() rate(alertmanager_notifications_total{job="vmalertmanager-xview-victoria-metrics-k8s-stack",container="alertmanager",namespace="default",integration=~".*"}[15m])) > 0) by(namespace,service,integration,cluster) > 0.01

Warning, fires after 5m

The minimum notification failure rate to {{ $labels.integration }} sent from any instance in the {{$labels.job}} cluster is {{ $value | humanizePercentage }}.

min((rate(alertmanager_notifications_failed_total{job="vmalertmanager-xview-victoria-metrics-k8s-stack",container="alertmanager",namespace="default",integration!~".*"}[15m]) / ignoring(reason) group_left() rate(alertmanager_notifications_total{job="vmalertmanager-xview-victoria-metrics-k8s-stack",container="alertmanager",namespace="default",integration!~".*"}[15m])) > 0) by(namespace,service,integration,cluster) > 0.01

Upstream runbook for AlertmanagerClusterFailedToSendAlerts

AlertmanagerConfigInconsistent⚓︎

Severity Fires after
Critical 20m

Alertmanager instances within the same cluster have different configurations.

Alertmanager instances within the {{$labels.job}} cluster have different configurations.

Trigger condition

count(count_values("config_hash", alertmanager_config_hash{job="vmalertmanager-xview-victoria-metrics-k8s-stack",container="alertmanager",namespace="default"}) by(namespace,service,cluster)) by(namespace,service,cluster) != 1

Upstream runbook for AlertmanagerConfigInconsistent

AlertmanagerClusterDown⚓︎

Severity Fires after
Critical 5m

Half or more of the Alertmanager instances within the same cluster are down.

{{ $value | humanizePercentage }} of Alertmanager instances within the {{$labels.job}} cluster have been up for less than half of the last 5m.

Trigger condition

(count(avg_over_time(up{job="vmalertmanager-xview-victoria-metrics-k8s-stack",container="alertmanager",namespace="default"}[5m]) < 0.5) by(namespace,service,cluster) / count(up{job="vmalertmanager-xview-victoria-metrics-k8s-stack",container="alertmanager",namespace="default"}) by(namespace,service,cluster)) >= 0.5

Upstream runbook for AlertmanagerClusterDown

AlertmanagerClusterCrashlooping⚓︎

Severity Fires after
Critical 5m

Half or more of the Alertmanager instances within the same cluster are crashlooping.

{{ $value | humanizePercentage }} of Alertmanager instances within the {{$labels.job}} cluster have restarted at least 5 times in the last 10m.

Trigger condition

(count(changes(process_start_time_seconds{job="vmalertmanager-xview-victoria-metrics-k8s-stack",container="alertmanager",namespace="default"}[10m]) > 4) by(namespace,service,cluster) / count(up{job="vmalertmanager-xview-victoria-metrics-k8s-stack",container="alertmanager",namespace="default"}) by(namespace,service,cluster)) >= 0.5

Upstream runbook for AlertmanagerClusterCrashlooping

vmagent metric collection⚓︎

vmagent scrapes every target and forwards the samples to storage. These alerts cover scrape failures, per-tenant series limits, and the persistent queue that buffers samples when the remote write destination is slow or unreachable. Sustained saturation here ends in dropped data.

PersistentQueueIsDroppingData⚓︎

Severity Fires after
Critical 10m

Instance {{ $labels.instance }} is dropping data from persistent queue

Vmagent dropped {{ $value | humanize1024 }} from persistent queue on instance {{ $labels.instance }} for the last 10m.

Trigger condition

sum(increase(vm_persistentqueue_bytes_dropped_total[5m])) without(path) > 0

RejectedRemoteWriteDataBlocksAreDropped⚓︎

Severity Fires after
Warning 15m

Vmagent is dropping data blocks that are rejected by remote storage

Job "{{ $labels.job }}" on instance {{ $labels.instance }} drops the rejected by remote-write server data blocks. Check the logs to find the reason for rejects.

Trigger condition

sum(increase(vmagent_remotewrite_packets_dropped_total[5m])) without(url) > 0

TooManyScrapeErrors⚓︎

Severity Fires after
Warning 15m

Vmagent fails to scrape one or more targets

Job "{{ $labels.job }}" on instance {{ $labels.instance }} fails to scrape targets for last 15m

Trigger condition

increase(vm_promscrape_scrapes_failed_total[5m]) > 0

ScrapePoolHasNoTargets⚓︎

Severity Fires after
Warning 30m

Vmagent has scrape_pool with 0 configured/discovered targets

Vmagent "{{ $labels.job }}" has scrape_pool "{{ $labels.scrape_job }}" with 0 discovered targets. It is likely a misconfiguration. Please follow https://docs.victoriametrics.com/victoriametrics/vmagent/#debugging-scrape-targets to troubleshoot the scraping config.

Trigger condition

sum(vm_promscrape_scrape_pool_targets) without(status,instance,pod) == 0

TooManyWriteErrors⚓︎

Severity Fires after
Warning 15m

Vmagent responds with too many errors on data ingestion protocols

Job "{{ $labels.job }}" on instance {{ $labels.instance }} responds with errors to write requests for last 15m.

Trigger condition

(sum(increase(vm_ingestserver_request_errors_total[5m])) without(name,net,type) + sum(increase(vmagent_http_request_errors_total[5m])) without(path,protocol)) > 0

TooManyRemoteWriteErrors⚓︎

Severity Fires after
Warning 15m

Job "{{ $labels.job }}" on instance {{ $labels.instance }} fails to push to remote storage

Vmagent fails to push data via remote write protocol to destination "{{ $labels.url }}" Ensure that destination is up and reachable.

Trigger condition

rate(vmagent_remotewrite_retries_count_total[5m]) > 0

RemoteWriteConnectionIsSaturated⚓︎

Severity Fires after
Warning 15m

Remote write connection from "{{ $labels.job }}" (instance {{ $labels.instance }}) to {{ $labels.url }} is saturated

The remote write connection between vmagent "{{ $labels.job }}" (instance {{ $labels.instance }}) and destination "{{ $labels.url }}" is saturated by more than 90% and vmagent won't be able to keep up. There could be the following reasons for this: * vmagent can't send data fast enough through the existing network connections. Increase -remoteWrite.queues cmd-line flag value to establish more connections per destination. * remote destination can't accept data fast enough. Check if remote destination has enough resources for processing.

Trigger condition

(rate(vmagent_remotewrite_send_duration_seconds_total[5m]) / vmagent_remotewrite_queues) > 0.9

PersistentQueueForWritesIsSaturated⚓︎

Severity Fires after
Warning 15m

Persistent queue writes for instance {{ $labels.instance }} are saturated

Persistent queue writes for vmagent "{{ $labels.job }}" (instance {{ $labels.instance }}) are saturated by more than 90% and vmagent won't be able to keep up with flushing data on disk. In this case, consider to decrease load on the vmagent or improve the disk throughput.

Trigger condition

rate(vm_persistentqueue_write_duration_seconds_total[5m]) > 0.9

PersistentQueueForReadsIsSaturated⚓︎

Severity Fires after
Warning 15m

Persistent queue reads for instance {{ $labels.instance }} are saturated

Persistent queue reads for vmagent "{{ $labels.job }}" (instance {{ $labels.instance }}) are saturated by more than 90% and vmagent won't be able to keep up with reading data from the disk. In this case, consider to decrease load on the vmagent or improve the disk throughput.

Trigger condition

rate(vm_persistentqueue_read_duration_seconds_total[5m]) > 0.9

SeriesLimitHourReached⚓︎

Severity Fires after
Critical Immediately

Instance {{ $labels.instance }} reached 90% of the limit

Max series limit set via -remoteWrite.maxHourlySeries flag is close to reaching the max value. Then samples for new time series will be dropped instead of sending them to remote storage systems.

Trigger condition

(vmagent_hourly_series_limit_current_series / vmagent_hourly_series_limit_max_series) > 0.9

SeriesLimitDayReached⚓︎

Severity Fires after
Critical Immediately

Instance {{ $labels.instance }} reached 90% of the limit

Max series limit set via -remoteWrite.maxDailySeries flag is close to reaching the max value. Then samples for new time series will be dropped instead of sending them to remote storage systems.

Trigger condition

(vmagent_daily_series_limit_current_series / vmagent_daily_series_limit_max_series) > 0.9

ConfigurationReloadFailure⚓︎

Severity Fires after
Warning Immediately

Configuration reload failed for vmagent instance {{ $labels.instance }}

Configuration hot-reload failed for vmagent on instance {{ $labels.instance }}. Check vmagent's logs for detailed error message.

Trigger condition

(vm_promscrape_config_last_reload_successful != 1) or (vmagent_relabel_config_last_reload_successful != 1)

StreamAggrFlushTimeout⚓︎

Severity Fires after
Warning Immediately

Streaming aggregation at "{{ $labels.job }}" (instance {{ $labels.instance }}) can't be finished within the configured aggregation interval.

Stream aggregation process can't keep up with the load and might produce incorrect aggregation results. Check logs for more details. Possible solutions: increase aggregation interval; aggregate smaller number of series; reduce samples' ingestion rate to stream aggregation.

Trigger condition

increase(vm_streamaggr_flush_timeouts_total[5m]) > 0

StreamAggrDedupFlushTimeout⚓︎

Severity Fires after
Warning Immediately

Deduplication "{{ $labels.job }}" (instance {{ $labels.instance }}) can't be finished within configured deduplication interval.

Deduplication process can't keep up with the load and might produce incorrect results. Check docs https://docs.victoriametrics.com/victoriametrics/stream-aggregation/#deduplication and logs for more details. Possible solutions: increase deduplication interval; deduplicate smaller number of series; reduce samples' ingestion rate.

Trigger condition

increase(vm_streamaggr_dedup_flush_timeouts_total[5m]) > 0

PersistentQueueRunsOutOfSpaceIn12Hours⚓︎

Severity Fires after
Warning 10m

Persistent Queue (url {{ $labels.url }}) of {{ $labels.instance }} (job:{{ $labels.job }}) will run out of space in 12 hours.

RemoteWrite destination ({{ $labels.url }}) is unavailable or unable to receive data in a timely manner, so the persistent queue size is growing. Once the available space is exhausted, some samples will be discarded and cause incident. Please check the health of remoteWrite destination ({{ $labels.url }}).

Trigger condition

(((sum(vm_persistentqueue_free_disk_space_bytes) by(job,instance,path,cluster) / (sum(deriv(vm_persistentqueue_bytes_pending[1m])) by(job,instance,path,cluster) > 0)) * on(job,instance,path,cluster) group_left(url) ((vmagent_remotewrite_pending_data_bytes * 0) + 1)) < 43200) > 0

PersistentQueueRunsOutOfSpaceIn4Hours⚓︎

Severity Fires after
Critical 10m

Persistent Queue (url {{ $labels.url }}) of {{ $labels.instance }} (job:{{ $labels.job }}) will run out of space in 4 hours.

RemoteWrite destination ({{ $labels.url }}) is unavailable or unable to receive data in a timely manner, so the persistent queue size is growing. Once the available space is exhausted, some samples will be discarded and cause incident. Please check the health of remoteWrite destination ({{ $labels.url }}).

Trigger condition

(((sum(vm_persistentqueue_free_disk_space_bytes) by(job,instance,path,cluster) / (sum(deriv(vm_persistentqueue_bytes_pending[1m])) by(job,instance,path,cluster) > 0)) * on(job,instance,path,cluster) group_left(url) ((vmagent_remotewrite_pending_data_bytes * 0) + 1)) < 14400) > 0

vmalert rule evaluation⚓︎

vmalert evaluates the recording and alerting rules — including everything documented on this page and on the Expeto alert pages — and delivers the results to Alertmanager. A failure here is silent from the operator's point of view, which is why it is worth routing.

ConfigurationReloadFailure⚓︎

Severity Fires after
Warning Immediately

Configuration reload failed for vmalert instance {{ $labels.instance }}

Configuration hot-reload failed for vmalert on instance {{ $labels.instance }}. Check vmalert's logs for detailed error message.

Trigger condition

vmalert_config_last_reload_successful != 1

AlertingRulesError⚓︎

Severity Fires after
Warning 5m

Alerting rules are failing for vmalert instance {{ $labels.instance }}

Alerting rules execution is failing for "{{ $labels.alertname }}" from group "{{ $labels.group }}" in file "{{ $labels.file }}". Check vmalert's logs for detailed error message.

Trigger condition

sum(increase(vmalert_alerting_rules_errors_total[5m])) without(id) > 0

RecordingRulesError⚓︎

Severity Fires after
Warning 5m

Recording rules are failing for vmalert instance {{ $labels.instance }}

Recording rules execution is failing for "{{ $labels.recording }}" from group "{{ $labels.group }}" in file "{{ $labels.file }}". Check vmalert's logs for detailed error message.

Trigger condition

sum(increase(vmalert_recording_rules_errors_total[5m])) without(id) > 0

RecordingRulesNoData⚓︎

Severity Fires after
Info 30m

Recording rule {{ $labels.recording }} ({{ $labels.group }}) produces no data

Recording rule "{{ $labels.recording }}" from group "{{ $labels.group }} in file "{{ $labels.file }}" produces 0 samples over the last 30min. It might be caused by a misconfiguration or incorrect query expression.

Trigger condition

sum(vmalert_recording_rules_last_evaluation_samples) without(id) < 1

TooManyMissedIterations⚓︎

Severity Fires after
Warning 15m

vmalert instance {{ $labels.instance }} is missing rules evaluations

vmalert instance {{ $labels.instance }} is missing rules evaluations for group "{{ $labels.group }}" in file "{{ $labels.file }}". The group evaluation time takes longer than the configured evaluation interval. This may result in missed alerting notifications or recording rules samples. Try increasing evaluation interval or concurrency of group "{{ $labels.group }}". See https://docs.victoriametrics.com/victoriametrics/vmalert/#groups. If rule expressions are taking longer than expected, please see https://docs.victoriametrics.com/victoriametrics/troubleshooting/#slow-queries.

Trigger condition

increase(vmalert_iteration_missed_total[5m]) > 0

RemoteWriteErrors⚓︎

Severity Fires after
Warning 15m

vmalert instance {{ $labels.instance }} is failing to push metrics to remote write URL

vmalert instance {{ $labels.instance }} is failing to push metrics generated via alerting or recording rules to the configured remote write URL. Check vmalert's logs for detailed error message.

Trigger condition

increase(vmalert_remotewrite_errors_total[5m]) > 0

RemoteWriteDroppingData⚓︎

Severity Fires after
Critical 5m

vmalert instance {{ $labels.instance }} is dropping data sent to remote write URL

vmalert instance {{ $labels.instance }} is failing to send results of alerting or recording rules to the configured remote write URL. This may result into gaps in recording rules or alerts state. Check vmalert's logs for detailed error message.

Trigger condition

increase(vmalert_remotewrite_dropped_rows_total[5m]) > 0

RemoteWriteQueueHighUsage⚓︎

Severity Fires after
Warning 15m

Remote write queue capacity on the vmalert instance {{ $labels.instance }} has exceeded 80% utilization

The remote write queue on vmalert instance {{ $labels.instance }} has consistently high utilization. The queue acts as a buffer between rules generating series and remote-write client consuming and pushing these series. When queue overflows, vmalert will start dropping newly generated series. Queue may overflow due to multiple reasons: 1. Some bad rules produce too many series at once. This can be limited using the global -rule.resultsLimit flag or limit param at the rule group level. 2. Remote write connection is slow. Increase -remoteWrite.concurrency, so vmalert could establish more concurrent connections. 3. The queue size is too small. Increase -remoteWrite.maxQueueSize to extend the buffer size. Note that a larger queue will result in higher memory consumption when the queue is full.

Trigger condition

(histogram_quantile(0.99, sum(increase(vmalert_remotewrite_queue_size_bucket[5m])) by(job,instance,vmrange,cluster)) / vmalert_remotewrite_queue_capacity) > 0.8

AlertmanagerErrors⚓︎

Severity Fires after
Warning 15m

vmalert instance {{ $labels.instance }} is failing to send notifications to Alertmanager

vmalert instance {{ $labels.instance }} is failing to send alert notifications to "{{ $labels.addr }}". Check vmalert's logs for detailed error message.

Trigger condition

increase(vmalert_alerts_send_errors_total[5m]) > 0

VictoriaMetrics single-node storage⚓︎

Storage alerts for vmsingle: disk headroom, ingestion churn, and cache utilization.

Note

The rules for both storage modes are installed regardless of which one is deployed. If your xView instance runs vmsingle, the cluster-storage group below never fires, and vice versa.

DiskRunsOutOfSpaceIn3Days⚓︎

Severity Fires after
Critical 30m

Instance {{ $labels.instance }} will run out of disk space soon

Taking into account current ingestion rate, free disk space will be enough only for {{ $value | humanizeDuration }} on instance {{ $labels.instance }}. Consider to limit the ingestion rate, decrease retention or scale the disk space if possible.

Trigger condition

((sum(vm_free_disk_space_bytes) without(path) / (((rate(vm_rows_added_to_storage_total[1d]) - sum(rate(vm_deduplicated_samples_total[1d])) without(type)) * (sum(vm_data_size_bytes{type!~"indexdb.*"}) without(type) / sum(vm_rows{type!~"indexdb.*"}) without(type))) + (rate(vm_new_timeseries_created_total[1d]) * (sum(vm_data_size_bytes{type="indexdb/file"}) without(type) / sum(vm_rows{type="indexdb/file"}) without(type))))) < 259200) > 0

NodeBecomesReadonlyIn3Days⚓︎

Severity Fires after
Warning 30m

Instance {{ $labels.instance }} will become read-only in 3 days

Taking into account current ingestion rate and free disk space instance {{ $labels.instance }} is writable for {{ $value | humanizeDuration }}. Consider to limit the ingestion rate, decrease retention or scale the disk space up if possible.

Trigger condition

((sum(vm_free_disk_space_bytes - vm_free_disk_space_limit_bytes) without(path) / (((rate(vm_rows_added_to_storage_total[1d]) - sum(rate(vm_deduplicated_samples_total[1d])) without(type)) * (sum(vm_data_size_bytes{type!~"indexdb.*"}) without(type) / sum(vm_rows{type!~"indexdb.*"}) without(type))) + (rate(vm_new_timeseries_created_total[1d]) * (sum(vm_data_size_bytes{type="indexdb/file"}) without(type) / sum(vm_rows{type="indexdb/file"}) without(type))))) < 259200) > 0

DiskRunsOutOfSpace⚓︎

Severity Fires after
Critical 30m

Instance {{ $labels.instance }} (job={{ $labels.job }}) will run out of disk space soon

Disk utilisation on instance {{ $labels.instance }} is more than 80%. Having less than 20% of free disk space could cripple merge processes and overall performance. Consider to limit the ingestion rate, decrease retention or scale the disk space if possible.

Trigger condition

(sum(vm_data_size_bytes) by(job,instance,cluster) / (sum(vm_free_disk_space_bytes) by(job,instance,cluster) + sum(vm_data_size_bytes) by(job,instance,cluster))) > 0.8

RequestErrorsToAPI⚓︎

Severity Fires after
Warning 15m

Too many errors served for path {{ $labels.path }} (instance {{ $labels.instance }})

Requests to path {{ $labels.path }} are receiving errors. Please verify if clients are sending correct requests.

Trigger condition

increase(vm_http_request_errors_total[5m]) > 0

TooHighChurnRate⚓︎

Severity Fires after
Warning 15m

Churn rate is more than 10% on "{{ $labels.instance }}" for the last 15m

VM constantly creates new time series on "{{ $labels.instance }}". This effect is known as Churn Rate. High Churn Rate is tightly connected with database performance and may result in unexpected OOM's or slow queries.

Trigger condition

(sum(rate(vm_new_timeseries_created_total[5m])) by(instance,cluster) / sum(rate(vm_rows_inserted_total[5m])) by(instance,cluster)) > 0.1

TooHighChurnRate24h⚓︎

Severity Fires after
Warning 15m

Too high number of new series on "{{ $labels.instance }}" created over last 24h

The number of created new time series over last 24h is 3x times higher than current number of active series on "{{ $labels.instance }}". This effect is known as Churn Rate. High Churn Rate is tightly connected with database performance and may result in unexpected OOM's or slow queries.

Trigger condition

sum(increase(vm_new_timeseries_created_total[24h])) by(instance,cluster) > (sum(vm_cache_entries{type="storage/hour_metric_ids"}) by(instance,cluster) * 3)

TooHighSlowInsertsRate⚓︎

Severity Fires after
Warning 15m

Percentage of slow inserts is more than 5% on "{{ $labels.instance }}" for the last 15m

High rate of slow inserts on "{{ $labels.instance }}" may be a sign of resource exhaustion for the current load. It is likely more RAM is needed for optimal handling of the current number of active time series. See also https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3976#issuecomment-1476883183

Trigger condition

(sum(rate(vm_slow_row_inserts_total[5m])) by(instance,cluster) / sum(rate(vm_rows_inserted_total[5m])) by(instance,cluster)) > 0.05

MetadataCacheUtilizationIsTooHigh⚓︎

Severity Fires after
Warning 15m

Metadata cache capacity on {{ $labels.instance }} (job={{ $labels.job }}) is utilized for more than 95% for the last 15min

Metadata cache stores meta information about ingested time series - see https://docs.victoriametrics.com/victoriametrics/#metrics-metadata. When cache is overutilized, the oldest entries will be dropped out automatically. It may result into incomplete response for /api/v1/metadata API calls. It doesn't impact regular queries or alerts. Cache size is controlled via -storage.maxMetadataStorageSize cmd-line flag.

Trigger condition

(vm_metrics_metadata_storage_size_bytes / vm_metrics_metadata_storage_max_size_bytes) > 0.95

VictoriaMetrics cluster storage⚓︎

The vmcluster equivalents of the single-node storage alerts, plus alerts for the vminsert to vmstorage connection and for index-level problems that only arise in the clustered topology.

DiskRunsOutOfSpaceIn3Days⚓︎

Severity Fires after
Critical 30m

Instance {{ $labels.instance }} will run out of disk space in 3 days

Taking into account current ingestion rate, free disk space will be enough only for {{ $value | humanizeDuration }} on instance {{ $labels.instance }}. Consider to limit the ingestion rate, decrease retention or scale the disk space up if possible.

Trigger condition

((sum(vm_free_disk_space_bytes) without(path) / (((rate(vm_rows_added_to_storage_total[1d]) - sum(rate(vm_deduplicated_samples_total[1d])) without(type)) * (sum(vm_data_size_bytes{type!~"indexdb.*"}) without(type) / sum(vm_rows{type!~"indexdb.*"}) without(type))) + (rate(vm_new_timeseries_created_total[1d]) * (sum(vm_data_size_bytes{type="indexdb/file"}) without(type) / sum(vm_rows{type="indexdb/file"}) without(type))))) < 259200) > 0

NodeBecomesReadonlyIn3Days⚓︎

Severity Fires after
Warning 30m

Instance {{ $labels.instance }} will become read-only in 3 days

Taking into account current ingestion rate, free disk space and -storage.minFreeDiskSpaceBytes instance {{ $labels.instance }} will remain writable for {{ $value | humanizeDuration }}. Consider to limit the ingestion rate, decrease retention or scale the disk space up if possible.

Trigger condition

((sum(vm_free_disk_space_bytes - vm_free_disk_space_limit_bytes) without(path) / (((rate(vm_rows_added_to_storage_total[1d]) - sum(rate(vm_deduplicated_samples_total[1d])) without(type)) * (sum(vm_data_size_bytes{type!~"indexdb.*"}) without(type) / sum(vm_rows{type!~"indexdb.*"}) without(type))) + (rate(vm_new_timeseries_created_total[1d]) * (sum(vm_data_size_bytes{type="indexdb/file"}) without(type) / sum(vm_rows{type="indexdb/file"}) without(type))))) < 259200) > 0

DiskRunsOutOfSpace⚓︎

Severity Fires after
Critical 30m

Instance {{ $labels.instance }} (job={{ $labels.job }}) will run out of disk space soon

Disk utilisation on instance {{ $labels.instance }} is more than 80%. Having less than 20% of free disk space could cripple merges processes and overall performance. Consider to limit the ingestion rate, decrease retention or scale the disk space if possible.

Trigger condition

(sum(vm_data_size_bytes) by(job,instance,cluster) / (sum(vm_free_disk_space_bytes) by(job,instance,cluster) + sum(vm_data_size_bytes) by(job,instance,cluster))) > 0.8

RequestErrorsToAPI⚓︎

Severity Fires after
Warning 15m

Too many errors served for {{ $labels.job }} path {{ $labels.path }} (instance {{ $labels.instance }})

Requests to path {{ $labels.path }} are receiving errors. Please verify if clients are sending correct requests.

Trigger condition

increase(vm_http_request_errors_total[5m]) > 0

RPCErrors⚓︎

Severity Fires after
Warning 15m

Too many RPC errors for {{ $labels.job }} (instance {{ $labels.instance }})

RPC errors are interconnection errors between cluster components. Possible reasons for errors are misconfiguration, overload, network blips or unreachable components.

Trigger condition

((sum(increase(vm_rpc_connection_errors_total[5m])) by(job,instance,cluster) + sum(increase(vm_rpc_dial_errors_total[5m])) by(job,instance,cluster)) + sum(increase(vm_rpc_handshake_errors_total[5m])) by(job,instance,cluster)) > 0

TooHighChurnRate⚓︎

Severity Fires after
Warning 15m

Churn rate is more than 10% for the last 15m

VM constantly creates new time series. This effect is known as Churn Rate. High Churn Rate tightly connected with database performance and may result in unexpected OOM's or slow queries.

Trigger condition

(sum(rate(vm_new_timeseries_created_total[5m])) by(job,cluster) / sum(rate(vm_rows_inserted_total[5m])) by(job,cluster)) > 0.1

TooHighChurnRate24h⚓︎

Severity Fires after
Warning 15m

Too high number of new series created over last 24h

The number of created new time series over last 24h is 3x times higher than current number of active series. This effect is known as Churn Rate. High Churn Rate tightly connected with database performance and may result in unexpected OOM's or slow queries.

Trigger condition

sum(increase(vm_new_timeseries_created_total[24h])) by(job,cluster) > (sum(vm_cache_entries{type="storage/hour_metric_ids"}) by(job,cluster) * 3)

TooHighSlowInsertsRate⚓︎

Severity Fires after
Warning 15m

Percentage of slow inserts is more than 5% for the last 15m

High rate of slow inserts may be a sign of resource exhaustion for the current load. It is likely more RAM is needed for optimal handling of the current number of active time series. See also https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3976#issuecomment-1476883183

Trigger condition

(sum(rate(vm_slow_row_inserts_total[5m])) by(job,cluster) / sum(rate(vm_rows_inserted_total[5m])) by(job,cluster)) > 0.05

VminsertVmstorageConnectionIsSaturated⚓︎

Severity Fires after
Warning 15m

Connection between vminsert on {{ $labels.instance }} and vmstorage on {{ $labels.addr }} is saturated

The connection between vminsert (instance {{ $labels.instance }}) and vmstorage (instance {{ $labels.addr }}) is saturated by more than 90% and vminsert won't be able to keep up. This usually means that more vminsert or vmstorage nodes must be added to the cluster in order to increase the total number of vminsert -> vmstorage links.

Trigger condition

rate(vm_rpc_send_duration_seconds_total[5m]) > 0.9

MetadataCacheUtilizationIsTooHigh⚓︎

Severity Fires after
Warning 15m

Metadata cache capacity on {{ $labels.instance }} (job={{ $labels.job }}) is utilized for more than 95% for the last 15min

Metadata cache stores meta information about ingested time series - see https://docs.victoriametrics.com/victoriametrics/#metrics-metadata. When cache is overutilized, the oldest entries will be dropped out automatically. It may result into incomplete response for /api/v1/metadata API calls. It doesn't impact regular queries or alerts. Cache size is controlled via -storage.maxMetadataStorageSize cmd-line flag.

Trigger condition

(vm_metrics_metadata_storage_size_bytes / vm_metrics_metadata_storage_max_size_bytes) > 0.95

MetricNameStatsCacheUtilizationIsTooHigh⚓︎

Severity Fires after
Warning 15m

Cache capacity for tracking metric names usage on {{ $labels.instance }} (job={{ $labels.job }}) is utilized for more than 95% during the last 15min

Metric names usage cache stores information about unique metric names and how frequently they are queried - see https://docs.victoriametrics.com/victoriametrics/#track-ingested-metrics-usage. When cache is overutilized, it will stop tracking the new metric names. It has no other negative impact. Usually, the number of unique metric names is very limited (thousands). The cache can be overutilized only if metric names are changing too frequently or if the cache size is too low. There are following ways to mitigate cache overutilization: - disable cache via --storage.trackMetricNamesStats=false flag, so metric names usage will stop tracking - increase the cache size via --storage.cacheSizeMetricNamesStats flag - reset the cache (see docs for details)

Trigger condition

(vm_cache_size_bytes{type="storage/metricNamesStatsTracker"} / vm_cache_size_max_bytes{type="storage/metricNamesStatsTracker"}) > 0.95

IndexDBRecordsDrop⚓︎

Severity Fires after
Critical Immediately

IndexDB skipped registering items during data ingestion with reason={{ $labels.reason }}.

VictoriaMetrics could skip registering new timeseries during ingestion if they fail the validation process. For example, reason=too_long_item means that time series cannot exceed 64KB. Please, reduce the number of labels or label values for such series. Or enforce these limits via -maxLabelsPerTimeseries and -maxLabelValueLen command-line flags.

Trigger condition

increase(vm_indexdb_items_dropped_total[5m]) > 0

TooManyTSIDMisses⚓︎

Severity Fires after
Critical 15m

Unexpected TSID misses for job "{{ $labels.job }}" ({{ $labels.instance }}) for the last 15 minutes

Unexpected TSID misses for "{{ $labels.job }}" ({{ $labels.instance }}) for the last 15 minutes. If this happens after unclean shutdown of VictoriaMetrics process (via "kill -9", OOM or power off), then this is OK - the alert must go away in a few minutes after the restart. Otherwise this may point to the corruption of index data.

Trigger condition

increase(vm_missing_tsids_for_metric_id_total[5m]) > 0

VictoriaMetrics process health⚓︎

Generic process-level alerts that apply to every VictoriaMetrics component — vmagent, vmalert, vmsingle, vmstorage, and the rest. The instance and job labels on a firing alert identify which component is affected.

TooManyRestarts⚓︎

Severity Fires after
Critical Immediately

{{ $labels.job }} too many restarts (instance {{ $labels.instance }})

Job {{ $labels.job }} (instance {{ $labels.instance }}) has restarted more than twice in the last 15 minutes. It might be crashlooping.

Trigger condition

changes(process_start_time_seconds{job=~".*(victoriametrics|vmselect|vminsert|vmstorage|vmagent|vmalert|vmsingle|vmalertmanager|vmauth).*"}[15m]) > 2

ServiceDown⚓︎

Severity Fires after
Critical 2m

Service {{ $labels.job }} is down on {{ $labels.instance }}

{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 2 minutes.

Trigger condition

up{job=~".*(victoriametrics|vmselect|vminsert|vmstorage|vmagent|vmalert|vmsingle|vmalertmanager|vmauth).*"} == 0

ProcessNearFDLimits⚓︎

Severity Fires after
Critical 5m

Number of free file descriptors is less than 100 for "{{ $labels.job }}"("{{ $labels.instance }}") for the last 5m

Exhausting OS file descriptors limit can cause severe degradation of the process. Consider to increase the limit as fast as possible.

Trigger condition

(process_max_fds - process_open_fds) < 100

TooHighMemoryUsage⚓︎

Severity Fires after
Critical 5m

It is more than 80% of memory used by "{{ $labels.job }}"("{{ $labels.instance }}")

Too high memory usage may result into multiple issues such as OOMs or degraded performance. Consider to either increase available memory or decrease the load on the process.

Trigger condition

(min_over_time(process_resident_memory_anon_bytes[10m]) / vm_available_memory_bytes) > 0.8

TooHighCPUUsage⚓︎

Severity Fires after
Critical 5m

More than 90% of CPU is used by "{{ $labels.job }}"("{{ $labels.instance }}") during the last 5m

Too high CPU usage may be a sign of insufficient resources and make process unstable. Consider to either increase available CPU resources or decrease the load on the process.

Trigger condition

(rate(process_cpu_seconds_total[5m]) / process_cpu_cores_available) > 0.9

TooHighGoroutineSchedulingLatency⚓︎

Severity Fires after
Critical 15m

"{{ $labels.job }}"("{{ $labels.instance }}") has insufficient CPU resources for >15m

Go runtime is unable to schedule goroutines execution in acceptable time. This is usually a sign of insufficient CPU resources or CPU throttling. Verify that service has enough CPU resources. Otherwise, the service could work unreliably with delays in processing.

Trigger condition

histogram_quantile(0.99, sum(rate(go_sched_latencies_seconds_bucket{job=~".*(victoriametrics|vmselect|vminsert|vmstorage|vmagent|vmalert|vmsingle|vmalertmanager|vmauth).*"}[5m])) by(le,job,instance,cluster)) > 0.1

TooManyLogs⚓︎

Severity Fires after
Warning 15m

Too many logs are generated for job "{{ $labels.job }}" ({{ $labels.instance }})

The job "{{ $labels.job }}" ({{ $labels.instance }}) generated {{ $value }} log messages with the level higher than info for the last 5 minutes. Check the logs for the given target. Check also the "location" label at the vm_log_messages_total metric if -loggerLevel command-line flag is set to value other than INFO. This label contains code locations responsible for generating log messages suppressed by -loggerLevel.

Trigger condition

sum(increase(vm_log_messages_total{level!="info"}[5m])) without(app_version,location,is_printed) > 0

ConcurrentInsertsHitTheLimit⚓︎

Severity Fires after
Warning 15m

{{ $labels.job }} on instance {{ $labels.instance }} is constantly hitting concurrent inserts limit

The limit of concurrent inserts on instance {{ $labels.instance }} depends on the number of CPUs. Usually, when component constantly hits the limit it is likely the component is overloaded and requires more CPU. In some cases for components like vmagent or vminsert the alert might trigger if there are too many clients making write attempts. If vmagent's or vminsert's CPU usage and network saturation are at normal level, then it might be worth adjusting -maxConcurrentInserts cmd-line flag.

Trigger condition

avg_over_time(vm_concurrent_insert_current[1m]) >= vm_concurrent_insert_capacity

TooHighQueryLoad⚓︎

Severity Fires after
Warning 15m

Read queries fail with timeout for {{ $labels.job }} on instance {{ $labels.instance }}

Instance {{ $labels.instance }} ({{ $labels.job }}) is failing to serve read queries during last 15m. Concurrency limit -search.maxConcurrentRequests was reached on this instance and extra queries were put into the queue for -search.maxQueueDuration interval. But even after waiting in the queue these queries weren't served. This happens if instance is overloaded with the current workload, or datasource is too slow to respond. Possible solutions are the following: * reduce the query load; * increase compute resources or number of replicas; * adjust limits -search.maxConcurrentRequests and -search.maxQueueDuration. See more at https://docs.victoriametrics.com/victoriametrics/troubleshooting/#slow-queries.

Trigger condition

increase(vm_concurrent_select_limit_timeout_total[5m]) > 0

RowsRejectedOnIngestion⚓︎

Severity Fires after
Warning 15m

Some rows are rejected on "{{ $labels.instance }}" on ingestion attempt

Ingested rows on instance "{{ $labels.instance }}" are rejected due to the following reason: "{{ $labels.reason }}"

Trigger condition

rate(vm_rows_ignored_total[5m]) > 0

VictoriaMetrics operator⚓︎

Health of the operator that turns the VMRule, VMAgent, and related custom resources into running configuration. While it is failing to reconcile, changes to alert rules or scrape configs are accepted but never applied.

LogErrors⚓︎

Severity Fires after
Warning 15m

Too many errors at logs of operator: {{ $value}}

Operator has too many errors at logs: {{ $value}}, check operator logs

Trigger condition

sum(rate(operator_log_messages_total{level="error",job=~".*((victoria.*)|vm)-?operator"}[5m])) by(cluster) > 0

ReconcileErrors⚓︎

Severity Fires after
Warning 10m

Too many errors at reconcile loop of operator: {{ $value}}

Operator cannot parse response from k8s api server, possible bug: {{ $value }}, check operator logs

Trigger condition

sum(rate(controller_runtime_reconcile_errors_total{job=~".*((victoria.*)|vm)-?operator"}[5m])) by(cluster) > 0

HighQueueDepth⚓︎

Severity Fires after
Warning 15m

Too many {{- $labels.name }} in queue: {{ $value }}

Operator cannot handle reconciliation load for controller: {{- $labels.name }}, current depth: {{ $value }}

Trigger condition

sum(workqueue_depth{job=~".*((victoria.*)|vm)-?operator",name=~"(vmagent|vmalert|vmalertmanager|vmauth|vmcluster|vmnodescrape|vmpodscrape|vmprobe|vmrule|vmservicescrape|vmsingle|vmstaticscrape)"}) by(name,cluster) > 10