Milind Daraniya

Logging Is Not Enough: Why Observability Is Becoming Essential for Modern Applications

Published August 30th, 2026 28 min read

There was a time when application debugging was very simple.

Something went wrong.

I opened the log file.

I searched for:

ERROR

Then I tried to understand what happened.

For a small application, this can work.

But as the application grows, logs alone are not enough.

A modern SaaS application may have:

Laravel
MySQL
Redis
Queue workers
APIs
External services
React
Nginx
Docker
Multiple servers

Now imagine a user tells me:

"The invoice page is very slow."

Where do I start?

Laravel?

MySQL?

Redis?

An external API?

Queue?

Network?

Nginx?

One application request may travel through many different services before the user finally gets a response.

This is where observability becomes important.

And in 2026, observability is moving from something large engineering teams use to something that much smaller application teams need to understand.

A major reason is OpenTelemetry.

In May 2026, the Cloud Native Computing Foundation graduated OpenTelemetry, recognizing it as a mature, vendor-neutral observability framework for collecting and processing metrics, logs and traces. CNCF says the project has more than 12,000 contributors from more than 2,800 companies.

That is a very strong signal.

Monitoring and observability are not exactly the same

These two words are often used as if they mean the same thing.

I don't think they do.

Monitoring usually asks:

"Is the system working?"

For example:

CPU = 80%
Memory = 70%
Requests = 10,000/min
Errors = 2%

That is useful.

But observability asks something deeper:

"Why is the system behaving this way?"

For example:

Request
↓
Laravel
↓
Redis
↓
MySQL
↓
External Payment API
↓
Response

If the request takes 2 seconds, observability should help us understand where those 2 seconds went.

That is a much more powerful idea.

Logs tell us what happened

Logs are still important.

For example:

Invoice 5001 created
User 100 logged in
Payment API failed
Queue job failed

These events tell us something about the application.

But logs are usually disconnected from each other.

Suppose I have:

10:32:01 Laravel request started
10:32:02 SQL query
10:32:02 Redis call
10:32:03 Payment API call
10:32:04 Response returned

I can read them.

But how do I know which SQL query belongs to which user request?

How do I connect the payment API failure to the original request?

How do I follow one request across multiple services?

This is where traces become useful.

A trace follows one request

Imagine a customer opens:

GET /api/invoices/5001

The request creates a trace.

Something conceptually like:

