12.2 Alert and Diagnostics Interface: From Signal to Action
The output of an alerting system is not a notification; it is timely, accurate human action. An expression may be mathematically correct, but if the recipient does not understand its impact, urgency, or the next step required, it remains a failed alert design.
Page Driven by User Risk
Chapter 9 already used burn rate to assess error budget consumption. Here we add operational contracts. Every alert that wakes someone up must meet at least the following criteria:
- A significant user impact is either occurring or about to occur;
- Action taken now can improve the outcome;
- The recipient is clearly identified and has the authority to act;
- The annotation must clearly point to the dashboard, runbook, and change context;
- Data gaps or missing values must not be mistaken for normal baselines.
A CPU usage of 80% alone typically fails to meet these conditions. If CPU saturation would cause an SLO degradation and rapidly consume the error budget, leading to user impact, then CPU serves as a diagnostic signal. If, however, the high usage is merely a long-term capacity trend, a work item for capacity planning should be created.
for delayed trigger, keep_firing_for buffer recovery
groups:
- name: atlas-slo
rules:
- alert: AtlasApiFastBudgetBurn
expr: service:slo_errors_per_request:ratio_rate5m > 0.0144
for: 5m
keep_firing_for: 10m
labels:
severity: page
service: atlas-api
annotations:
summary: "atlas-api Error budget is being consumed rapidly"
impact: "Settlement API Effective request failed or timed out"
dashboard: "https://grafana.example/d/atlas-api"
runbook: "https://runbooks.example/atlas-api/budget-burn"for Requires the condition to persist for a duration before firing, making it suitable for filtering out transient jitter; it's not an arbitrary noise-reduction button, and setting it too long may suppress actual fast failures. keep_firing_for Can maintain firing when the signal briefly recovers, reducing repeated notifications. Specific thresholds should be derived from SLO windows and burn-rate design, not copied from example values.
The rules also need unit tests: normal cases, threshold boundaries, continuous triggers, missing data, and recovery sequences must all be covered.
Alertmanager Processing of Notification Topology
Prometheus determines what conditions are triggering alerts, while Alertmanager handles deduplication, grouping, routing, silencing, and inhibition.
route:
receiver: default-ticket
group_by: [alertname, service, cluster]
group_wait: 30s
group_interval: 5m
repeat_interval: 4h
routes:
- matchers:
- severity="page"
receiver: primary-oncallgroup_by Being too granular can result in hundreds of notifications for a single incident, while being too broad risks merging events that belong to different ownership domains. Grouping keys should preserve responsibility and failure domains, never default to including volatile dimensions like pod and instance.
Inhibition expresses the logic that when a root cause alert is active, it suppresses symptom alerts within the same label set, such as suppressing individual service unreachabilities when a cluster-level network outage occurs. Silence is a time-bound, creator- and reason-tagged manual rule, ideal for planned maintenance; it is not a long-term repository for suppressing bad alerts.
For high-availability Alertmanager deployments, it's essential to validate the end-to-end notification flow. Monitoring only process liveness of individual components is insufficient to ensure alerts propagate reliably from rules to on-call endpoints. Regular end-to-end canary notifications should be run to verify the integrity of the entire alerting chain.
Dashboard by Problem Layer
A service diagnostics interface can be structured into three layers:
Layer 1: Is the user impacted?
SLOs, request volume, error rates, latency distribution
Layer 2: Where is the impact occurring?
region, version, route, dependency, tenant tier
Layer 3: Why is it happening?
saturation, queues, connection pools, GC, downstream latency, trace/log tracingThe initial screen should not overwhelm users with CPU, memory, and dozens of node curves. Instead, start with clear context: range, time period, units, target baselines, and release annotations, enabling on-call engineers to assess impact within one minute. Then allow drilling down from stable, low-cardinality dimensions.
Panel titles should answer a specific question, such as "Which regions are consuming budget in the past 30 minutes?" rather than "Error Graph 7." Percentages should consistently display as 0–1 or 0–100, and latency values (whether in seconds or milliseconds) must be explicitly labeled in both the title and axes.
Put Changes on the Same Timeline
A large number of incidents are tied to changes in deployments, configurations, scaling, and dependencies. The dashboard should overlay deployment revisions, feature flags, schema migrations, and incident annotations on a single timeline, and provide links from anomaly points to:
- The current image digest;
- The corresponding Git commit and release approval;
- A representative trace;
- Log query filters limited by service, region, and version.
This approach is far more effective at identifying root causes than adding another ten resource panels.
Alert Review Is an Ongoing Practice
After each incident, document which alerts first provided actionable signals, which were redundant, delayed, or lacked context, and which failed to trigger despite being expected. For each alert page, track its frequency, confirmation time, operability, and percentage of cases that self-resolved automatically. Pages that remain unattended for extended periods should be downgraded, merged, or removed.
The next lesson will fill in the gaps visible only on the server side: real user experience, synthetic monitoring, versioned configurations, and telemetry cost control.
References
- Prometheus, Alerting practices
- Prometheus, Alerting rules
- Prometheus, Alertmanager
- Prometheus, Alertmanager configuration