There was a time when application debugging was very simple.
Something went wrong.
I opened the log file.
I searched for:
ERRORThen 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 serversNow 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
↓
ResponseIf 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 failedThese 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 returnedI 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/5001The request creates a trace.
Something conceptually like:
Trace
|
|-- Laravel Controller
|
|-- Authentication
|
|-- Redis
|
|-- MySQL
|
|-- Payment Service
|
`-- ResponseNow I can see the complete path.
Maybe the Laravel code takes:
50 msRedis takes:
5 msMySQL takes:
30 msBut an external API takes:
1,200 msNow 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 ServiceNow 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 rateNow suppose:
Requests = normal
CPU = normal
Memory = normalbut:
p95 latency = increasingThat 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 msbut one request takes:
10 secondsThe 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
p99Instead of only:
averageFor 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/ordersWe discover:
p50 = 100ms
p95 = 450ms
p99 = 2.4sThat 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 secondsThen I inspect the query.
Maybe it is:
N+1or:
Missing indexor:
Large JOINNow 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
Errorrather 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 BackendThe 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 timeoutNow 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 StorageA 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 minutesWhy?
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 fileNow we can see:
Database = 40 seconds
API = 3 minutes
File processing = 1 minuteThe 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
↓
EmailThe 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 timeoutBut with telemetry, I can look at:
Operation:
GET user:1001
Duration:
250 ms
Service:
Laravel API
Trace:
abc123Then 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: 650msUseful.
But even better is:
Request:
GET /api/orders
Trace:
abc123
Query:
SELECT ...
Duration:
650msNow 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 ErrorThat 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 dispatchedNow 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
Timestampand 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: 9f7abc123Then include that ID in:
Application logs
Database-related logs
Queue jobs
External API logs
Error reportsNow multiple events can be connected.
This is a very simple observability improvement.
Structured logs are better than random text
Instead of:
Invoice failedI 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 HIGHBetter:
Error rate increased from 0.3% to 4.2%.
Affected endpoint:
POST /api/invoices
Primary latency increase:
Payment API
Affected tenant count:
37Now 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
CloudWatchNow 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
Tracesand 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 loopto become telemetry.
Start with the important boundaries.
For example:
HTTP request
↓
Database
↓
Redis
↓
External API
↓
QueueThat 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 DataNow 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_idThen I can answer:
"Which tenant is experiencing the problem?"
This can be extremely useful.
Suppose:
99% tenants:
normalbut:
Tenant 500:
very slowMaybe that tenant has:
10 million recordswhile everybody else has:
10,000 recordsNow 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 requestsWe 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 productionNow:
Developer
↓
Builds
↓
Instruments
↓
Measures
↓
Deploys
↓
Observes
↓
OptimizesDevelopers 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 tracingThen introduce OpenTelemetry where it gives us additional value.
I would especially instrument:
HTTP
Database
Redis
Queues
External APIs
Important business workflowsThat 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 renewedThese 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.