Trace
|
|-- Laravel Controller
|
|-- Authentication
|
|-- Redis
|
|-- MySQL
|
|-- Payment Service
|
`-- Response

Now I can see the complete path.

Maybe the Laravel code takes:

50 ms

Redis takes:

5 ms

MySQL takes:

30 ms

But an external API takes:

1,200 ms

Now I know where the real problem is.

Without tracing, I might waste hours looking at Laravel code.

This is why distributed systems need traces

As applications become more distributed, one user request can travel through many components.

For example:

Browser
↓
CDN
↓
Load Balancer
↓
Laravel API
↓
Redis
↓
Queue
↓
Payment API
↓
Notification Service

Now troubleshooting through logs becomes increasingly difficult.

A trace gives us a common thread.

The request starts here.

Then it moves here.

Then here.

Then here.

That makes distributed debugging much easier.

Metrics give us the big picture

Logs tell us about individual events.

Traces tell us about individual requests.

Metrics tell us what is happening across the system.

For example:

Request rate
Error rate
Latency
CPU
Memory
Queue depth
Database connections
Cache hit rate

Now suppose:

Requests = normal
CPU = normal
Memory = normal

but:

p95 latency = increasing

That tells us something interesting.

Maybe a database query is slowing down.

Maybe an external API is having problems.

Maybe Redis is under pressure.

Metrics are extremely useful for seeing trends before users start complaining.

p95 is more useful than average latency

This is something I think every backend developer should understand.

Suppose 100 requests happen.

99 requests take:

100 ms

but one request takes:

10 seconds

The average may still look reasonable.

But that one slow request is important.

Now imagine thousands of requests.

The average can hide the user experience of slower requests.

This is why developers often track:

p50
p95
p99

Instead of only:

average

For a SaaS application, p95 or p99 latency can tell us much more about the long tail of user experience.

This becomes very useful in Laravel

Imagine a Laravel API:

GET /api/orders

We discover:

p50 = 100ms
p95 = 450ms
p99 = 2.4s

That immediately tells me something.

Most users are fine.

But a small percentage of requests are becoming very slow.

Now I can use tracing to investigate those requests.

Maybe:

MySQL
↓
2.1 seconds

Then I inspect the query.

Maybe it is:

N+1

or:

Missing index

or:

Large JOIN

Now observability has directly helped me solve a real Laravel performance problem.

This is much better than adding random logs

I have seen code like:

Log::info('Step 1');

Log::info('Step 2');

Log::info('Step 3');

Log::info('Step 4');

Then developers try to understand what happened from a giant log file.

It works to a point.

But as the system grows, this becomes noisy.

Observability should give us structured information about:

Request
Trace
Span
Service
Database
External API
Duration
Error

rather than forcing developers to reconstruct everything manually from text logs.

OpenTelemetry is interesting because it is vendor-neutral

This is probably the most important reason OpenTelemetry has become so significant.

In the past, observability often meant choosing a monitoring vendor first.

Then integrating the application specifically for that vendor.

That creates lock-in.

OpenTelemetry takes a different approach.

We instrument the application using an open standard.

Then telemetry can be sent to the observability backend we choose.

Conceptually:

Application
↓
OpenTelemetry
↓
Collector
↓
Observability Backend

The backend could change later.

The application instrumentation does not necessarily need to be rewritten.

CNCF specifically describes this vendor-neutral layer as one of OpenTelemetry's major benefits because teams can change analysis systems without re-instrumenting their applications.

The three important signals

When I think about observability, I usually think about three major signals:

Logs

What happened?

Metrics

How much and how often?

Traces

Where did this request spend its time?

These work much better together.

For example:

Metric
↓
Error rate increased

Trace
↓
Payment API is slow

Logs
↓
Payment gateway returned timeout

Now we have the complete story.

Observability is not only for microservices

This is another misconception.

Some developers think:

"I have a monolithic Laravel application, so I don't need tracing."

I disagree.

Even a monolith can have many components.

For example:

Laravel
├── Controller
├── Service
├── Database
├── Redis
├── Queue
├── External API
└── File Storage

A single request can still involve many different systems.

Tracing can help here too.

You do not need 50 microservices before observability becomes useful.

This can be especially helpful for Laravel queues

This is very relevant to the kind of problems I regularly see in backend development.

Suppose a job takes:

5 minutes

Why?

We could add:

Log::info(...)

everywhere.

Or we could look at the job as a trace:

Job
|
|-- Load customers
|
|-- Query invoices
|
|-- Process products
|
|-- External API
|
|-- Generate report
|
`-- Store file

Now we can see:

Database = 40 seconds
API = 3 minutes
File processing = 1 minute

The optimization becomes obvious.

This is much better than saying:

"Laravel queue is slow."

Background jobs need observability too

A common mistake is observing HTTP traffic but ignoring background workers.

But in SaaS applications, a lot of the real work happens in queues.

For example:

HTTP request
↓
Dispatch Job
↓
Redis
↓
Queue worker
↓
Database
↓
Third-party API
↓
Email

The user sees only:

"Request accepted."

The real processing happens later.

If that job fails, we need to understand:

  • Which job?
  • Which user?
  • Which tenant?
  • Which operation?
  • Which external API?
  • Which database query?
  • How many retries?
  • How long did it run?

Observability gives us the tools to answer these questions.

Redis becomes much easier to understand

Suppose Redis is slow.

Without observability, I might just see:

Redis connection timeout

But with telemetry, I can look at:

Operation:
GET user:1001

Duration:
250 ms

Service:
Laravel API

Trace:
abc123

Then I can correlate it with the request that was already slow.

Now we have context.

That context is the real value of observability.

Database queries should be connected to requests

This is another area where I think Laravel developers can improve.

We often inspect slow queries separately.

For example:

SELECT ...
Time: 650ms

Useful.

But even better is:

Request:
GET /api/orders

