Inside The AI Stack

Lesson 17 · OpenStack Production Engineer

Health Checks — Designing Monitoring That Catches Quiet Failures

Why process and API checks miss the failures that matter, and how to build functional checks that exercise the paths users depend on.

advancedOpenStackPrometheus
ByJames JoynerPublished 4 min read
~45 minPro

Objectives

  • Distinguish liveness, readiness, and functional checks and state what each detects
  • Design a functional check that exercises a full provisioning path
  • Identify the quiet failures that process-level monitoring cannot see
  • Choose alert thresholds that reflect user impact rather than component state

Three kinds of check, detecting three different things

Most OpenStack monitoring consists entirely of the first two, and the failures that cause incidents are visible only to the third.

Check Asks Misses
Liveness Is the process running? Everything about whether it works
Readiness Does the API respond? Everything behind the API
Functional Can a user actually do the thing? Very little

Every earlier lesson in this path contains an example of a failure that passes the first two:

  • cinder-volume running with a driver that cannot reach the backend — process up, API up, volumes never create
  • An L2 agent stopped on one compute host — every controller check green, instances there get no network
  • A backend kept in HAProxy rotation by a TCP health check — API responds, a third of requests fail
  • Galera in multi-writer — everything healthy, intermittent errors everywhere

None of these is detectable by asking whether a process is running.

What a functional check looks like

A functional check performs a real operation and cleans up after itself.

the shape of a compute functional checkillustrative
# 1. createopenstack server create –flavor m1.tiny –image cirros –network monitoring-net hc-1# 2. wait for ACTIVE, with a timeout that means something# 3. verify it got an address# 4. delete it# 5. verify the delete completed

Five steps, and step 5 is the one usually omitted. A cloud that creates instances and cannot delete them is broken in a way that fills up quietly and is invisible to a check that stops at step 4.

What to check functionally

One check per user-visible capability, not one per service:

Capability The check
Compute Boot an instance, confirm ACTIVE, delete it
Networking Confirm the instance received an address and can route out
Storage Create a volume, attach it, write, detach, delete
Identity Issue a token and read the catalog
Images Upload a small image, confirm it becomes active, delete it

Five checks cover what users actually do. They also implicitly test everything underneath — the message bus, the database, the load balancer — because a real operation cannot succeed without all of it working.

That is the argument for functional checks in one sentence: they test the dependencies you forgot to monitor.

Per-host checks, because fleet-level checks hide single-host failures

A functional check that boots an instance somewhere passes while one compute host is completely broken — the scheduler simply avoids it, or does not, and the check happened to land elsewhere.

Two additions close that gap:

Scheduled per-host checks. Periodically boot an instance on each host by name, in rotation. On a large fleet this need not be frequent; even daily catches a host that has been silently unusable.

Alert on the count of healthy hosts, not on individual host state. A fleet of 50 with 3 down is not an emergency; the same fleet with 30 down is. Alerting per host produces noise that gets muted, and muted alerts are worse than absent ones.

The quiet failures worth explicit checks

Some conditions never announce themselves and are worth checking directly:

Capacity that will run out. Not “is it full” but “when will it be” — projected from the trend. Full clouds are avoidable and their incidents are self-inflicted.

Queue depth on the message bus. A growing queue is a failing service, before that service reports anything.

Certificate expiry. Predictable, entirely preventable, and a recurring cause of total outages.

Placement allocations against reality. Drift here causes scheduling failures that look like capacity problems and are not.

Galera cluster size and node state. A cluster running degraded works fine until it does not.

Backup restorability. Not whether the backup ran — whether it restores. An untested backup is an assumption.

Thresholds that reflect impact

Alert on what users experience, not on component state.

Poor alert Better alert
nova-compute down on compute-07 Healthy compute capacity below 80% of normal
Disk 85% full Disk projected full within 7 days
API latency above 2s Instance creation P95 above its normal range
Queue depth above 1000 Queue depth growing for 15 minutes

The right-hand column has a property the left lacks: each one, if it fires at 3am, is worth waking someone for. That is the actual test of an alerting threshold, and applying it honestly usually removes most of an existing alert set.

The diagnostic value of good checks

Well-designed checks do not only detect failure — they localise it. When the compute functional check fails and the networking one passes, the search space has already halved before anyone opens a log.

That is worth designing for deliberately: checks that fail in patterns tell you where to look, and checks that all fail together tell you to look at what they share — the bus, the database, or identity.

Exercise

Write one functional check that creates a resource, verifies it, and removes it, with a timeout and a duration measurement. Run it on a schedule for a day and record the normal duration range.

Then break something it depends on — stop an agent, fill a backend — and confirm the check fails. A check that has never been observed failing has not been tested, and a surprising number of monitoring systems contain checks that cannot fail at all.

Next lessonCapacity Management

Verification status

This resource has not been executed end to end in a lab environment. Commands and configuration are reviewed by an engineer, but treat them as reference rather than as a tested procedure.

Author

James Joyner

Builds and operates the infrastructure layers underneath production AI systems.

James founded Inside The AI Stack to publish the kind of infrastructure and operations material he wanted while running production systems: specific, tested where it claims to be tested, and written by someone who has had to fix the thing at 3am. He works across AI infrastructure, private cloud, and platform engineering, and reviews every technical resource published here before it is marked as verified.

  • AI infrastructure
  • OpenStack operations
  • Kubernetes
  • Terraform
  • Linux systems engineering
  • Observability

Primary sources

Related resources chosen because they are the next thing you would actually need — not because they share a keyword.

Guide

Production Observability

Building observability that shortens incidents rather than producing dashboards: what to instrument, how to alert on symptoms, and why cardinality decides your bill.

intermediate· 4 minPrometheusGrafana
Lesson

Service State and Liveness

Status versus state, how liveness is actually determined, and why a service that is enabled and down is the most dangerous row in any OpenStack listing.

foundational· 35 minOpenStackNova
Learning path

OpenStack Production Engineer

A sequenced learning path for engineers who operate OpenStack in production — architecture, service-by-service depth, deployment, and troubleshooting under pressure.

intermediate· 5 minOpenStackNova

Newsletter

Inside The AI Stack Brief

A practical weekly briefing on AI engineering, infrastructure, production operations, and the technologies powering the AI stack.

One email a week. We send a confirmation link first and never mail an address that has not confirmed. No sponsorship placements inside the technical sections, and an unsubscribe link in every issue.