Skip to content

How to Monitor an API Without Creating Alert Noise

A monitor should not open an incident because one request failed. A safer setup retries the request, confirms the failure, and separates customer downtime from monitoring-platform uncertainty. This guide explains how to design that sequence without hiding real outages.

A monitor should not open an incident because one request failed. A safer setup retries the request, confirms the failure, and separates customer downtime from monitoring-platform uncertainty. This guide explains how to design that sequence without hiding real outages.

Assumptions: you control the API health path, checks run from outside your VPC, and alerts go to a human who will mute noisy rules if you get this wrong.

The Confirm Ladder

  1. Probe. Send one scheduled request to a dedicated health or critical path.
  2. Retry. On failure or timeout, retry within a short window before changing customer-facing state.
  3. Verify. Require consecutive failures (or multi-region agreement, when you have it) before opening an incident.
  4. Open. Only then alert and update status. Recovery should also require confirmation, not a single lucky success.

The ladder is not a license to ignore brief outages that customers feel. It is a filter for single-packet loss, brief deploys, and flaky edges that do not deserve a public incident.

Choose what to probe

  • Prefer a dedicated health endpoint over scraping a random authenticated route.
  • Accept only the status codes that mean healthy for that path (often 200; sometimes 204).
  • Assert a small, stable JSON field when a soft failure can still return 200.
  • Keep timeouts shorter than your alert patience but long enough for cold starts you accept.
Example health body
{
  "status": "ok",
  "checks": {
    "database": "up"
  }
}

Retry without hiding outages

Retries buy you protection against transient network errors. They do not buy infinite patience. Document the retry count and delay so on-call knows how long confirmation takes. Product behavior for Fajita retries is described in Retries and Incident verification.

Failure patternConfirm Ladder treatmentCustomer impact risk
Single timeout, next probe OKStay operationalLow if rare
Three consecutive failuresOpen incident after verifyHigh if sustained
Intermittent 500s every other checkInvestigate flapping; do not mute foreverMedium
Deploy window returns 503 for 90 secondsMaintenance or short verify windowKnown

Assertions that reduce noise

Status code alone is a weak signal for APIs that return 200 with {"ok": false}. Add JSON assertions for the fields that mean ready. Keep assertions few and stable so deploys do not become alert storms. See JSON path assertions.

Authentication without secret sprawl

If the health path must be authenticated, use a dedicated monitoring credential with least privilege, rotate it, and never put production user tokens in monitors. Prefer a public health path when the only goal is reachability of critical dependencies. See Authenticated monitoring.

Alert routing that matches severity

Page for confirmed down. Defer chatty channels for degraded or verifying states if your product distinguishes them. Quiet hours help after you have trust in confirmation, not before. Related: Why One Failed Check Should Not Mean Downtime.

A small configuration checklist

  • Dedicated health path exists and is documented
  • Accepted status codes listed
  • One or two stable body assertions
  • Retry and confirmation settings written down
  • Alert channel tested with a deliberate failure
  • Recovery confirmation required before auto-resolve

Regions and confirmation

If you later add a second region, treat disagreement carefully. One region failing while another succeeds is often a network path issue, not a full customer outage. Require agreement before a public incident, unless your product is only served from the failing path.

Do not multiply regions only to create more pages. Multiply regions when customers are geographically concentrated enough that a single vantage point lies.

Worked example

Suppose /health should return 200 with {"status":"ok"} every minute. Configure one retry on timeout, open an incident after two consecutive confirmed failures, and require two consecutive successes to recover. A single packet loss creates no ticket. A five-minute outage still surfaces within a few minutes.

Write that configuration in the monitor description so the next person on call knows how long confirmation takes. Silence without a documented budget feels like a broken product.

What this does not solve

External uptime checks will not replace tracing, log search, or product analytics. They answer whether the API path you chose is reachable and behaving as asserted. Keep that scope honest and the Confirm Ladder stays useful.

Plain-text version · APIs and Webhooks

Was this useful?