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)
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