1.Three pillars: logs, metrics and traces
Logs, metrics and traces are three different shapes of data about the same running system, and each answers a question the other two cannot answer well. A log is a discrete, timestamped record of one event — rich in detail about exactly what happened, but expensive to store and slow to query across a whole fleet at scale. A metric is a numeric measurement aggregated over time (a count, a rate, a gauge, a histogram bucket) — cheap to store and fast to query, but it tells you something is wrong without telling you which request or which user was affected. A trace follows one request as it moves across multiple services, recording how long each hop took and how the hops relate to each other — it answers "where did this specific request spend its time" in a way neither logs nor metrics alone can. None of the three replaces the other two; a mature observability setup carries all three and correlates them together.
Key features
- Metrics are aggregated numeric time series (counters, gauges, histograms) — cheapest to store and query, but describe the system in general, not any one request
- Logs are discrete timestamped event records — richest detail per event, but the most expensive to store and slowest to search at high volume
- Traces follow a single request across service boundaries as a tree of timed spans, showing where that request spent its time
- The three pillars are complementary, not substitutable — metrics tell you something is wrong, traces show you where, logs show you exactly what happened there
- A request ID or trace ID is what lets you pivot from a metric spike to the specific traces and logs for the affected requests
What each pillar is actually good and bad at
- Metric dashboard — p99 latency spikes — something is wrong
- leads to Trace for a slow request (pivot via request/trace ID)
- Trace for a slow request — which service and span ate the time
- leads to Logs for that span (pivot to the slow span's logs)
- Logs for that span — exact error message and context
Command
// The same incident, seen through each pillar
metric: http_request_duration_seconds{route="/checkout"} p99 spikes to 4.2s
log: 2026-08-25T10:03:11Z ERROR checkout-svc req_id=abc123 "payment gateway timeout after 4000ms"
trace: req_id=abc123
checkout-svc [====================] 4210ms
payment-svc [==================] 4180ms <- almost all the time
db-query [==] 220msMetrics detect that something is wrong system-wide and are cheap to watch continuously; traces localize the problem to a specific service and span for one request; logs explain the specific cause once localized. The three are complementary — a request/trace ID is the thread that lets you pivot from one pillar to the next during a real investigation.