Runbook
This is the Skyscrapers alerts runbook (or playbook), inspired by the upstream kubernetes-mixin runbook.
On this page you should find detailed information about specific alerts comming from your monitoring system. It’s possible though that some alerts haven’t been documented yet or the information is incomplete or outdated. If you find a missing alert or inacurate information, feel free to submit an issue or pull request.
In addition to the alerts listed on this page, there are other system alerts that are described in upstream runbooks, like the one linked above. Always follow the runbook_url annotation link (:notebook:) in the alert notification to get the most recent and up-to-date information about that alert.
AWS Backup alerts
Alert Name: BackupJobsNotCompleted
- Description:
There are backup jobs created but not completed to the {{ $labels.backup_vault }} in the last 4 hours - Severity:
critical - Action: Check the AWS Backup console to see which jobs are stuck in
CREATEDorRUNNINGstate for the affected backup vault. Investigate the reason why they are not completing.
Alert Name: CopyJobsNotCompleted
- Description:
There are copy jobs created but not completed in the {{ $labels.backup_vault }} in the last 4 hours - Severity:
critical - Action: Check the AWS Backup console to see which copy jobs are stuck in
CREATEDorRUNNINGstate for the affected backup vault. Investigate the reason why they are not completing.
Kubernetes alerts
Alert Name: MemoryOvercommitted
- Description:
{{$labels.node}} is overcommited by {{$value}}% - Severity:
warning - Action: Check the actual memory usage of the cluster. If it’s not too high it might indicate that Pod resource requests are not adjusted properly. Otherwise try adding more nodes to the cluster.
Alert Name: CPUUsageHigh
- Description:
{{$labels.instance}} is using more than 90% CPU for >1h - Severity:
warning
Alert Name: NodeWithImpairedVolumes
- Description:
EBS volumes are failing to attach to node {{$labels.node}} - Severity:
critical - Action: Check the AWS Console which volumes are stuck in an
Attachingstate. Unattach the volume and delete the Pod the volume belongs to (most likely inPendingstate) so it can be rescheduled on another node. Untaint the affected node when everything is OK again.
Alert Name: NodePodsStuckPending
- Description:
{{ $value }} pods scheduled onto node {{$labels.node}} are stuck Pending and failing to start - Severity:
critical - Action: Pods were scheduled onto the node but can’t start. Find out why before acting: list them with
kubectl get pods -A --field-selector spec.nodeName=<node>and inspect their events (kubectl describe pod ...). Common node-level causes are a VPC CNI / networking failure (FailedCreatePodSandBox/cni plugin not initialized/ no IP), image-pull failures, volume attach/mount failures, or container-runtime problems; the fix depends on which. If it’s a node-level fault that won’t clear on its own, cordon, drain and terminate the node so Karpenter replaces it (the Pods reschedule onto healthy nodes). For the CNI case the node’s own logs are not shipped off-host (the on-node log shipper needs Pod networking too), so capture them before terminating the node: open an SSM session to the instance (aws ssm start-session --target <instance-id>) and read the host-local CNI logs under/var/log/aws-routed-eni/(e.g.ipamd.log,plugin.log) to root-cause theaws-node/ipamd failure.
Alert Name: ContainerExcessiveCPU
- Description:
Container {{ $labels.container }} of pod {{ $labels.namespace }}/{{ $labels.pod }} has been using {{ $value | humanizePercentage }} of it's requested CPU for 30 min - Severity:
warning - Action: Check resource usage of the container through
kubectl topor Grafana. Consider increasing the container’s CPU request and/or setting a limit.
Alert Name: ContainerExcessiveMEM
- Description:
Container {{ $labels.container }} of pod {{ $labels.namespace }}/{{ $labels.pod }} has been using {{ $value | humanizePercentage }} of it's requested Memory for 30 min - Severity:
warning - Action: Check resource usage of the container through
kubectl topor Grafana. Consider increasing the container’s Memory request and/or setting a limit.
Alert Name: KubePersistentVolumeInodesFillingUp
- Description:
The PersistentVolume claimed by {{ $labels.persistentvolumeclaim }} in Namespace {{ $labels.namespace }} is running low on inodes (the filesystem's limit on number of files, separate from disk space). - Severity:
warning(running out within 4 days) orcritical(already close to the limit) - Action: An inode is the filesystem’s internal record for a file, separate from disk space; you can run out of inodes (and be unable to create new files) even with free space left, usually because something is creating a very large number of small files. Exec into a pod using the volume and run
df -i <mount path>to confirm, thenfind <mount path> -xdev | wc -lper subdirectory to find what’s creating them (common causes: log rotation writing too many small files, or an application not cleaning up temp files). Clean up the offending files. If the workload genuinely needs this many files, resizing the volume generally allows more inodes to be allocated on next resize, but confirm this holds for the filesystem in use before relying on it as the fix.
Alert Name: KubePdbNotEnoughHealthyPods
- Description:
A PodDisruptionBudget (a rule protecting a minimum number of running pods during voluntary disruptions, e.g. node drains or Karpenter consolidation) isn't satisfied. - Severity:
warning - Action: A PodDisruptionBudget (PDB) is a rule limiting how many replicas of a workload can be taken down at once during voluntary operations like node drains or cluster upgrades, to keep the service available. This alert means too few healthy pods are left for that rule to be satisfied, which will block those voluntary operations until it’s resolved. Find the PDB with
kubectl get pdb -n <namespace>and checkALLOWED DISRUPTIONS(0 means nothing can currently be evicted). The PDB itself is rarely the problem, it’s reporting that pods behind it are already unhealthy. Find the pods with the PDB’s selector andkubectl describe pod ...them to find the actual failure (crash, not ready, pending). Fixing the underlying pod issue resolves the alert.
Alert Name: KubeDeploymentGenerationMismatch
- Description: The most recent rollout of this Deployment did not complete and the controller could not roll back automatically, it needs manual attention.
- Severity:
warning - Action: Every time a Deployment’s spec changes (a new image, a config change), Kubernetes assigns it a new generation and rolls out new pods to match. This alert means the last rollout didn’t finish and the controller couldn’t automatically revert to the previous working version, so the workload may be stuck partway between two versions. Check
kubectl rollout status deployment/<name> -n <namespace>andkubectl describe deployment/<name> -n <namespace>for the reason, commonly a bad image tag, a failing readiness probe on the new Pods, or a resource request that can’t be scheduled. Fix the underlying issue and re-trigger the rollout, orkubectl rollout undoto return to the last working revision.
Alert Name: KubeStatefulSetGenerationMismatch
- Description: The most recent rollout of this StatefulSet did not complete and the controller could not roll back automatically, it needs manual attention.
- Severity:
warning - Action: Same idea as the Deployment version above, Kubernetes assigns a new generation on every spec change and rolls out new pods to match; this alert means the last rollout didn’t finish and couldn’t be reverted automatically. Check
kubectl rollout status statefulset/<name> -n <namespace>andkubectl describe statefulset/<name> -n <namespace>for the reason, commonly a bad image tag, a failing readiness probe on the new Pods, or a resource request that can’t be scheduled. Fix the underlying issue and re-trigger the rollout, orkubectl rollout undoto return to the last working revision.
Alert Name: TargetDown
- Description:
{{ printf "%.4g" $value }}% of the {{ $labels.job }}/{{ $labels.service }} targets in {{ $labels.namespace }} namespace are down. - Severity:
warning - Action: Prometheus “scrapes” metrics by periodically pulling them from an HTTP endpoint each service exposes. This alert fires when Prometheus can’t reach that endpoint, it does not mean the service itself is unavailable to its users, those are two different things. Check
kubectl get pods -n <namespace>for the affected workload, and check the target’s status on the Prometheus/targetspage for the actual scrape error (connection refused, timeout, wrong port). Common causes: the metrics port isn’t listening yet, aServiceMonitor/PodMonitor(the Kubernetes objects that tell Prometheus where to scrape) pointing at the wrong port or path, or a NetworkPolicy blocking Prometheus. If the Pods themselves are healthy and serving traffic, this is a monitoring gap, not an outage.
Karpenter alerts
Alert Name: KarpenterNodepoolAlmostFull
Note
This covers both KarpenterSystemNodepoolAlmostFull (our own system nodepool) and KarpenterCustomNodepoolAlmostFull (any other nodepool)
- Description:
Nodepool {{ $labels.nodepool }} launched {{ $value }}% {{ $labels.resource_type }} resources of the limit. - Severity:
warning - Action: The nodepool is approaching the resource limit set on it, Karpenter won’t be able to launch further nodes there once it’s reached. Check the linked Grafana dashboard for the trend, and increase the nodepool’s limits if the growth is expected.
Alert Name: KarpenterNodepoolFull
Note
This covers both KarpenterSystemNodepoolFull (our own system nodepool) and KarpenterCustomNodepoolFull (any other nodepool)
- Description:
Nodepool {{ $labels.nodepool }} launched {{ $value }}% {{ $labels.resource_type }} resources of the limit. - Severity:
critical - Action: The nodepool has reached its resource limit, Karpenter can no longer launch new nodes in it, so pods that need a new node will stay
Pending. Increase the nodepool’s limits.
Keda alerts
Alert Name: KedaScalerErrors
- Description:
Keda scaledObject {{ $labels.scaledObject }} is experiencing errors with {{ $labels.scaler }} scaler - Severity:
warning - Action: The KEDA scaler backing this
ScaledObject(the resource that tells KEDA how to scale a workload based on an external metric) is failing to query its source, so autoscaling for that workload isn’t working reliably. Check thekeda-operatorpod logs for the specific error, common causes are the external metric source being unreachable or a misconfigured trigger.
OpenSearch alerts
Alert Name: OpenSearchClusterHealthRed
- Description:
AWS OpenSearch cluster health for {{ $labels.domain_name }} is RED! At least one primary shard and its replicas are not allocated to a node. Check <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/handling-errors.html#handling-errors-red-cluster-status> for more information. - Severity:
critical
Alert Name: OpenSearchClusterHealthYellow
- Description:
AWS OpenSearch cluster health for {{ $labels.domain_name }} is YELLOW. At least one replica shard is not allocated to a node. Check <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/handling-errors.html#handling-errors-yellow-cluster-status> for more information. - Severity:
warning
Alert Name: OpenSearchFreeStorageSpaceRunningLow
- Description:
Based on recent sampling, storage is expected to fill up in 6 hours for Openseach {{ $labels.domain_name }}. - Severity:
warning
Alert Name: OpenSearchFreeStorageSpaceWarning
- Description:
Based on recent sampling, storage is expected to fill up in 4 days for OpenSearch {{ $labels.domain_name }}. - Severity:
warning
Alert Name: OpenSearchFreeStorageSpaceCritical
- Description:
Based on recent sampling, storage is less than 20Gi and expected to fill up in 6 hours for OpenSearch {{ $labels.domain_name }}. - Severity:
critical - Action: Increase volume sizes of the OpenSearch domain.
Alert Name: OpenSearchIndexWritesBlocked
- Description:
AWS OpenSearch {{ $labels.domain_name }} has been blocking incoming write requests for 5 minutes. Check <https://docs.aws.amazon.com/opensearch-service/latest/developerguide/handling-errors.html#troubleshooting-cluster-block> for more information. - Severity:
critical - Action: Indicates that the ES cluster is blocking incoming write requests and you should check other alerts & the Opensearch Dashboard for the reason as to why. Some common factors include the following:
FreeStorageSpaceis too low orJVMMemoryPressureis too high. To alleviate this issue, consider adding more disk space or scaling your cluster.
Alert Name: OpenSearchJVMMemoryPressureHigh
- Description:
The JVM heap usage for OpenSearch domain {{ $labels.domain_name }} on node {{ $labels.node_id }} has been over 95% for 5 minutes. The cluster could encounter out of memory errors if usage increases. Consider scaling vertically. OpenSearch Service uses half of an instance's RAM for the Java heap, up to a heap size of 32 GiB. You can scale instances vertically up to 64 GiB of RAM, at which point you can scale horizontally by adding instances. - Severity:
warning - Action: Consider scaling vertically first, and then horizontally if needed.
Alert Name: OpenSearchAutomatedSnapshotFailed
- Description:
AWS OpenSearch automated snapshot failed for domain {{ $labels.domain_name }}. - Severity:
warning - Action: You can check the snapshot status the same way as for alert
OpenSearchSnaphotFailuresbelow. This alert means that the AWS-provided automated snapshots are failing, which usually is the case when is in a RED state or when another snapshot is already running.
Alert Name: OpenSearchSnaphotFailures
- Description:
There are OpenSearch snapshot failures for {{ $labels.job }} on repository {{ $labels.repository }}! - Severity:
warning - Action: Check the snapshot status and look for errors via the OpenSearch Dashboard or with
curl -s 'https://<endpoint>/_cat/snapshots/s3-manual?pretty&v'andcurl -s 'https://<endpoint>/_snapshot?pretty'and look for errors. We deploy and make use of OpenSearch Snapshot Management, on top of the automated AWS snapshots. Check the Snapshot management documentation for more information.
Fluent Bit alerts
Alert Name: FluentbitDroppedRecords
- Description:
Fluent Bit {{ $labels.pod }} is failing to save records to output {{ $labels.name }} - Severity:
critical - Action: Check the fluent-bit pod’s logs for error messages and to see which records are failing to upload.
- OpenSearch: In case of OpenSearch mapping errors, it’s possible that the ES HTTP response is cut off in the fluentbit logs. In that case, set
Buffer_Size Falsein the fluent-bit ESOUTPUTconfig. - OpenSearch: Make sure your application logs are structured (json recommended) and fields’ data types across your applications are consistent.
- OpenSearch: In case of OpenSearch mapping errors, it’s possible that the ES HTTP response is cut off in the fluentbit logs. In that case, set
Flux alerts
Alert Name: FluxResourceNotReady
Note
This covers both the FluxSystemResourceNotReady (SkS system) and FluxAppsResourceNotReady (customer apps) alerts
- Description:
{{ $labels.customresource_kind }} {{ $labels.name }} in namespace {{ $labels.exported_namespace }} hasn't been READY for 15 minutes! - Severity:
critical(SkS system) or customer choice:info,warning,critical(default) - Action: Use our Flux debugging docs.
Alert Name: FluxResourceSuspended
Note
This covers both the FluxSystemResourceSuspended (SkS system) and FluxAppsResourceSuspended (customer apps) alerts
- Description:
{{ $labels.customresource_kind }} {{ $labels.name }} in namespace {{ $labels.exported_namespace }} has been SUSPENDED for 8 hours! - Severity:
warning - Action: Use
flux resume ...on the resource to unsuspend.
Loki alerts
Alert Name: LokiDiscardingSamples
- Description:
Loki is discarding ingested samples for reason {{ $labels.reason }} - Severity:
critical - Action: This metric records when an entry was rejected, with a
reasontag saying why. The reason why the request is dropped is usually due torate-limitingand it is up to the client (Fluent Bit) to retry. This alert is considered critical, because it means logs are lost if the client gives up. In this case you can increase the cluster definition valuesspec.grafana_loki.ingestion_rate_mband/orspec.grafana_loki.ingestion_burst_size_mb, eg. try doubling their size.
Alert Name: LokiNotFlushingChunks
- Description:
Loki writer {{ $labels.pod }} has not flushed any chunks for more than 40 minutes - Severity:
critical - Action: This alert could fire due to a problem in the Loki writers themselves, a configuration error with the S3 bucket, or due to an outage in S3. First check the Loki writer Pods for any signs of trouble. Check the Pods logs, if there’s a problem connecting to S3 it will show up in the writer logs. Revise the configuration of the components that allow the Pod to access S3 (
ServiceAccount, IAM role and IAM policy).
Alert Name: LokiBackendCompactorFailing
- Description:
Loki compactor {{ $labels.pod }} is failing - Severity:
warning - Action: The compactor is responsible for compacting the chunks in the storage. If the compactor is failing, it means that the chunks are not being compacted and the storage will grow indefinitely. Check the Backend Pod logs for any errors.
MongoDB alerts
Alert Name: MongodbMetricsDown
- Description:
The MongoDB metrics exporter for {{ $labels.job }} is down! - Severity:
critical - Action: The MongoDB metrics exporter is running on the MongoDB servers. Check the
mongodb-monitoring-metricsservice to know which endpoints it is targetting by usingkubectl describe service -n infrastructure mongodb-monitoring-metrics.
Alert Name: MongodbLowConnectionsAvailable
- Description:
Low connections available on {{$labels.instance}} - Severity:
warning - Action: The cluster is running out of connections to accept. This needs to be looked at. Try to find the cause of the buildup of queries (slow queries or something that is going crazy). If the node runs out of connections the replication can come into problems and cause the whole cluster to fail.
Alert Name: MongodbUnhealthyMember
- Description:
A mongo node with issues has been detected on {{$labels.instance}} - Severity:
critical
Alert Name: MongodbReplicationLagWarning
- Description:
The replication is running out on {{$labels.instance}} more than 10 seconds - Severity:
warning
Alert Name: MongodbReplicationLagCritical
- Description:
The replication is running out on {{$labels.instance}} more than 60 seconds - Severity:
critical
RDS alerts
Alert Name: RDSCPUCreditBalanceLow
- Description:
The CPU credit balance for {{ $labels.dbinstance_identifier }} is less than 5! - Severity:
info - Action: Applies to burstable instance classes (T-family). Once the credit balance hits 0, the instance is throttled to its baseline CPU performance, there’s no further alert once that happens. Check whether sustained CPU usage is expected; if so, consider unlimited credit mode or a non-burstable instance class.
Alert Name: RDSBurstBalanceLow
- Description:
EBS BurstBalance for RDS instance {{ $labels.dbinstance_identifier }} is lower than 20%. - Severity:
info - Action: This is the storage volume’s IOPS credit balance (not CPU). Once exhausted, disk I/O is throttled to the volume’s baseline IOPS, which shows up as slow queries. Check for heavy IO-intensive queries with the customer; if needed, increase the EBS volume size or switch to a Provisioned IOPS (PIOPS) volume.
Alert Name: RDSFreeableMemoryLow
- Description:
RDS instance {{ $labels.dbinstance_identifier }} is running low on memory (< 100Mb)! - Severity:
info - Action: An early warning; if memory keeps dropping,
RDSFreeableMemoryCriticalfires below 10Mb. Check for memory-heavy queries or connections, consider scaling to a larger instance class if this is a recurring pattern rather than a one-off spike.
Alert Name: RDSFreeableMemoryCritical
- Description:
RDS instance {{ $labels.dbinstance_identifier }} is running very low on memory (< 10Mb)! - Severity:
critical - Action: The instance is close to running out of memory, which can lead to connection failures or an OOM event. Check active queries and connections immediately, and scale to a larger instance class if the underlying workload has genuinely outgrown it.
Alert Name: RDSFreeStorageSpaceRunningLow
- Description:
Based on recent sampling, disk storage is expected to fill up in four days for RDS instance {{ $labels.dbinstance_identifier }}. - Severity:
info - Action: The first of four storage alerts on an escalating scale (this one,
RDSFreeStorageSpaceWarning,RDSFreeStorageSpacePredictCritical,RDSFreeStorageSpaceCriticallyLow), based on the current fill trend rather than a fixed threshold. Plan a storage increase before it reaches the later, more urgent alerts.
Alert Name: RDSFreeStorageSpaceWarning
- Description:
Based on recent sampling, disk storage is expected to fill up in 6 hours for RDS instance {{ $labels.dbinstance_identifier }}. - Severity:
warning - Action: The trend now points to running out of storage within 6 hours. Increase the allocated storage (or enable storage autoscaling) before it reaches
RDSFreeStorageSpacePredictCritical.
Alert Name: RDSFreeStorageSpacePredictCritical
- Description:
Based on recent sampling, disk storage is less than 10Gi and expected to fill up in 6 hours for RDS instance {{ $labels.dbinstance_identifier }}. - Severity:
critical - Action: Same trend-based prediction as
RDSFreeStorageSpaceWarning, now combined with an absolute floor (< 10Gi free). Increase storage immediately, running out will make the instance unable to accept writes.
Alert Name: RDSFreeStorageSpaceCriticallyLow
- Description:
RDS instance {{ $labels.dbinstance_identifier }} has less than 2 GiB of free storage. - Severity:
critical - Action: Fires on the absolute amount of free storage regardless of trend, catching a sudden fill (e.g. a burst of writes) that the predictive alerts above wouldn’t catch in time. Increase storage immediately.
Alert Name: RDSDiskQueueDepthHigh
- Description:
The number of outstanding IO requests waiting to access the disk is high for RDS instance {{ $labels.dbinstance_identifier }}. - Severity:
info - Action: Indicates disk I/O contention building up, usually a precursor to slow queries. Check for heavy IO-intensive queries with the customer; if it’s sustained, increasing IOPS or moving to a faster storage type may help.
Alert Name: RDSCPUUsageHigh
- Description:
CPU usage for RDS instance {{ $labels.dbinstance_identifier }} is higher than 95%. - Severity:
info - Action: Check
pg_stat_activity/SHOW PROCESSLIST(depending on engine) or Performance Insights for what’s driving CPU usage. Consider query optimization or scaling to a larger instance class if sustained.
Alert Name: RDSReplicaLagHigh
- Description:
Replica lag for RDS instance {{ $labels.dbinstance_identifier }} is higher than 30 seconds. - Severity:
critical - Action: The read replica is falling behind the primary, reads against it may return stale data. Check for long-running transactions or heavy write load on the primary, and the replica’s own resource usage (CPU, IO).
Concourse alerts
ConcourseWorkersMismatch
- Description:
There are stale Concourse workers for more than an hour - Severity: `critical
ConcourseWorkerCPUCreditBalanceLow
- Description:
Minimum CPU credit balance of one of Concourse workers has reached 0 for an hour - Severity: `critical
ConcourseWorkerEBSIOBalanceLow
- Description:
EBS IO balance balance of one of Concourse workers volumues has reached 0 for an hour - Severity: `critical
Aler Name: ConcourseEndpointDown
- Description:
Concourse endpoint has been down for 5 minutes. - Severity:
critical
Redshift alerts
Alert Name: RedshiftExporterDown
- Description:
The Redshift metrics exporter for {{ $labels.job }} is down! - Severity:
critical - Action: Check the
Redshift-exporterPods withkubectl get pods -n infrastructure -l app=redshift-exporter,release=logging-redshift-monitorand look at the Pod logs usingkubectl logs -n infrastructure <pod>for further information.
Alert Name: RedshiftHealthStatus
- Description:
Redshift cluster is not healthy for {{ $labels.cluster }}! - Severity:
critical - Action: logon to the aws account and open the Redshift dashboard. Investigate why the cluster is not healthy and take action
Alert Name: RedshiftMaintenanceMode
- Description:
Redshift cluster is in maintenance mode for {{ $labels.cluster }}! - Severity:
warning - Action: Maintenance mode is active for the cluster (this should normally be planned and expected). Cluster availability might be impacted.
Alert Name: RedshiftLowDiskSpace
- Description:
AWS Redshift cluster {{ $labels.cluster }} is low on free disk space - Severity:
warning - Action: Disk space is running low on the cluster. Check off if this is expected and take action to increase the disk space together with the lead engineer and the customer.
Alert Name: RedshiftNoDiskSpace
- Description:
AWS Redshift cluster {{ $labels.cluster }} is out of free disk space - Severity:
critical - Action: There is no disk space left on the cluster. Take immediate action and increase storage on the cluster.
Alert Name: RedshiftCPUHigh
- Description:
AWS Redshift cluster {{ $labels.cluster }} is running at max CPU for 30 minutes - Severity:
warning - Action: The cluster is running at max CPU for at least 30 minutes. Check what causes this together with the customer and if needed take action.
cert-manager alerts
Alert Name: CertificateAboutToExpire
- Description:
A cert-manager certificate is about to expire - Severity:
warning - Action: cert-manager automatically requests and renews TLS certificates from Let’s Encrypt, this alert means that hasn’t happened yet and there’s less than two weeks left before the current one expires. Check
kubectl describe certificate <name> -n <namespace>for the reason under itsReadycondition, and thecert-managerpod logs if that isn’t enough.
Alert Name: CertificateCritical
- Description:
A cert-manager certificate needs immediate attention: it's either expiring in less than a week, or failing to be issued/renewed. - Severity:
critical - Action: cert-manager automatically requests and renews TLS certificates from Let’s Encrypt. This alert means a certificate is either very close to expiring or cert-manager is actively failing to issue/renew it, either way the site could soon start serving over HTTPS with an invalid certificate. Check
kubectl describe certificate <name> -n <namespace>for theReadycondition and its reason/message. If issuance is failing, check the associatedCertificateRequestandOrder/Challenge(the intermediate resources cert-manager creates while requesting a certificate from Let’s Encrypt) withkubectl get certificaterequest,order,challenge -n <namespace>and inspect events on the failing one. Common causes: the HTTP-01 solver ingress not reachable (checktraefik/ingress-nginxand DNS), a Let’s Encrypt rate limit, or theletsencrypt-prodClusterIssuer(the resource that tells cert-manager how to talk to Let’s Encrypt) itself being unhealthy (kubectl describe clusterissuer letsencrypt-prod). If it’s close to expiry and issuance keeps failing, this needs to be fixed before the certificate expires, or the service will start serving with an expired certificate.
Alert Name: AmazonMQCWExporterDown
- Description:
An AmazonMQ for RabbitMQ metrics exporter is down - Severity:
warning | critical - Action: Check why the Cloudwatch exporter is failing.
Alert Name: AmazonMQMemoryAboveLimit
- Description:
AmazonMQ for RabbitMQ node memory usage is above the limit. Cluster is now blocking producer connections - Severity:
warning | critical - Action: Switch to a bigger instance type for your AmazonMQ broker
Alert Name: AmazonMQDiskFreeBelowLimit
- Description:
AmazonMQ for RabbitMQ node free disk space is lower than the limit. Cluster is now blocking producer connections - Severity:
warning | critical - Action: Switch to a bigger instance type for your AmazonMQ broker
ExternalDNS alerts
Alert Name: ExternalDnsRegistryErrorsIncrease
- Description:
External DNS registry Errors increasing constantly - Severity:
warning - Action:
Registryerrors are mostly Provider errors, unless there’s some coding flaw in the registry package. Provider errors often arise due to accessing their APIs due to network or missing cloud-provider permissions when reading records. When applying a changeset, errors will arise if the changeset applied is incompatible with the current state. In case of an increased error count, you could correlate them with thehttp_request_duration_seconds{handler="instrumented_http"}metric which should show increased numbers for status codes 4xx (permissions, configuration, invalid changeset) or 5xx (apiserver down). You can use the host label in the metric to figure out if the request was against the Kubernetes API server (Source errors) or the DNS provider API (Registry/Provider errors).
Alert Name: ExternalDNSSourceErrorsIncrease
- Description:
External DNS source Errors increasing constantly - Severity:
warning - Action:
Sources are mostly Kubernetes API objects. Examples ofsourceerrors may be connection errors to the Kubernetes API server itself or missing RBAC permissions. It can also stem from incompatible configuration in the objects itself like invalid characters, processing a broken fqdnTemplate, etc. In case of an increased error count, you could correlate them with thehttp_request_duration_seconds{handler="instrumented_http"}metric which should show increased numbers for status codes 4xx (permissions, configuration, invalid changeset) or 5xx (apiserver down). You can use the host label in the metric to figure out if the request was against the Kubernetes API server (Source errors) or the DNS provider API (Registry/Provider errors).
Velero alerts
Alert Name: VeleroBackupPartialFailures
- Description:
Velero backup {{ $labels.schedule }} has {{ $value | humanizePercentage }} partial failures. - Severity:
warning - Action: Check whether the
veleroPod crashes during backup (eg. OOMKill). Check whether velero is trying to backup stale PV/PVCs with a deleted cloud-provider volume (velero back describe ...&velero backup logs ...).
Alert Name: VeleroBackupFailures
- Description:
Velero backup {{ $labels.schedule }} has {{ $value | humanizePercentage }} failures. - Severity:
warning - Action: Check the backup (
velero back describe ...) and it’s logs (velero backup logs ...) for the failure reason.
Alert Name: VeleroVolumeSnapshotFailures
- Description:
Velero backup {{ $labels.schedule }} has {{ $value | humanizePercentage }} volume snapshot failures. - Severity:
warning - Action: Check the backup (
velero back describe ...) and it’s logs (velero backup logs ...) for the failure reason.
Alert Name: VeleroBackupTooOld
- Description:
Cluster hasn't been backed up for more than 3 days. - Severity:
critical - Action: This will fire if backups have failed due to any of the above reasons, check the other alerts to figure out what’s wrong.
VPA alerts
Alert Name: VPAAdmissionControllerDown
- Description:
The VPA AdmissionController is down - Severity:
warning - Action: The AdmissionController part is down of the VPA. Debug in logs and see upstream for more info
Alert Name: VPAAdmissionControllerSlow
- Description:
The VPA AdmissionController is slow - Severity:
warning - Action: The AdmissionController part is slow of the VPA. Requests are taking slower than 5s to complete. Debug in logs and see upstream for more info
Alert Name: VPARecommenderDown
- Description:
The VPA Recommender is down - Severity:
warning - Action: The Recommender part is down of the VPA. Debug in logs and see upstream for more info
Alert Name: VPARecommenderSlow
- Description:
The VPA Recommender is slow - Severity:
warning - Action: The Recommender part is slow of the VPA. Requests are taking slower than 5s to complete. Debug in logs and see upstream for more info
Alert Name: VPAUpdaterDown
- Description:
The VPA Updater is down - Severity:
warning - Action: The Updater part is down of the VPA. Debug in logs and see upstream for more info
Alert Name: VPAUpdaterSlow
- Description:
The VPA Updater is slow - Severity:
warning - Action: The Updater part is slow of the VPA. Requests are taking slower than 5s to complete. Debug in logs and see upstream for more info