This article explores the evolution from basic monitoring to a comprehensive understanding of observability in system design. It emphasizes that true observability goes beyond collecting metrics, logs, and traces, focusing instead on the ability to understand a system's internal state, predict its behavior, and effectively control it for faster recovery and enhanced reliability. It highlights the architectural implications of designing systems for inherent observability.
Read original on Medium #system-designHistorically, system management focused on monitoring known unknowns: tracking predefined metrics, logs, and traces to detect anticipated issues. Observability, however, aims to address unknown unknowns by providing sufficient data from a system's internal state to infer any relevant property and understand unexpected behaviors. This paradigm shift requires a fundamental change in how systems are designed and instrumented from the ground up, moving beyond just collecting data to making that data actionable for insights into complex, distributed environments.
True observability is often described through three primary pillars: logs, metrics, and traces. However, the article suggests a deeper interpretation, emphasizing the utility of these signals to achieve three capabilities: understanding, prediction, and controllability of a system's state. Designing systems with these capabilities in mind leads to more resilient and easier-to-debug architectures.
Observability vs. Monitoring
Monitoring tells you if your system is working. Observability helps you understand *why* it isn't working and *how* to fix it, even for issues you didn't anticipate. It's about designing systems that expose their internal state comprehensively.
Incorporating observability from the initial design phase is crucial for modern distributed systems. This includes thoughtful instrumentation, standardized logging formats, distributed tracing integration, and a clear strategy for how collected data will be analyzed and acted upon. It's not just about adding tools, but about building systems that inherently surface their internal dynamics and state changes, allowing operators to ask arbitrary questions about their performance and behavior.
apiVersion: v1metadata:
name: my-service-v1spec:
containers:
- name: my-app
image: my-app:1.0
env:
- name: TRACING_ENABLED
value: "true"
- name: LOG_LEVEL
value: "INFO"
ports:
- containerPort: 8080
readinessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 15
periodSeconds: 20