Controllability and Observability in Software Systems

Software systems have only ever grown in complexity. New trends such as microservices, distributed systems, and containerization have popped up. In addition, there is an increasing need for connectivity between systems. All of these technological improvements are great for the end user.

The benefits include faster-loading websites, more connected applications that integrate well with other solutions, and highly available services. However, all of this extra complexity comes at a cost. Software systems fail and will continue to fail as they increase in complexity.

The software industry has seen a great rise in new technologies, but the software observability industry didn’t move as fast as the software engineering industry. Suddenly, it became a real challenge to solve software problems due to the increased complexity of its systems. Because of the lack of innovation in observability tools, software and DevOps engineers had to rely on basic metrics such as CPU time and memory usage.

The problem is that these metrics only help answer known problems and are not very good at solving unknown problems. In this article, I will cover what observability actually means and how it differs from monitoring. I will also explore how logs provide context for observability and how controllability and observability differ from each other.

Eyeball with scalyr colors signifying controllability and observability

What’s the Definition of Observability?

Observability can be defined as the ability to infer the internal state of a system by looking at its external outputs. In other words, by looking at outputs such as logs, we should be able to determine what went wrong with your service.

With older software, you could just look at the metrics you had captured and determine what went wrong. Solving old software problems was mostly easy. But now that everything is more complex, metrics such as CPU time and memory usage don’t tell you much about the internal state of your application.

The CPU and memory could behave normally at the same users report issues. It’s hard to control distributed systems and capture every problem.

For that exact reason, observability provides more context for developers and DevOps engineers and can help them resolve problems faster. It’s the missing ingredient that completes the DevOps revolution and the software revolution in general.

Now let’s look at the difference between monitoring and observability.

Are Monitoring and Observability the Same Thing?

No, monitoring and observability are far from the same thing. Monitoring measures things such as CPU time and memory usage. You probably already have many ready-made solutions that can be applied when problems arise with CPU time or memory usage. For example, when CPU time increases, you may have a response ready to go that deploys additional servers to handle the traffic. Your database connection may hang up and cause a memory leak, but you can easily measure that with monitoring tools. The solution to this problem is simple: you can just restart the database connection.

When we speak about observability, however, we’re talking about a search for solutions to unknown problems. New problems might pop up every day, and you will need to find a solution for them. You can’t continue to rely on metrics; they can give you numbers, but they can’t reveal the wider context around what went wrong.

So observability is all about providing context. Logs are an excellent source of information when you need context. They help you gain a deeper understanding of what the user experienced and what might have gone wrong. In the next section, I’ll walk you through the benefits of using logs to increase observability into your application.

Where Logs Meet Observability

Here are the four benefits of logs and the reason why they’re essential to improving observability into your services.

1. Logs Provide a Detailed Path of Action and Enable Reproducibility

Logs provide a developer with a detailed path of all the actions the user performed that led up to whatever went wrong. You can use this path to reproduce exactly what the user experienced. It’s vital that developers are able to do this so they can gain a deeper understanding of the issue.

Once developers have determined the exact location of the bug, a debugger or other problem-resolution tool can be used to find the bug in the code itself.

2. Logs Provide Detailed Information

Logs produce detailed information about what happens in your application. In order words, they provide context. Logs often include meta information such as a timestamp or user request ID that enriches the data.

Additionally, when you or a user encounters an error, you’ll usually be able to find a stack trace in your logs. Wikipedia defines a stack trace as “a report of the active stack frames at a certain point in time during the execution of a program.” In other words, a stack trace produces a detailed path of all the code that was executed. This gives developers amazing insight into where to look for a possible solution.

3. Logs Provide Better Insights

Lastly, logs can give you better insights than regular monitoring metrics can. You can track the number of incidents, the number of errors, and the number of failed requests. This kind of data gives you much better visibility into the well-being of your application.

For example, you might notice a sudden increase in the error rate. This might signal that you have a problem, and it allows you to detect problems proactively through the observability of a system.

Next, let’s look at the subtle difference between observability and controllability.

Observability vs. Controllability

Now let’s examine the difference between observability and controllability. Where observability is only concerned with understanding the internals of a system by analyzing the outputs, controllability is concerned with examining outputs for given inputs. This means that software testing helps with improving the controllability of a software system.

Therefore, when we know that a particular input generates a certain expected output, we can improve the control we have over the system since we can be sure this aspect of the system works as intended. Controllability is actually one of the main pillars of writing testable software.

To summarize, controllability is concerned with both the input and the output of a system, whereas observability tries to illuminate the internal state by solely looking at the output.

Conclusion

Modern systems will continue to become more complex. Imagine an application that has a microservices architecture, runs on the Amazon Web Services cloud using Kubernetes clusters, and is deployed via a complex CI/CD setup. Software delivery is speeding up and software quality is increasing, but software observability needs to follow for this trend to be sustainable.

If software observability can’t keep up with the rapid progress of modern systems, problems might become so hard to debug that companies will move more slowly with these systems than they would have without them.

On the flip side, innovation is a natural process, and we don’t need to worry too much about this. Many products are available that help solve the observability problem.

Scalyr is one of the best log management solutions available. You can integrate it seamlessly into your preexisting workflow, it has blazing-fast search capabilities, and its intuitive user interface requires no training. Security is built in, as are redundancy and scalability. Try Scalyr yourself!