2025-12-03

Observability for Reliability: Metrics That Matter Before Fancy APM

Observability spending often jumps to full-featured APM, tracing meshes, and AI anomaly packs before basic service health is trustworthy. Fancy tooling on top of missing golden signals produces expensive confusion. This guide focuses on metrics that matter first: RED and USE methods, a lightweight SLO practice, and the operational habits that make dashboards actionable.

If you can answer “is it broken, for whom, and where is the bottleneck?” in a few minutes using metrics you already collect, you are ready to invest in deeper tracing. If you cannot, start here.

RED for request-driven services

The RED method—Rate, Errors, Duration—fits request/response services such as HTTP APIs, gateways, and many queues-as-APIs.

  • Rate: requests per second (or per minute) by service, route, or critical operation.
  • Errors: failed requests as a count and ratio; define failure explicitly (5xx, business-level nack, timeout).
  • Duration: latency distribution—not only averages. Track p50/p95/p99 for user-visible paths.

Instrument at the edge of each service (middleware, sidecar, or reverse proxy) so you do not depend on every handler author remembering metrics. Label carefully: high-cardinality route IDs and user IDs will explode time series. Prefer normalized route templates.

USE for resources and nodes

The USE method—Utilization, Saturation, Errors—fits resources: CPUs, memory, disks, NICs, thread pools, connection pools, and JVM heaps.

  • Utilization: percentage of capacity busy (CPU busy, disk IO time, pool connections in use).
  • Saturation: queue depth or wait—load average runnable queue, disk await, pool waiters, GC pressure.
  • Errors: hardware and soft errors—disk faults, network drops, allocation failures, pool timeouts.

USE explains why RED looks bad. High latency with low CPU utilization often points to downstream dependency or lock contention; high saturation on a connection pool points to database capacity or chatty queries. Teach on-call to read RED first, then USE on the implicated tier.

SLOs lite: useful without a bureaucracy

You do not need a full SRE transformation to benefit from service level objectives. Pick one or two user journeys per critical service. Example: “99% of checkout API requests succeed in under 300 ms over 28 days, measured at the edge.” Compute an error budget. When budget burns fast, freeze risky deploys and focus on reliability work.

Keep the math visible. A shared dashboard with remaining budget and burn rate beats a policy PDF. Avoid twenty SLOs on day one; unused SLOs become ignored alerts.

Logging and traces: when to add them

Metrics tell you that something is wrong; logs and traces tell you which request and why. Add structured logs with request IDs on boundaries. Add tracing when you have multi-hop services and RED/USE cannot localize the delay. Start with critical paths only—trace sampling everything forever is a cost and noise problem.

Correlate deliberately: the same trace_id / request_id in metrics exemplars, logs, and traces turns three tools into one workflow.

Alerting that respects humans

Alert on symptoms users feel (SLO burn, error rate, latency) before alerting on every CPU spike. Use multi-window burn-rate alerts if you adopt SLOs. For infrastructure, alert on saturation and errors that predict user pain, not on utilization alone. Page sparingly at night; ticket the rest.

Every alert needs an owner and a runbook link. Alerts without runbooks are how teams learn to ignore pages.

A minimal metrics catalogue

For a typical web/API stack, prioritize:

  • Edge: request rate, 5xx rate, latency percentiles, TLS failures.
  • App: RED per service; runtime USE (heap, GC, thread pools).
  • Data stores: query latency, connection pool USE, replication lag, disk saturation.
  • Dependencies: external API error rate and latency.
  • Platform: node USE, pod restarts, deployment failure rate.

Name metrics consistently. Prefer open conventions (OpenTelemetry semantic conventions, Prometheus guidelines) so you are not rewriting dashboards every tooling change.

Implementation sequence for busy teams

  • Week 1: Ensure scrape or agent coverage on edge and data stores; build one RED dashboard per critical service.
  • Week 2: Add USE dashboards for nodes and primary databases; fix the worst instrumentation gaps.
  • Week 3: Define one SLO per critical journey; wire burn alerts.
  • Week 4: Add request IDs end-to-end; document on-call playbooks for the top five alerts.

Only then evaluate deeper APM packages. You will ask better vendor questions when you already know which signals you lack.

Common failure modes

  • Averages hiding tail latency.
  • Metrics without owners or environment labels (prod vs staging mixed).
  • Cardinality explosions from raw URLs and user IDs.
  • Dashboards as art projects that on-call never opens.
  • Tracing everything while RED remains broken.

Building dashboards people actually use in incidents

Incident dashboards should answer three questions in under thirty seconds: what is broken, since when, and what changed. Put RED panels for the customer-facing edge at the top, dependency health next, then USE for the primary compute and data tiers. Include deploy markers and feature-flag change events. A wall of unrelated graphs slows triage.

Create a separate “deep dive” dashboard linked from the overview rather than stuffing everything into one view. On-call under stress should not scroll through fifty panels to find error rate.

Cardinality, cost, and governance