Trace:
abc123

Query:
SELECT ...

Duration:
650ms

Now I know exactly which user operation triggered the expensive query.

That makes optimization much easier.

Error tracking becomes more useful too

Suppose production reports:

500 Internal Server Error

That alone isn't enough.

But imagine:

Trace ID: abc123
User ID: 500
Tenant ID: 20

Controller:
InvoiceController@store

Database:
successful

Payment API:
timeout

Queue:
not dispatched

Now the debugging process becomes much faster.

The developer doesn't have to reproduce the problem locally before understanding the likely cause.

This also helps customer support

This is something I think SaaS companies should take more seriously.

A customer says:

"My invoice did not generate."

Support normally asks:

"When did it happen?"

"Which invoice?"

"Can you send a screenshot?"

With proper observability, support or engineering can potentially search by:

Customer
User
Invoice ID
Trace ID
Request ID
Timestamp

and see what happened.

That can dramatically reduce debugging time.

Request IDs are a simple starting point

Even before adopting full OpenTelemetry, I think every serious application benefits from correlation IDs.

For example:

X-Request-ID: 9f7abc123

Then include that ID in:

Application logs
Database-related logs
Queue jobs
External API logs
Error reports

Now multiple events can be connected.

This is a very simple observability improvement.

Structured logs are better than random text

Instead of:

Invoice failed

I prefer structured information:

{
    "event": "invoice_failed",
    "invoice_id": 5001,
    "user_id": 100,
    "tenant_id": 20,
    "reason": "payment_timeout",
    "request_id": "abc123"
}

Now the logging system can search and aggregate it.

This is one of the easiest improvements a Laravel application can make.

Observability also changes how we think about incidents

Suppose the application has:

Error rate = 1%

I don't want to wait for somebody to report a problem.

I want an alert.

But an alert should also provide context.

Not:

ERRORS HIGH

Better:

Error rate increased from 0.3% to 4.2%.

Affected endpoint:
POST /api/invoices

Primary latency increase:
Payment API

Affected tenant count:
37

Now the alert helps somebody start investigating immediately.

Too many dashboards can become a problem

This is another important lesson.

Observability itself can become complicated.

One team may have:

Grafana
Prometheus
Jaeger
Loki
Sentry
Datadog
CloudWatch

Now developers have to open six different tools to understand one incident.

A February 2026 industry survey cited by CNCF found that 46.7% of surveyed organizations were still operating two to three observability tools in parallel, while only 7.4% had a single unified observability experience.

So the problem is not simply:

"Do we have enough monitoring?"

It can become:

"Can we actually understand the system without jumping between five different tools?"

This is why OpenTelemetry matters

The interesting part of OpenTelemetry is not another dashboard.

It is the standardization layer.

It gives us common ways to generate:

Metrics
Logs
Traces

and connect them.

That gives engineering teams more freedom to choose their backend tools later.

This is one of the reasons CNCF's 2026 graduation announcement called OpenTelemetry a de facto observability standard.

OpenTelemetry is already being used with PHP

This is important for PHP developers.

OpenTelemetry has language-specific APIs and SDKs, including PHP support, so this is not something restricted to Java, Go or Kubernetes-heavy applications.

The official OpenTelemetry adopter list includes organizations using OpenTelemetry components with PHP among their stacks.

That makes the technology much more relevant for Laravel applications.

I would not instrument everything on day one

This is where I think developers can make observability unnecessarily complicated.

We do not need:

Every function
Every variable
Every SQL statement
Every loop

to become telemetry.

Start with the important boundaries.

For example:

HTTP request
↓
Database
↓
Redis
↓
External API
↓
Queue

That already gives a lot of useful information.

Then expand where necessary.

The goal is not collecting more data

This is important.

Observability is not:

"Store everything."

That can become expensive.

The goal is:

"Collect the right information to understand system behavior."

Too much telemetry can become another problem.

We need to think about:

  • Storage
  • Retention
  • Sampling
  • Sensitive data
  • Cost
  • Query performance

More telemetry is not automatically better telemetry.

Be careful with sensitive information

Observability systems can accidentally become a security problem.

Imagine logging:

