1.Symptom-based alerting: the six signals tied to user impact
A symptom is something a user (or a downstream system acting on their behalf) actually experiences — a failed request, a slow page, a stale dashboard. An alert should fire on symptoms, not on whatever happens to be easy to measure inside a server. The roadmap names six symptom signals that cover most systems: error rate (the fraction of requests failing), tail latency (p95/p99, not the average, since the average hides exactly the slow requests users notice), saturation (how close a resource is to its limit — queue depth, connection pool usage, thread pool occupancy), queue age (how long the oldest unprocessed item has been waiting, which is what a user or downstream consumer actually feels), data freshness (how stale a cache, replica, or materialized view is relative to the source of truth), and availability (whether the service can be reached and used at all, as an end-to-end measurement). Each of these maps to something a real person or dependent service notices going wrong — which is the entire design principle.
Key features
- Error rate: fraction of requests failing — usually alerted as a ratio (errors/total) over a rolling window, not a raw count, so it scales with traffic
- Tail latency (p95/p99): the average can look healthy while a meaningful fraction of users wait far longer than that — alert on the percentile, not the mean
- Saturation: how full a resource is relative to its limit (queue depth, connection pool, thread pool, disk) — a leading indicator that precedes errors and latency
- Queue age: the wait time of the oldest unprocessed item — a growing queue with fast individual processing can still mean every user is waiting minutes
- Data freshness: staleness of a cache, read replica, or materialized view versus the source of truth — silently stale data causes wrong answers with no errors at all
- Availability: whether the service can be reached and used end-to-end — usually measured as a black-box, external probe rather than trusting the service's own report of itself
The six symptom signals and what a user actually feels when each fires
- Error rate — requests failing
- Tail latency — p95/p99, not mean
- Saturation — resource near limit
- Queue age — oldest item waits
- Data freshness — staleness vs source
- Availability — reachable end-to-end
Command
# Symptom-based alert definitions (conceptual)
- name: checkout-error-rate
expr: rate(errors[5m]) / rate(requests[5m]) > 0.02
for: 5m
severity: page
- name: checkout-p99-latency
expr: histogram_quantile(0.99, latency_bucket) > 800ms
for: 10m
severity: page
- name: order-queue-age
expr: oldest_unprocessed_item_age_seconds > 120
for: 5m
severity: pageAlert on what a user or dependent system actually experiences — error rate, tail latency (p95/p99, never the average), saturation, queue age, data freshness, and availability — not on whichever internal metric happens to be easy to scrape. A symptom alert tells the on-call engineer that something is actually wrong for someone; everything else is diagnostic detail that belongs in a runbook link, not a separate page.