Skip to main content
RunBook Academy

LinuxLXVII · Cluster MonitoringActionable alerts

Actionable cluster alerts - the alert that leads to action

Intermediate⏱ ~10 minbashmonitoring

What you'll learn

  • Design alerts that lead to action
  • Match the alert to the runbook
  • Avoid alert fatigue
  • Document the alert taxonomy

Prerequisites

Verified against Ubuntu 24.04 LTS · Debian 12 (Bookworm) · RHEL 9.x · Rocky Linux 9.x · AlmaLinux 9.x · Linux kernel 6.1 LTS / 6.6 LTS · systemd 255+ · OpenSSH 8.7p1 (RHEL 9) / 9.6p1 (Ubuntu 24.04) · nftables 1.0.x · chrony 4.x · Pacemaker 2.1.x · Corosync 3.1.x · 2026-08-09

Not yet marked complete on this device.

An actionable alert leads to a specific action. An inactionable alert is noise. This lesson covers how to design alerts that are actionable.

What makes an alert actionable

An actionable alert has:

  • Symptom: what the user is experiencing.
  • Action: what the operator should do.
  • Runbook: link to the procedure.
  • Severity: how urgent is the response.

A good alert:

  • “API latency p99 > 1 second for 5 minutes” is actionable: investigate the application, check the recent deploy, roll back if needed.
  • “Cluster quorum lost” is actionable: investigate the network, restore connectivity, fence the lost node.
  • “Disk will be full in 7 days at the current rate” is actionable: archive old data or grow the volume. Note what makes it good - it is a prediction of user impact with a deadline attached, not a level crossed.

A bad alert:

  • “CPU > 80%” is not actionable: CPU is high, but the operator does not know what to do. Compare it with the disk alert above: 80% CPU says nothing about when, or whether, anything breaks.

Avoid alert fatigue

Alert fatigue is when the operator ignores all alerts because most are noise:

  • Alert only on user impact: a user is experiencing a problem.
  • Alert only on actionable signals: the operator can do something.
  • Route resource metrics to the right lane: CPU, memory and disk rarely justify waking someone. They are not forbidden - they belong in a ticket lane, and they page only when they predict imminent user impact. See below.
  • Deduplicate and group: one alert per incident, not per metric.

Match alert to runbook

Every alert should have a runbook:

ALERT: ClusterQuorumLost
SEVERITY: critical
SYMPTOM: Pacemaker cannot make decisions
ACTION: Investigate the network, restore connectivity, or
        fence the lost node
RUNBOOK: /runbooks/cluster/quorum-loss.md

The runbook is the procedure. The alert is the trigger. The operator knows what to do.

Alert taxonomy

For a cluster, define a taxonomy of alerts:

AlertLaneAction
ClusterQuorumLostpageNetwork or fence
NodeOfflineticketInvestigate; the cluster is still serving, but the redundancy is spent
ResourceNotRunning anywherepageCheck logs, restart — no node is running it, so the user is affected
ResourceNotRunning on one nodeticketIt failed over; the service is up. Diagnosis, not a page
ResourceFailsToStartpageCheck constraints, target — it cannot recover on its own
FailoverFrequencyHighticketReview constraints, capacity
SplitBrainDetectedpageFence, restore data

The split of ResourceNotRunning into two rows is the whole point. “This resource is not running here” is normal — it is what a successful failover looks like. Alert on the aggregate instead:

# nobody is running it: this is user impact, page
count by (resource) (ha_cluster_pacemaker_resources{status="started"}) == 0

Each alert is clear, has a lane, and has a runbook.

Which lane, and why

  • Page on user-facing symptoms and on states the cluster cannot recover from by itself: unreachable service, latency outside objective, quorum lost, split brain, a resource running nowhere.
  • Ticket on degraded-but-running and on resource pressure: one node left, a failover that already succeeded, a filesystem at 85%, a fence device not proven this quarter.
  • Never neither. A cluster that has spent its redundancy is one failure from an outage, and without the ticket nobody is looking. This is the same split cluster monitoring design makes; the two lessons agree.

For resource metrics, the lane follows from the query. A level is a ticket; a prediction is a page:

# ticket: a filesystem is filling up
node_filesystem_avail_bytes / node_filesystem_size_bytes < 0.15

# page: it will be full within four hours at the current rate
predict_linear(node_filesystem_avail_bytes[6h], 4*3600) < 0

Knowledge check

Knowledge check · 3 questions

  1. Q1. Which of the following is an actionable alert?

  2. Q2. Alerting on every metric is best practice.

  3. Q3. Which of the following are required for an actionable alert? Select all that apply.

Passing score: 75%. Answers are checked in this browser.