The Old World: When 'Debugging' Was Simple
To understand why observability was needed, you have to remember the world before it. For decades, most software ran as a monolith—a single, massive application on a single server. If something broke, you knew where to look. The entire story of what went
wrong was contained within one process on one machine. Developers could use debuggers to pause the program and inspect its state, or they could read through a chronological log file. This approach worked because the systems were predictable and failures were localized. You knew which questions to ask because the range of possible problems was relatively contained.
The First Pillar: Logs as the System's Diary
Logging is the oldest and most intuitive form of system introspection. It's like a detailed, timestamped diary kept by the application, where every entry describes a specific event: a user logged in, a database query failed, a file was written. For monolithic applications, this was often enough. If a user reported an error, you could find the corresponding entries in the log file and reconstruct the sequence of events. But as systems grew, this diary became a firehose. Sifting through millions of log entries from hundreds of servers to find the one relevant line became an impossible task. Logs provided the raw details, but they lacked a big-picture view.
The Second Pillar: Metrics as the Health Dashboard
Metrics were the answer to log overload. Instead of recording every single event, metrics aggregate data into numerical summaries over time. Think of it like the dashboard of your car. You don't need a log of every single engine rotation; you just need to know your RPM, speed, and engine temperature. In software, metrics tell you things like CPU usage, error rate, and application response time. This gives engineers a high-level view of system health, allowing them to spot trends and set alerts for when things go wrong. Metrics tell you that something is wrong, but they rarely tell you why.
The Real Reason: Traces for a World of Chaos
The game-changer was the rise of microservices and distributed systems. Instead of one giant application, companies started building hundreds of small, independent services that all talk to each other. Suddenly, a single user request might travel across dozens of services before completing. When it failed, the old tools were useless. A high error rate (a metric) couldn't tell you which of the 50 services was the culprit. The logs for any single service only showed a tiny piece of the puzzle. This is where the third pillar, distributed tracing, became essential. Pioneered by systems like Google's Dapper, a trace stitches together the entire journey of a request as it hops from service to service. Each step in the journey is a 'span', and the collection of spans forms a complete trace, showing exactly where a request slowed down or failed. Traces were designed specifically to answer the question that metrics and logs couldn't: in a world of distributed chaos, where did the problem happen?