Observability bills grow silently. Govern metric labels: forbid user IDs, raw URLs, and unbounded free-text labels in standard metrics. Use exemplars or logs for per-request detail. Set retention intentionally—high-resolution short retention for paging signals, coarser long retention for capacity planning. Review top metrics by cost quarterly and delete unused series.

Make instrumentation part of the definition of done for new services: RED metrics, health endpoints, and request IDs before production traffic. Retrofits are harder than standards at birth.

Dependencies and multi-team services

Modern incidents hide in someone else’s service. Publish dependency maps for critical journeys—even a simple documented list beats tribal knowledge. Monitor client-side error rates and latency for dependencies you call; do not wait for the upstream team’s dashboard. Circuit breakers and timeouts should emit metrics when they open so you can see protection engaging.

For shared platforms (Kubernetes, shared databases, identity), platform teams should export USE and health metrics that application teams can overlay without privileged cluster access.

From metrics to continuous improvement

After incidents, ask whether RED/USE would have shortened detection or localization. If not, add a specific signal—do not generically “add more monitoring.” Track toil: noisy alerts, missing runbooks, and dashboards that misled responders. Reliability work competes with features; error budgets and burn alerts give you a neutral language for that tradeoff.

Quarterly, review SLO targets with product owners. Targets that are never missed may be too loose; targets that are always burning may be unrealistic or may indicate chronic under-investment.

Tooling choices without dogma

Prometheus/Mimir/Grafana stacks, cloud-native monitors, and commercial APM can all implement RED/USE and light SLOs. Choose based on your existing skills, cardinality needs, and where telemetry already lives. The anti-pattern is running three overlapping systems with none authoritative for paging. Pick a source of truth for alerts; let other tools enrich.

OpenTelemetry is a wise instrumentation bet because it reduces rewrite cost when backends change. Start with metrics and traces on critical paths; logs can follow a consistent correlation model without boiling the ocean.

Worked example: an API with a dependent database

Consider a checkout API. RED at the API edge shows rising p95 latency and a modest increase in 503s. USE on the API pods shows moderate CPU and no memory pressure. USE on the primary database shows connection pool utilization near 100% and growing waiters; disk utilization is fine. The localization path is clear: pool saturation, not “the app is slow” in general. Remedies might include query fixes, pool sizing, read replicas for specific queries, or caching—chosen with evidence rather than guesswork.

Without USE on the database, teams often scale API replicas first, which can worsen pool contention. Metrics that matter are the ones that prevent that class of mistake.

Synthetic checks as a complement to RED

External synthetics hit public URLs on a schedule and catch DNS, certificate, and regional edge failures that internal RED might miss if scrapes run inside the failure domain. Keep synthetics few and critical: login page fetch, authenticated health of a read API, and checkout dry-run if safe. Alert on consecutive failures, not single blips. Synthetics are not a substitute for in-service RED; they are a canary for “is the path from the internet alive?”

Team rituals that keep observability honest

Weekly: review pages and mark noisy alerts for deletion or retune. Monthly: verify one SLO dashboard against raw metrics to catch query bugs. After each Sev-1/2: ask which signal was missing. Quarterly: cost and cardinality review. These rituals take little time and prevent the slow decay where dashboards lie and nobody notices until an outage.

Train new on-call engineers with a scavenger hunt: given a past incident timeline, find the RED and USE signals that told the story. Hands-on familiarity beats slide decks about observability philosophy.

What “good enough” looks like before buying APM

You are ready to evaluate advanced APM when: critical services expose RED; primary resources expose USE; at least one SLO guides release decisions; request IDs correlate logs across two hops; on-call can name the dashboard they open first; and alert noise is tolerable. If those are false, APM will mostly give you prettier ways to stare at the same gaps. If those are true, tracing and profiling become high-leverage upgrades rather than expensive distractions.

Write down your observability standards in a one-page engineering doc: required RED metrics, required USE for data stores, label denylist, SLO template, and alert ownership rules. Short standards beat perfect ones that never ship. Revisit the page when tooling changes, not when memories fade during an outage at 03:00.

When leadership asks for a tooling upgrade, answer with the gaps this page still shows. That framing keeps spend aligned with reliability outcomes instead of vendor roadmaps.

Capacity planning also benefits from the same foundation. Weekly USE trends on CPU, memory, disk, and pool saturation feed right-sizing conversations with finance without waiting for a specialized APM suite. Pair those trends with deploy frequency and error budget burn to show whether reliability investment is keeping up with product velocity.

If you only do one thing after reading this, pick your most customer-visible service and place RED and dependency latency on a single screen with deploy markers. Use it in the next incident. The gap between that experience and your current tooling will tell you exactly what to build—or buy—next.

Closing

Reliability starts with honest signals. RED tells you how services behave for users; USE explains resource constraints; light SLOs connect metrics to decisions about releases and toil. Master those before expanding into the full observability marketplace. The goal is faster, calmer incident response—not more graphs.