Alerting

An alert that fires when nothing is actually wrong trains people to ignore alerts — and an ignored alert is worse than no alert, because it creates false confidence while the real incident scrolls past unnoticed. Good alerting is ruthlessly selective: page a human only for things that are both urgent and real, alert on what users feel, and treat every noisy alert as a bug to fix.

Telemetry and SLOs tell you how the system is doing; alerting is how you find out without staring at dashboards. But alerting is where observability most often goes wrong — not from too few alerts, but from too many. This post covers the principles of alerting that works: alert on symptoms not causes, tie alerts to SLOs, fight alert fatigue, and design for the humans who get paged. Done right, alerting catches real problems early; done wrong, it burns out your team and hides the incidents that matter.

The cardinal sin: alert fatigue

The defining failure of alerting is alert fatigue — so many alerts, so many of them false or unactionable, that people stop trusting and reading them. This is worse than having no alerting, because:

Every principle that follows serves one goal: every alert should be real, urgent, and actionable, so that when something pages you, you know it matters and act. The bar for paging a human is high, and keeping it high is the whole game. Treat a false or noisy alert as a bug — something to fix or delete, not tolerate — because each one erodes the system’s value.

Alert on symptoms, not causes

The most important principle: alert on symptoms (what the user experiences), not causes (internal conditions). Page when users are affected — requests failing, latency high, the SLO burning — not on every internal metric that might indicate a problem.

Cause-based (avoid paging on these):     Symptom-based (page on these):
  CPU is at 90%                            error rate exceeds SLO
  a disk is filling                        p99 latency exceeds SLO
  one server restarted                     users can't complete checkout
  memory usage is high                     the service is down

Why symptoms over causes:

Causes still belong in your telemetry — they’re how you diagnose an alert once it fires (the dashboards, the traces, the logs). But the page should be triggered by user-facing symptoms. Diagnose with causes; alert on symptoms.

Tie alerts to SLOs and error budgets

The SLOs from the last post give you the sharpest symptom-based alerts. Instead of arbitrary thresholds (“alert if latency > 500ms” — why 500?), alert on SLO burn: page when you’re consuming your error budget fast enough to threaten the SLO.

Burn-rate alerting is the mature form of symptom-based alerting: it’s tied to a user-centric SLO, it distinguishes urgent (fast burn → page now) from non-urgent (slow burn → look into it), and it inherently filters out the small fluctuations that don’t endanger the budget. If you take one concrete alerting practice from this series, it’s alert on SLO burn rate.

Designing alerts for humans

Alerts are consumed by tired humans, often at 3 a.m., so design for them:

The on-call reality

Alerting exists to drive on-call response, and humane on-call is part of alerting design:

Alerting is where observability becomes response, and its quality is measured not by how many alerts you have but by how trustworthy each one is. Alert on user-facing symptoms and SLO burn, keep the paging bar high, make every alert actionable with context, and protect the humans on the other end. The final post pulls the whole series together into instrumenting a real system and building the practice.

Key takeaways

Further reading

Sources & References

Symptom and burn-rate alerting