Password
API Token
Credit Card
Authorization Header
Personal Data

Now the monitoring system contains sensitive information.

That is dangerous.

So observability must follow the same security principles as the application.

Mask sensitive fields.

Avoid unnecessary payload logging.

Control access.

Define retention.

Encrypt where appropriate.

Observability and SaaS multi-tenancy

For a SaaS platform, I would also include tenant context.

For example:

tenant_id
user_id
request_id
trace_id

Then I can answer:

"Which tenant is experiencing the problem?"

This can be extremely useful.

Suppose:

99% tenants:
normal

but:

Tenant 500:
very slow

Maybe that tenant has:

10 million records

while everybody else has:

10,000 records

Now the optimization path is completely different.

This also helps capacity planning

Observability is not only about fixing failures.

It can help us understand growth.

For example:

January:
1 million requests

June:
8 million requests

December:
25 million requests

We can see trends.

Maybe database connections are increasing.

Queue depth is growing.

Redis memory is approaching a limit.

API latency is slowly increasing.

Observability allows us to make infrastructure decisions before everything becomes an emergency.

Profiling is the next level

Metrics and traces tell us where the problem is.

Profiling can sometimes help answer:

"What exactly is consuming CPU or memory inside the application?"

This is particularly valuable for performance-heavy workloads.

CNCF's 2025 cloud-native survey reported that nearly 20% of respondents were already using profiling as part of their observability stack, suggesting that profiling is becoming a more important part of performance investigation.

For a Laravel developer, this can be especially useful when a request is slow but the obvious database or API bottlenecks are not the cause.

Observability is moving closer to application development

This is probably the biggest trend I see.

Earlier:

Developer writes code
↓
DevOps monitors production

Now:

Developer
↓
Builds
↓
Instruments
↓
Measures
↓
Deploys
↓
Observes
↓
Optimizes

Developers increasingly need to understand production behavior, not just write application code.

And I actually think that is a good thing.

It changes the debugging mindset

Without observability:

"Something is slow."

With observability:

"POST /api/invoices has p95 latency of 1.8 seconds, and 72% of that time is spent waiting for the payment API."

That is a completely different level of debugging.

The first statement creates guessing.

The second creates an action.

My practical approach for Laravel

If I were improving observability in a Laravel SaaS application, I would start with:

1. Structured application logs
2. Request IDs
3. Error tracking
4. Slow-query monitoring
5. Queue monitoring
6. Metrics
7. Distributed tracing

Then introduce OpenTelemetry where it gives us additional value.

I would especially instrument:

HTTP
Database
Redis
Queues
External APIs
Important business workflows

That gives a very strong foundation.

I would also measure business events

This is something technical monitoring sometimes misses.

For example:

Invoice created
Payment completed
Booking cancelled
Order failed
Sync failed
Subscription renewed

These are business events.

A production system can be technically healthy while the business is broken.

For example:

HTTP 200 = 99.9%

looks excellent.

But:

Payment success rate = 82%

is a serious business problem.

Observability should help us connect technical health with business health.

The biggest mistake is waiting until production is broken

Many teams add observability after a major incident.

Then they discover:

"We don't have enough information to understand what happened."

At that point, adding telemetry during an emergency is much harder.

I prefer building basic observability into the application from the beginning.

Not everything.

Just enough to answer:

What happened?

Where did it happen?

How long did it take?

Who was affected?

Why did it fail?

My final view

I don't think logs are going away.

Metrics are not going away.

Monitoring is not going away.

But modern applications need more than isolated logs and server graphs.

When a Laravel SaaS application grows, one request can touch many components.

That is why I think observability is becoming a core development skill rather than only a DevOps responsibility.

And the OpenTelemetry graduation in 2026 is an important milestone because it shows that the industry is moving toward a common, vendor-neutral way of collecting telemetry.

For me, the biggest lesson is simple:

Don't wait for production to fail before trying to understand production.

Build the ability to see what your application is doing while you are building it.

Because when a user says:

"Your application is slow."

I don't want to guess.

I want to open the trace, find the slow part, identify the real bottleneck, and fix the actual problem.

That is what good observability gives us.