Monitoring What Actually Matters
Introduction¶
Monitoring everything produces dashboards nobody reads and alerts nobody trusts. A few well-chosen frameworks narrow it to the signals that predict user pain.
The four golden signals¶
For any user-facing service, watch:
- Latency — how long requests take. Split successful vs failed (a fast 500 shouldn't flatter your latency graph). Track percentiles (p50, p95, p99), not averages.
- Traffic — demand: requests/sec, transactions/sec, concurrent users.
- Errors — rate of failed requests (5xx, timeouts, wrong answers). Explicit failures and implicit ones (200 with a broken body).
- Saturation — how full the system is: CPU, memory, connection pool, queue depth, disk I/O. The resource that runs out first.
If you only have time to set up four graphs per service, these are the four.
RED (for request-driven services)¶
- Rate — requests per second
- Errors — failed requests per second
- Duration — latency distribution
Simple, works for every microservice, easy to templatise across dozens of services.
USE (for resources)¶
For every resource (CPU, disk, NIC, pool):
- Utilisation — % busy
- Saturation — queued work it can't service yet
- Errors — error events
USE catches "the box is fine on CPU% but the run queue is 40 deep" — saturation often bites before utilisation hits 100%.
SLIs and SLOs¶
- SLI (indicator) — a metric that reflects user experience:
successful requests / total requests, orrequests faster than 300ms / total. - SLO (objective) — a target for the SLI over a window: "99.9% of requests succeed, measured over 28 days".
- Error budget —
100% − SLO. 99.9% over 28 days ≈ 40 minutes of allowed failure. If you've spent the budget, stop shipping features and fix reliability; if you have budget to spare, you can take more risk.
Alert on error-budget burn rate (are we going to blow the SLO?), not on individual metric blips. A fast burn (will exhaust budget in an hour) pages; a slow burn opens a ticket.
Black-box vs white-box¶
- Black-box — probe the service from outside like a user does (HTTP check, synthetic transaction, DNS resolution). Catches "the whole thing is down" and DNS/TLS/LB problems your internal metrics miss. This is what tools like the uptime check do.
- White-box — metrics from inside (Prometheus, statsd, app instrumentation). Tells you why.
You want both: black-box to know users are affected, white-box to diagnose.
Dashboards for 3 a.m.¶
- One screen per service, top-to-bottom: is it up (black-box), the four golden signals, then dependencies.
- Annotate deploys on the time axis — "it broke at 02:14" + "deploy at 02:12" answers most incidents instantly.
- Show the SLO line on the error/latency graphs so "is this bad?" is obvious.
- Link the runbook from the dashboard.
- Resist the 40-panel dashboard. If a panel has never helped during an incident, remove it.
Verification and troubleshooting¶
- Metrics exist but nobody looks — too many dashboards. Consolidate to one per service + one fleet overview.
- Averages hiding pain — p99 latency can be 10× p50. Always graph percentiles; a rise in p99 with flat p50 means a subset of users are hurting.
- SLO always green but users complain — the SLI doesn't capture their experience (measuring server-side latency, not including the CDN; counting a slow-but-200 as success). Refine the SLI.
- Saturation alert fires constantly — utilisation-based, not saturation-based; or the resource is genuinely undersized. Alert on queue depth / wait time, not %.
- Can't tell if an alert matters — it's not tied to an SLI. Every page should map to "this threatens an SLO" or "this is a hard failure".
- New service has no monitoring — templatise RED + a black-box check as part of the service scaffold so it's never an afterthought.
Related tools and reading¶
- On-site: Uptime / status check, HTTP Header Analyzer, DNS lookup.
- Related posts: Alert fatigue and how to fix it, Understanding Linux load average.
Stuck on something this site can't fix?Reach out to Prabath directly on LinkedIn.More in Monitoring
PromQL for Beginners
PromQL trips people up because counters must be wrapped in rate() and you can't average a percentile. Here's the mental model and the queries you'll actually write.
October 24, 2026The Prometheus Blackbox Exporter
The blackbox exporter probes your services the way a user would — is it up, is TLS valid, is DNS resolving. Here's the module config and the relabeling that makes one exporter probe many targets.
October 24, 2026SLO Burn-Rate Alerts
Alerting on 'error rate > 1%' is noisy. Alerting on 'we'll burn the whole month's error budget in a day' is actionable. Here's the burn-rate method and the queries.
October 24, 2026