You pushed your code, the site went live, everyone celebrated — and then you closed the laptop. Here’s the uncomfortable truth nobody mentions on launch day: a server that’s running right now tells you nothing about whether it’ll be running in three hours, at 2 a.m., on the busiest day of the year. Deployment gets your app online. Monitoring and uptime are what keep it there, and they’re what let you sleep without wondering whether the whole thing quietly fell over while you weren’t looking.
The goal of this article is simple but important: you want to be the first to know when something breaks, not the last. The worst way to learn your server is down is a message from an angry customer. The best way is a calm alert on your phone, minutes after it happened, with enough detail that you already know where to look.
What monitoring and uptime actually mean
Two related words get thrown around together, so let’s pin them down separately.
Uptime is the share of time your server (or your app) is up and working as it should. It’s usually written as a percentage over some period — “99.9% uptime this month.” The flip side is downtime: the time it wasn’t working. If your site was unreachable for 43 minutes in a 30-day month, that’s roughly 99.9% uptime. The number sounds tiny, but the minutes are real, and they’re the minutes your users couldn’t do what they came to do.
Monitoring is the practice of continuously checking on your server so you actually know its state — is it up, is it healthy, is it slow, is it running out of room. Monitoring is how you measure uptime in the first place, and more importantly, how you catch problems while they’re small.
The relationship is straightforward: monitoring is the activity, uptime is one of the things it measures. You don’t get good uptime by hoping. You get it by watching.
Available isn't the same as healthy
A server can respond to a ping while being completely broken for users — the machine is on, but the app on it crashed, or the database behind it is unreachable. That’s why good monitoring checks the real thing users care about (does the actual page load and return the right answer?), not just whether the box is powered on. “It’s up” and “it works” are two different questions.
How monitoring works: the health check
At the heart of nearly all monitoring is a tiny, repeated question: “Are you okay?” A monitoring system asks this on a schedule — every 30 seconds, every minute — and decides whether the answer is good.
The most common form is the HTTP health check. The monitor sends a normal web request to your server and looks at what comes back:
MONITOR YOUR SERVER
│ │
│ every 60s: GET /health │
│ ───────────────────────────────► │
│ │ checks itself
│ 200 OK + "healthy" │
│ ◄─────────────────────────────── │
│ │
all good → do nothing
no reply / error → raise an alert
What makes the answer “good” or “bad”? Usually two things:
- The status code. A healthy web response comes back with a code in the 200s (success). If the monitor gets a 500 (server error), a 503 (unavailable), or no reply at all because nothing answered in time, that’s a failure. If you’re fuzzy on what those numbers mean, it’s worth a quick look at how HTTP works — health checks lean entirely on these status codes.
- A timeout. Even a correct answer is a problem if it takes 30 seconds to arrive. Monitors wait only so long; a response that’s too slow counts as a failure, because to a real user a page that never finishes loading is the same as a page that’s down.
Many apps expose a dedicated health endpoint — a special URL like /health or /status that exists only to be checked. Instead of loading the heavy homepage, the monitor hits this lightweight URL, and the app can do a quick internal check (is the database reachable? is the cache up?) and report back honestly. A shallow check just confirms the web server answers; a deep check confirms the app’s dependencies are actually working too.
shallow check: "is the web server replying?" → fast, cheap
deep check: "web server replying AND database
reachable AND queue not backed up?" → slower, truer
Watching from the outside vs. from the inside
There are two vantage points for monitoring, and you genuinely want both.
External (black-box) monitoring watches your server from somewhere out on the internet — the same way a real visitor reaches it. A service located in another part of the world requests your page every minute and times how long it takes. This is the only way to catch problems that live between your server and your users: a broken network route, an expired certificate, a DNS misconfiguration, a whole data center losing power. From inside the server, everything might look perfect while nobody outside can reach it.
Internal (white-box) monitoring runs on the server (or right next to it) and reports the things only the inside can see: how much memory is left, how hard the CPU is working, how full the disk is, how many errors the app is logging. External monitoring tells you that something’s wrong; internal monitoring usually tells you why.
EXTERNAL ──► [ internet ] ──► [ YOUR SERVER ] ◄── INTERNAL
"can the world (DNS, network, "how is the machine
reach my site, certificate, itself doing — CPU,
and how fast?" power…) memory, disk, errors?"
Lean on only one and you get blind spots. External-only and you won’t know a disk is 98% full until it bites you. Internal-only and you’ll swear everything’s fine while your users stare at a connection error.
The metrics worth watching
You could measure a thousand things. Most of the value comes from a handful. A widely used starting point is the four golden signals, and they’re a great mental checklist even if you never call them that:
- Latency — how long requests take to get a response. Rising latency is often the first quiet sign of trouble, well before anything fully breaks.
- Traffic — how much demand is hitting the server (requests per second, active users). Useful both as a health signal and to understand the other numbers — a CPU at 90% during a traffic spike means something different than a CPU at 90% on a dead-quiet night.
- Errors — the rate of failing requests (those 500s again). A sudden jump in errors is one of the clearest “go look now” signals there is.
- Saturation — how full your resources are: CPU usage, memory usage, disk space, disk and network throughput. Saturation is the slow-motion killer — disks fill up, memory leaks creep, and the server doesn’t fall over until it suddenly does.
Disk space is the classic 3 a.m. outage
Of all the resources, a full disk causes a wildly disproportionate share of late-night incidents. Logs pile up, temporary files accumulate, a database grows, and one day there’s no room left to write anything — at which point the app, the database, and sometimes the whole machine seize up at once. Always monitor free disk space, and alert while there’s still comfortable room (say, at 80% full), not when you’re already at 99% and it’s too late to react calmly.
Alerting: turning a problem into a message
Monitoring that nobody sees is just expensive decoration. The point of all this watching is the moment something crosses a line and the system alerts you — sends a notification to a human who can act.
A good alert has a few qualities worth aiming for:
- It reaches you where you’ll see it. Email is fine for low-urgency notices; a real outage at 3 a.m. needs something louder — a push notification, a phone call, a message to the channel your team actually watches.
- It fires on the right condition. “The site has failed 3 health checks in a row” is a good trigger. “A single check was 50ms slow once” is not — it’ll just teach you to ignore alerts.
- It says something useful. “PROD web server: 5 consecutive failed health checks, last response 503” tells you what, where, and roughly why. “Something is wrong” tells you nothing.
That second point deserves real care, because the biggest failure mode in monitoring isn’t missing an alert — it’s drowning in them.
Alert fatigue is the silent killer of monitoring
If your phone buzzes twenty times a day for things that turn out to be nothing, you’ll start swiping every alert away on reflex — and the one time it actually matters, you’ll dismiss that one too. Alert only on things a human genuinely needs to act on, right now. Tune the thresholds. Require a problem to persist for a minute before crying wolf. A monitoring setup that alerts rarely but is always right is worth ten times one that’s noisy. Quiet alerts you trust beat loud alerts you ignore.
Reading uptime as a number
When you see “99.9% uptime,” it helps to translate that percentage into time you can feel, because each extra nine is a big jump:
Uptime Downtime per year Downtime per month
───────────────────────────────────────────────────────
99% ~3.65 days ~7.2 hours
99.9% ~8.8 hours ~43 minutes
99.99% ~52 minutes ~4.3 minutes
99.999% ~5.3 minutes ~26 seconds
Two honest takeaways. First, those “extra nines” cost a lot — going from 99.9% to 99.999% usually means redundancy, automatic failover, and serious engineering, not just better intentions. For most projects, chasing five nines is overkill. Second, a percentage averaged over a month can hide a lot. “99.9% this month” sounds great, but if all 43 of those minutes happened in one chunk during your busiest hour, the experience was far worse than the number suggests. Always look at when the downtime fell, not just how much there was.
A simple, sane setup to start with
You don’t need an enterprise dashboard on day one. A solid, beginner-friendly monitoring setup is just a few layers stacked together:
- An external uptime check hitting your real homepage (or a
/healthURL) every minute from outside, alerting you if it fails a few times in a row. This alone catches the majority of “the whole site is down” emergencies. - A basic resource check on the server itself watching CPU, memory, and especially disk space, warning you before anything fills up.
- An error-rate signal so a flood of failing requests pages you even while the homepage still happens to load.
- One clear alert channel you actually pay attention to — and the discipline to keep it quiet enough that you never start ignoring it.
When an alert does fire, your next move is to figure out what broke and why — and that’s where your logs and basic troubleshooting steps take over. Monitoring rings the bell; investigation answers the question. They’re two halves of staying online, and they work best together.
Wrapping up
Here’s the whole picture in one place:
- Uptime is the share of time your app is working; downtime is when it isn’t. Monitoring is how you measure both and catch problems early.
- A health check is the core mechanic: a monitor asks “are you okay?” on a schedule and judges the answer by its status code and how fast it arrives.
- Use both external monitoring (from the internet, like a real user — catches network, DNS, and certificate problems) and internal monitoring (on the server — explains why, via CPU, memory, disk, and errors).
- Watch the four golden signals: latency, traffic, errors, and saturation. And never forget disk space — a full disk is a classic avoidable outage.
- Alerts turn a problem into a message. Make them reach you, fire on the right conditions, and say something useful — and above all, keep them quiet enough that you never start ignoring them.
- Translate uptime percentages into real time, and look at when downtime happened, not just the average.
Once an alert tells you something’s wrong, the next thing you’ll reach for is the record of what your server was actually doing in the moments before — which is exactly why logs and log management are the natural next step from here.