Why Monitor - The Importance of Observability
Status: Active
Last Updated: 2026-08-14
Category: Observability - Phase 1: Basic Monitoring
Prerequisites: None
Time: 30 minutes
Tags: monitoring, observability, mttr, mttd, incident-response, concepts, fundamentals
Summary
The conceptual foundation for the entire observability course. This article explains why monitoring is not optional infrastructure plumbing but the difference between minutes-long outages you catch instantly and days-long outages your users discover first. It introduces MTTR vs MTTD, the concept of unknown unknowns, and a practical framework for deciding when (and what) to monitor.
๐ฏ What You'll Learn
By the end of this article, you'll understand:
- โ What actually goes wrong on unmonitored servers (real failure patterns)
- โ The difference between MTTD and MTTR and why both matter
- โ What "unknown unknowns" are and how monitoring shrinks them
- โ When to monitor something โ and when deliberately NOT to
- โ The observability maturity ladder: uptime โ metrics โ logs โ traces โ alerts โ dashboards
- โ How to build the "monitoring mindset" before touching any tools
Table of Contents
- What Can Go Wrong
- MTTD vs MTTR
- Unknown Unknowns
- When to Monitor (and When Not To)
- The Observability Ladder
- Building the Monitoring Mindset
- Common Objections
- Key Takeaways
- Next Steps
What Can Go Wrong
Unmonitored infrastructure fails silently. Here are the classic failure modes that every operator eventually meets โ usually at 2 AM.
The Slow Leak
A memory leak grows by 2% per day. Day 1: nothing. Day 20: nothing. Day 45: the server starts swapping. Day 47: the OOM killer randomly executes your database mid-write.
Day 1 RAM: 34% โ healthy
Day 15 RAM: 62% โ "still fine"
Day 35 RAM: 96% โ nobody is looking
Day 46 RAM: swap thrashing, disk I/O saturated
Day 47 OOM killer terminates postgres during peak traffic
With monitoring, day 15 triggers an alert ("memory trending above baseline"). Without it, you discover the problem from user complaints โ or from data corruption.
The Silent Death
Services don't always crash loudly. A cron job that stops running produces no error anywhere. A TLS certificate expires quietly. A backup job writes to a full disk and fails โ while the application itself stays perfectly "up."
These failures are invisible to anyone who only checks "is the website responding?" They're only visible if something is watching for them specifically.
The Cascade
Small failures compound:
- Disk hits 95% full โ logs can't rotate
- Log rotation fails โ app can't write logs โ app hangs
- App hangs โ health checks time out โ load balancer marks all backends down
- Total outage, root cause was one partition that filled over three weeks
Each individual step was observable. Nobody observed any of them.
The Cost Asymmetry
| Approach | Detection | Typical cost |
|---|---|---|
| User reports outage | Minutes to days | Reputation loss, churn, SLA penalties |
| Weekly manual check | Up to 7 days | Wasted human hours, missed incidents between checks |
| Automated monitoring | Seconds to minutes | Setup effort once, small resource overhead |
Monitoring is cheap relative to a single prevented incident.
MTTD vs MTTR
Two numbers define how an incident hurts:
- MTTD (Mean Time To Detect) โ how long until anyone knows something is wrong.
- MTTR (Mean Time To Repair) โ how long until it's fixed again.
Total outage pain = MTTD + diagnosis + repair = MTTD + MTTR
Why MTTD Is the Multiplier
MTTR is bounded by skill and tooling. MTTD is unbounded โ it can literally be infinite (nobody ever notices). Every minute of undetected downtime is pure loss, and worse: users find out before you do, which converts a technical hiccup into a trust problem.
Monitoring's primary job is to drive MTTD toward zero:
No monitoring: failure โโโโโโโโ(days?)โโโโโโโโโ first human notices
Uptime checks: failure โโ(60s)โโโ alert fires
Full observability: failure โโ(10s)โโโ alert + dashboard + probable cause
Diagnosis Time Is Part of MTTR Too
Detection alone isn't enough. When the alert fires, you must answer: what broke, where, and since when? This is why the course doesn't stop at uptime checks:
- Uptime tells you the site is down.
- Metrics tell you it's down because memory is exhausted and has been climbing since Tuesday.
- Logs tell you which specific request path leaked it.
- Traces tell you exactly which service in the chain is slow.
Better observability compresses the diagnosis portion of MTTR, often more than the fix itself.
Unknown Unknowns
Donald Rumsfeld's matrix applies directly to operations:
| Known | Unknown | |
|---|---|---|
| Knowns | "The API gets slow under load" | "Which query causes it" |
| Unknowns | "We didn't know the disk was filling" | "We didn't know that feature even existed, let alone that it crashes" |
Monitoring Shrinks the Grid
- Unknown knowns โ knowns: dashboards make existing behavior visible ("oh, we always spike at 9 AM").
- Unknown unknowns โ unknown knowns: rich metrics and traces surface behaviors you weren't looking for ("why does latency correlate with this retry loop?").
You cannot enumerate everything that will break. But you can instrument enough signals โ CPU, memory, disk, network, error rates, latencies โ that when something breaks, the anomaly shows up whether or not you predicted it. That is the entire argument for general-purpose metrics collection over hand-written check scripts: scripts only answer questions you thought to ask; metrics answer questions you haven't asked yet.
When to Monitor (and When Not To)
Monitoring everything is its own failure mode (see Pitfall 1 in the README). Use this decision framework.
Always Monitor
- User-facing symptoms: availability, latency, error rate of anything users touch
- Finite resources: disk space, memory, connection pools, rate limits, certificates
- Data integrity: backups completing AND being restorable, replication lag
- Money-relevant flows: signup funnel, payment endpoints, email delivery
Conditionally Monitor
- Internal batch jobs: yes, alert on failure; no, don't graph runtime unless variance matters
- Third-party dependencies: monitor your experience of their API (latency/errors), not their internal health
- Dev/staging environments: collect metrics, but route almost nothing to alerts
Deliberately Don't Monitor (or Alert On)
- Metrics you've never used to make a decision (review quarterly, delete ruthlessly)
- Self-healing conditions that auto-remediate (log them, alert only if remediation fails)
- Everything at maximum resolution forever โ sample and set retention instead
The One-Question Test
For each candidate metric or check, ask:
"If this number goes weird tonight, will someone need to do something?"
- Yes โ monitor it, and probably alert on it.
- No, but interesting โ dashboard it, no alert.
- No โ don't collect it (or collect at low priority/low retention).
This test prevents alert spam before it starts.
The Observability Ladder
Observability is layered. Each rung answers a different question and builds on the previous:
Rung 6: Dashboards "What's the current state at a glance?"
Rung 5: Alerts "Tell me when it breaks โ before users do"
Rung 4: Traces "WHY is the request slow/failing across services?"
Rung 3: Logs "WHAT happened inside the app? Show me the events"
Rung 2: Metrics "HOW is the system trending? CPU, RAM, latency..."
Rung 1: Uptime "IS it alive right now?"
Climb in This Order
Trying to start with distributed tracing is like buying a telescope before owning glasses. Each layer is useful immediately and motivates the next:
- Uptime checks (uptime-kuma-setup) take an hour and already beat 80% of self-hosted setups.
- Real-time metrics (netdata-basics) give instant visibility into why something is unhealthy.
- Alerting (simple-alerts) closes the loop so you don't have to watch dashboards.
- Prometheus + Grafana (Phase 2โ3) provide history, trends, and capacity planning.
- Centralized logging (Phase 4) provides the forensic detail metrics lack.
- Tracing and SLOs (Phase 5) scale the practice to complex systems and real reliability engineering.
Where This Course Goes
| Phase | Rungs covered | Tools |
|---|---|---|
| 1: Basic Monitoring | 1โ2, intro to 5 | Uptime Kuma, Netdata |
| 2: Metrics Collection | 2 | Prometheus, Node Exporter, exporters |
| 3: Visualization | 2, 6 | Grafana, PromQL |
| 4: Logging | 3 | Loki, Promtail, LogQL |
| 5: Advanced & Production | 4, 5, 6 | Jaeger, Alertmanager, SLOs |
Building the Monitoring Mindset
Tools change; principles don't. These five habits separate operators who sleep through the night from those who get paged.
1. Alert on Symptoms, Not Causes
- โ "CPU is above 90%" โ might be perfectly fine (a compile job, a cache warm-up)
- โ "Checkout success rate dropped below 95%" โ users are actually hurting
CPU alerts fire constantly for harmless reasons and train you to ignore pages. Symptom alerts are rare and always meaningful.
2. Every Alert Needs a Runbook Link
An alert without instructions is trivia, not signal. Minimum viable runbook:
## Alert: HighMemoryUsage on web-prod-01
**Impact**: Risk of OOM kill on the app server.
**First steps**:
1. Check top memory consumers: `docker stats --no-stream`
2. If postgres RSS > 80%: restart with `systemctl restart postgresql` (safe, brief blip)
3. Escalate to #ops if memory returns above 85% within 1h.
3. Baselines Before Thresholds
You can't pick a threshold until you know what "normal" looks like. Run new monitors in observe-only mode for 1โ2 weeks, look at the graphs, then set thresholds at clearly-above-normal levels.
4. Test Your Monitoring Like You Test Backups
An alert path that has never fired is a rumor. Deliberately break things:
# Simulate high CPU โ confirm the alert fires end-to-end
stress-ng --cpu 4 --timeout 120s
# Kill a monitored service โ confirm recovery alert too
docker stop nginx && docker start nginx
Schedule this monthly. Monitoring rots silently otherwise.
5. Review Alerts Monthly
For each alert that fired last month ask: did it require action? Alerts that didn't get deleted or downgraded. Alert quality decays without maintenance โ this is the single highest-leverage habit in this list.
Common Objections
"My setup is tiny, nothing to monitor"
Tiny setups fail identically to big ones โ disks fill, certs expire, OOM kills happen. In some ways they're riskier: no redundancy, no on-call rotation, no second pair of eyes. Uptime Kuma on the same box takes 10 minutes.
"I'll notice when something breaks"
You'll notice user-visible breaks, eventually. You won't notice the backup failing today, the certificate expiring in 12 days, or memory creeping toward OOM over six weeks. Those become tomorrow's outage.
"Monitoring uses resources"
Budget reality on a small VPS:
| Component | RAM | Notes |
|---|---|---|
| Uptime Kuma | ~100 MB | Or host externally |
| Netdata | ~150 MB | Streaming mode, not full DB |
| Prometheus (10 targets) | ~500 MBโ1 GB | Tune retention |
| Grafana | ~250 MB |
Under 2 GB total for a complete metrics stack โ less than most people spend on one unused container.
"False alarms are annoying so I turned alerts off"
False alarms mean the thresholds are wrong, not that monitoring is wrong. Fix them with baselines (habit #3) and monthly reviews (habit #5). An ignored pager is worse than no pager โ it burns trust in future true alarms.
Key Takeaways
- Undetected failure is the expensive kind. MTTD dominates outage cost; monitoring exists to crush it.
- Monitor what matters: user symptoms, finite resources, data integrity, money paths.
- Use the one-question test: would a weird value require action tonight? If not, dashboard it or drop it.
- Climb the ladder in order: uptime โ metrics โ logs โ traces โ alerts โ dashboards.
- Monitoring is a practice, not a setup: baselines, tested alert paths, and monthly review keep it alive.
- Start today: one uptime check on your most important URL beats a perfect plan.
๐ Related
- Next lesson: uptime-kuma-setup โ get your first external uptime check running in an hour
- Also in Phase 1: netdata-basics, simple-alerts
- Course overview: README
- Related KB sections:
- kb/sysadmin/system-admin-basics โ the systems you'll be watching
- kb/security/intrusion-detection โ security-specific monitoring
- kb/slos-and-slis โ where reliability targets formalize these ideas (Phase 5)