Three Pillars of Observability
What each pillar is for, where they fail, and the unified-via-OpenTelemetry shift.
Overview
Metrics, logs, traces
Observability is the property of a system that lets you understand its internal state from its external outputs. The practical decomposition has held for about 10 years: metrics, logs and traces, the "three pillars."
Each pillar's job
- Metrics — Numerical, time-series, aggregated — Cheap — "How many requests per second? What's the p99 latency? How full is the disk?" — Prometheus, Mimir, Cortex, Datadog, CloudWatch
- Logs — Structured or semi-structured events — Expensive (volume × retention) — "What did this specific request do? What was the stack trace?" — Loki, Elasticsearch/OpenSearch, Splunk, Datadog Logs
- Traces — A tree of spans, each a unit of work — Expensive at full sampling — "This 5-second request: where did the time go?" — Jaeger, Tempo, Honeycomb, X-Ray
The 2020s shift: OpenTelemetry
Before OpenTelemetry (OTel), each pillar had its own SDK, wire format and collector. Now you instrument once and the OTel Collector routes each signal to its backend.
> [!NOTE] OTel is now CNCF's second-most-active project after Kubernetes.
The challenge to the pillars
Charity Majors, founder of Honeycomb, argues the pillars treat observability as three siloed datasets. Real debugging correlates across them: a metric spike, then the logs from that window, then a slow trace. Modern stacks (Honeycomb, Datadog, Grafana LGTM) build that correlation in.
> [!TIP] The three pillars are correct as a mental model but limited as an architecture.
Beyond the pillars
- Profiles — Continuous CPU and memory profiles aggregated over time; find which function, not just which service — Pyroscope, Parca
- Events — Deploy markers, feature-flag flips, scaling events, correlated against other signals
Key concepts
- Metrics
- Numerical, time-series, aggregated. Cheap. Drives alerts and dashboards. Counter, gauge, histogram, summary types.
- Logs
- Structured events. Expensive. Drives debugging and audit. JSON-formatted preferred over plain text for queryability.
- Traces
- Span trees showing causality across services. Drives latency investigations. Span = unit of work; trace = tree of spans sharing a trace_id.
- OpenTelemetry (OTel)
- CNCF standard for instrumentation. One SDK emits metrics + logs + traces; OTel Collector routes to backends. The default for new services.
- Continuous profiling
- CPU/memory profiles aggregated over time (Pyroscope, Parca). Adds the "which function" dimension that traces and logs lack.
- Correlation
- The point of unified observability. Click from a metric spike into the logs from that range, into the slow trace within those logs.
When to use it
- Designing observability for a new service — pick which pillars you need (usually all three)
- Cost reviews — logs are usually the biggest spend; metrics are cheapest
- "What's wrong with this service" investigations — start with metrics, drill into logs/traces
- Picking a vendor or stack — open-source LGTM vs Datadog vs Honeycomb has different ergonomic and cost profiles
Interview questions
- When do you reach for metrics vs logs vs traces?
- What is OpenTelemetry and why does it matter?
- What's wrong with the "three pillars" mental model?
Sign up free to read the full topic
More SRE topics
Start free on Cariara · Coding problems · System design studio