
- Monitoring: predefined checks, known failure modes, and binary answers — “is something broken according to the checks we wrote?”
- Observability: exploratory, correlated signals enabling ad-hoc questions — “why is this happening, where is the hotspot, and what change triggered it?”

- Metrics — “What is happening?” Numeric time series: counters, gauges, histograms. Compact, efficient, ideal for dashboards and alerts.
- Logs — “What was the context?” Time-stamped event records with high cardinality and rich context for debugging.
- Traces — “What was the path?” Distributed traces show the sequence of service hops and timings for a request.

How these pillars map to a practical stack
A platform observability stack usually separates responsibilities into layers:
- Signal sources: instrumented apps, node exporters, service mesh sidecars, kube-state metrics.
- Collection layer: Prometheus for metrics scraping, OpenTelemetry Collector for traces and metrics, and Fluentd/Fluent Bit for logs.
- Visualization & alerting: Grafana for dashboards, Jaeger/Tempo for traces, and Alertmanager (or other systems) for notifications and incident workflows.

- Golden signals
- Latency: request durations (p50, p90, p99) and distributions by endpoint.
- Traffic: request rates (RPS), throughput, or transactions per second.
- Errors: error count or error-rate percentage, per endpoint/service.
- Saturation: resource usage that limits capacity (CPU, memory, disk, network). These are the highest-value signals — if you measure only a few things, start here.
The golden signals give immediate insight into user experience and capacity. Instrument critical endpoints and paths to capture latency, traffic, errors, and saturation with labels for service, endpoint, and region to keep cardinality manageable.
-
Platform health
- Node metrics: CPU, memory, disk I/O, network throughput, and filesystem metrics.
- Pod health: restart counts, CrashLoopBackOff events, and OOM kills.
- Control plane metrics: API server latencies, etcd performance, scheduler queues.
-
Deployment and delivery metrics (DORA metrics)
- Deployment release frequency.
- Lead time for changes (commit to production).
- Change failure rate (deployments requiring remediation).
- Mean time to recovery (MTTR).
-
Cost and efficiency
- Requested vs actual resource usage by namespace or workload.
- Cost per service / namespace, and utilization efficiency. Tools such as OpenCost help map cloud spend to workloads and teams.
High-cardinality metrics and verbose log retention can dramatically increase storage and costs. Instrument thoughtfully (sample, aggregate, or use histograms), set sensible retention policies, and label with necessary dimensions only.
- Platform engineers should own the observability stack: provision it, operate it, and provide it as a self-service capability for application teams.
- Application teams should instrument their code with metrics, traces, and meaningful logs using OpenTelemetry and the platform’s recommended libraries and conventions.
- Define SLIs/SLOs and align alerting to actionable thresholds to reduce pager fatigue and false positives.
- Start with the golden signals for every user-facing service.
- Ensure traces are correlated with request IDs and deployment metadata.
- Centralize logs with searchable context linked from traces and metrics.
- Implement SLOs and configure alerts targeting the right on-call teams.
- Monitor cost and cardinality to keep the observability platform sustainable.

- Prometheus: https://prometheus.io/
- Grafana: https://grafana.com/
- OpenTelemetry: https://opentelemetry.io/
- Jaeger: https://www.jaegertracing.io/
- Fluentd: https://www.fluentd.org/
- Fluent Bit: https://fluentbit.io/
- Loki: https://grafana.com/oss/loki
- SRE and Golden Signals: https://sre.google/
- DORA metrics: https://devops-research.com/
- OpenCost: https://opencost.io/