Observability Best Practices
A short, opinionated set of practices for making a Kubernetes platform observable without drowning in cost or noise. These are the habits that separate a fleet you can debug from one you can only watch.
Search across all documentation pages
A short, opinionated set of practices for making a Kubernetes platform observable without drowning in cost or noise. These are the habits that separate a fleet you can debug from one you can only watch.
Treat this as a platform contract, not a per-team wish list. The highest-leverage move is standardizing what every workload emits so no team has to reinvent observability.
Adopt the groups roughly in order: instrument first, then control cost, then correlate, then alert and operate. Revisit the list during design reviews and incident retrospectives.
/metrics or emits OTLP, so discovery and scraping are uniform across the fleet.traceparent header through every service hop so a request can be followed end to end.k8sattributes processor or the agent's Kubernetes filter.trace_id in structured logs so you can pivot from a log line to its trace and back.app, namespace, and service labels across metrics, logs, and traces so joins work.for duration. Require an alert condition to persist before paging, so brief blips do not wake anyone.severity=page to on-call and everything else to a channel, with grouping and inhibition in Alertmanager.You should be able to answer three questions for any service in minutes: is it healthy now, what changed, and where is the time going. If a new failure mode leaves you blind, an instrumentation or correlation gap is the fix.
Review these practices when onboarding a new team, during design review, and after every incident. Observability is a standard you maintain, not a project you finish.
Where do I start if I have nothing? Instrument the golden signals as metrics and get structured logs flowing to a central backend. Add tracing once several services call each other.
What is the single biggest cost trap? Cardinality. Unbounded labels multiply Prometheus series and Loki index size faster than any other factor.
Should every team run its own stack? No. Provide a shared platform stack and a clear emit-this contract so teams instrument once against common tooling.
Do I alert on CPU? Rarely as a page. Alert on user-facing symptoms and keep CPU for capacity and autoscaling decisions.
How do I keep traces affordable? Use tail sampling on the gateway tier to retain errored and slow traces while dropping most fast successes.
Why insist on JSON logs to stdout? It keeps apps decoupled from the log backend, makes lines queryable by field, and lets the platform own collection.
Stack versions: This page was written for Kubernetes 1.36.2, Docker Engine 29.6.1 (BuildKit default), containerd (CRI runtime on nodes), Helm 3, Compose v2, Argo CD (latest - verify at build), and Gateway API (GA - verify controller support at build).
Reviewed by Chris St. John·Last updated Jul 19, 2026