When OCI Is Green but the Application Is Down



Introduction

A production incident does not always begin with alarms, failed Compute instances, or a dashboard full of red indicators.

Sometimes, the situation is much more confusing.

The Compute instances are running. The Load Balancer is available. CPU and memory look normal. Storage has capacity. The database is online. Network resources appear healthy. OCI Monitoring shows no obvious infrastructure failure.

Everything is green.

But users cannot access the application.

This is one of the most challenging situations in production operations because the infrastructure and the user appear to be telling us two completely different stories.

The infrastructure says:

Healthy.

The user says:

The application is down.

That exposes an important distinction:

Infrastructure Health ≠ Service Health

A healthy Compute instance does not guarantee a healthy application.

An available database does not guarantee that the application can connect to it.

A functioning VCN does not guarantee that every required network path is working.

A valid application process does not guarantee that it can authenticate to its dependencies.

And a green OCI dashboard does not necessarily mean that users can successfully complete the business transaction the environment was built to support.

Applications Are Dependency Chains

In an enterprise environment, an application is rarely a single component.

What users see as one service may actually depend on a chain such as:

User → DNS → Load Balancer → Network → Web Tier → Application Tier → Database

And behind that apparently simple path may exist additional dependencies:

IAM

Secrets

Certificates

Storage

Network Security Groups

Security Lists

Route Tables

DNS resolution

Application processes

Database authentication

External APIs

Third-party integrations

Every individual OCI resource can appear operational while one broken relationship somewhere in that chain makes the complete business service unavailable.

That is the problem I want to explore in this article.

A Different Troubleshooting Question

During an infrastructure incident, one of the first questions is often:

“Which server is down?”

But what happens when no server is down?

I prefer to approach this type of incident with a different question:

“Where did the user transaction stop working?”

That small change completely alters the investigation.

Instead of troubleshooting resources independently, we follow the transaction.

User

↓

DNS

↓

Load Balancer

↓

Network

↓

Web Tier

↓

Application

↓

Database

↓

Identity / Secrets

↓

External Dependencies

At every step, we ask:

Can this component successfully communicate with the next component required to complete the transaction?

Now troubleshooting becomes a process of eliminating working layers until we locate the first broken dependency.

The Scenario

Let's imagine a production application running in Oracle Cloud Infrastructure.

At 09:17, users begin reporting that the application is unavailable.

The operations team checks the infrastructure.

Compute: 🟢 Running

Load Balancer: 🟢 Available

Database: 🟢 Available

Storage: 🟢 Available

Network: 🟢 Available

CPU: 🟢 Normal

Memory: 🟢 Normal

There is no obvious OCI infrastructure outage.

Yet:

Application: 🔴 UNAVAILABLE

Users: 🔴 IMPACTED

This is where the investigation begins.

What Could Be Wrong?

Even with all major OCI resources operational, several failures remain possible.

The Load Balancer may be unable to reach its backend.

An application process may be running but not responding.

A required port may be inaccessible.

A network security rule may have changed.

The application may have lost database connectivity.

A secret may have rotated.

A certificate may have expired.

A filesystem may be nearly full.

DNS may be resolving incorrectly.

An external API may be unavailable.

Authentication may be failing.

The challenge is therefore not proving that infrastructure exists.

The challenge is identifying which dependency no longer behaves as expected.

First Mistake: Restart Everything

One of the most tempting responses during an incident is:

“Restart the services.”

Or worse:

“Restart everything.”

Sometimes that works.

But there is a problem.

A restart can restore the service while simultaneously destroying useful evidence about why the failure occurred.

Before restarting components, when business impact and incident severity allow it, I want to capture enough information to understand the failure.

I would first ask:

Did the Load Balancer lose healthy backends?

Is the application process responding?

Can the application reach the database?

Did DNS resolution change?

Did a certificate expire?

Was a secret rotated?

Did an NSG or Security List change?

Is the filesystem approaching capacity?

Did an external dependency fail?

Were there recent changes?

A successful restart proves that the service recovered.

It does not necessarily prove what caused the incident.

And without understanding the cause, we may simply be resetting the countdown until the same failure happens again.

Follow the Transaction, Not the Server

This is the core troubleshooting principle for this scenario.

Instead of asking:

“Which resource looks unhealthy?”

follow the transaction:

USER

↓

DNS

↓

LOAD BALANCER

↓

NETWORK PATH

↓

WEB TIER

↓

APPLICATION TIER

↓

DATABASE

↓

IDENTITY / SECRETS

↓

EXTERNAL DEPENDENCIES

For every transition, validate one thing:

Can A successfully communicate with B in the way the application requires?

If yes:

Continue.

If no:

Stop and investigate that boundary.

This provides a much more structured investigation than checking servers randomly.


Layer 1 — Start Where the User Enters

Begin with the service entry point.

Can the hostname be resolved?

Is DNS returning the expected destination?

Can the endpoint be reached?

Is TLS negotiation successful?

Is the certificate valid?

Is the Load Balancer listener available?

Are the expected backends healthy?

Imagine the result:

DNS: 🟢

↓

Endpoint: 🟢

↓

Load Balancer: 🟢

↓

Listener: 🟢

↓

Backend Health: 🔴

That already tells us something valuable.

The problem is probably not the user's DNS resolution or the external Load Balancer endpoint.

The investigation should move deeper into the application path.

Layer 2 — Is the Network Path Really Working?

A healthy VCN does not prove that the application communication path is healthy.

Likewise, a running Compute instance does not prove that traffic can reach the process running inside it.

The actual flow may depend on:

Network Security Groups

Security Lists

Route Tables

Gateways

DNS

Listening ports

Firewalls

Peering

Private endpoints

On-premises connectivity

Instead of asking:

“Is the network up?”

ask something more specific:

“Can source A reach destination B using the required protocol and port through the expected path?”

That is a question we can actually test.

And during incidents, testable questions are much more useful than broad assumptions.

Layer 3 — Is the Application Actually Healthy?

This is where infrastructure-only monitoring can become misleading.

Imagine:

Compute Instance: 🟢 Running

CPU: 🟢 Normal

Memory: 🟢 Normal

Network Interface: 🟢 Available

But:

Application Process: 🔴 Unresponsive

The infrastructure resource exists and continues producing normal metrics.

The application, however, may be:

Stopped

Hung

Waiting on another dependency

Unable to authenticate

Experiencing connection pool exhaustion

Unable to write files

Listening on the wrong port

Returning application errors

From the OCI infrastructure perspective, the server may still appear healthy.

From the business perspective:

Production is down.

UP Does Not Mean HEALTHY

This distinction is important enough to state explicitly:

UP ≠ HEALTHY

A process can exist but fail to respond correctly.

A port can be open while transactions fail.

A database can be available while the application cannot authenticate.

A Load Balancer can be operational while all of its backends are unhealthy.

A VM can run perfectly while the application inside it is unusable.

Resource state is therefore only one piece of service health.

Layer 4 — Validate the Database From the Application Perspective

Now suppose OCI reports:

Database: 🟢 AVAILABLE

Should we eliminate the database from the investigation?

Not yet.

The better question is:

Can the application successfully consume the database service?

That requires looking at the complete dependency.

Application

↓

DNS / Endpoint

↓

Network Path

↓

Port

↓

Listener

↓

Database Service

↓

Authentication

↓

Session / Connection

A database can be available while the application fails because of:

Incorrect credentials

Expired credentials

Network restrictions

Listener problems

Service-name configuration

Wallet issues

Connection-pool exhaustion

Authentication failures

The important operational principle is:

A healthy dependency that cannot be consumed by the application is effectively unavailable to that service.

Layer 5 — Identity Can Break an Otherwise Healthy Environment

Identity failures are particularly deceptive because they may have almost no visible effect on traditional infrastructure metrics.

Consider:

Compute: 🟢

Network: 🟢

Load Balancer: 🟢

Database: 🟢

Storage: 🟢

But:

Authentication / Authorization: 🔴

The business service may still be unavailable.

Potential causes include:

Expired certificate

Rotated secret

Incorrect IAM policy

Dynamic Group mismatch

Token-generation failure

Credential expiration

Authorization changes

Lost access to an OCI service

CPU may remain normal.

Memory may remain normal.

The VM may continue running.

This is why I consider identity part of the runtime dependency chain, not simply a security configuration performed during deployment.

Layer 6 — Storage Can Fail Quietly

Storage issues can also create misleading symptoms.

Imagine a filesystem at:

70% → 80% → 90% → 95% → 98%

The server is still running.

The application process may still exist.

But the application may suddenly become unable to:

Write logs

Create temporary files

Generate reports

Process exports

Complete batch operations

Write application data

Eventually, users see an application error.

But the root cause may simply be:

Storage capacity.

That is why capacity monitoring should focus not only on current utilization but also on growth trends.

The useful question is not only:

“Is the disk full?”

It is:

“When will this disk become full if the current growth rate continues?”

Layer 7 — Don't Forget External Dependencies

Not every OCI production failure originates inside OCI.

The application may depend on:

SaaS services

On-premises systems

Identity providers

External APIs

SMTP services

File-transfer platforms

Third-party integrations

External DNS

OCI infrastructure may be completely healthy while an external dependency makes the business process unusable.

A mature service model therefore needs to answer:

What does this application depend on to deliver the business service?

not only:

Which OCI resources belong to this application?

Introducing the JLTDS Signal Gap

This brings us to a concept I call the JLTDS Signal Gap.

The Signal Gap represents the distance between:

what infrastructure monitoring reports

and

what the business service is actually experiencing.

Imagine this dashboard:

Infrastructure View

🟢 Compute

🟢 Network

🟢 Load Balancer

🟢 Database

🟢 Storage

But on the other side:

Business View

🔴 Login Failed

🔴 Transaction Failed

🔴 Integration Failed

🔴 Service Unavailable

The space between those two views is the:

SIGNAL GAP

The larger that gap becomes, the greater the chance that:

Users become your monitoring system.

That is precisely what mature observability should try to prevent.


Infrastructure Health vs. Service Health

The difference becomes clearer when we separate the questions each perspective answers.

Infrastructure Health

Infrastructure monitoring tells us:

Is the Compute instance running?

Is CPU utilization abnormal?

Is storage available?

Is the database online?

Is the Load Balancer provisioned?

Are the OCI resources operational?

All of this information matters.

But it doesn't tell the complete story.

Service Health

Service monitoring asks:

Can the user authenticate?

Can the application complete a transaction?

Can the web tier reach the application tier?

Can the application reach the database?

Are critical dependencies responding?

Is response time acceptable?

Can the expected business process complete successfully?

These questions are much closer to the user's actual experience.


Building Monitoring in Layers

For a critical OCI application, I prefer to think about monitoring in layers.

Layer 1 — Resource

Monitor the underlying infrastructure:

Compute

Network

Storage

Database

Load Balancer

This establishes basic infrastructure visibility.

Layer 2 — Process

Monitor the processes actually delivering the service:

Application services

Web services

Listeners

Critical ports

Scheduled services

A running VM with a failed application process should not appear fully healthy.

Layer 3 — Dependency

Monitor the relationships between components:

Application → Database

Application → IAM

Application → Object Storage

Application → DNS

Application → External API

This layer is where many invisible failures become visible.

Layer 4 — Service

Test the actual application endpoint.

Can the service respond correctly?

This may involve health checks, application-level validation, or synthetic monitoring.

Layer 5 — Business Transaction

Finally:

Can a representative user transaction complete?

For example:

Login → Query → Process → Save → Response

If that transaction fails, there is a service problem regardless of how many infrastructure indicators remain green.

The JLTDS Service Health Model

This gives us a five-layer model:

RESOURCE

↓

PROCESS

↓

DEPENDENCY

↓

SERVICE

↓

BUSINESS TRANSACTION

Each level answers a different operational question.

Resource: Is the infrastructure available?

Process: Are critical application components running?

Dependency: Can the required components communicate?

Service: Is the application functioning correctly?

Business Transaction: Can the user accomplish what the application exists to provide?

The further we move down the model, the closer monitoring gets to actual business impact.


A Better Incident Investigation Flow

With this model, troubleshooting becomes much more structured.

1 — Confirm the Impact

What exactly are users unable to do?

↓

2 — Test the Entry Point

Validate DNS, certificate, endpoint, and Load Balancer.

↓

3 — Follow the Transaction

Find the first point where communication or processing fails.

↓

4 — Validate Application Health

Check processes, ports, logs, and errors.

↓

5 — Validate Dependencies

Database, IAM, secrets, storage, APIs, and integrations.

↓

6 — Correlate Telemetry

Metrics, logs, alarms, events, and application errors.

↓

7 — Identify the Failure Domain

Infrastructure, network, process, dependency, identity, application, or external service.

↓

8 — Recover

Apply the safest appropriate remediation.

↓

9 — Validate From the User Perspective

Don't stop when the server turns green.

Confirm the business transaction works.

↓

10 — Learn

Determine what should detect the same condition earlier next time.

Recovery Is Not the End

Suppose restarting an application process restores production.

The service is back.

Incident closed?

Not yet.

We still need to ask:

Why did the process fail?

Was there an alert?

Who discovered the problem first?

Could monitoring have detected it earlier?

Could recovery be automated safely?

Could the same condition happen again?

A recovery without learning simply resets the clock until the next incident.

From Troubleshooting to Observability

Traditional troubleshooting is reactive:

Failure → Investigation → Recovery

A more mature operational model becomes:

Detect → Understand → Correlate → Recover → Learn → Prevent

And for predictable scenarios:

Detect → Validate → Automate → Verify

The objective isn't to eliminate human troubleshooting.

Complex systems will always produce unexpected conditions.

The objective is to reduce the time between:

something failing

and

understanding why it failed.

What I Would Change After This Incident

If users discovered the outage before monitoring did, I would treat that as an observability finding.

I would review:

Application health checks

Load Balancer backend monitoring

Critical process monitoring

Database connectivity validation

Certificate expiration monitoring

Secret lifecycle monitoring

Storage growth trends

IAM and authentication failures

External dependency monitoring

Synthetic transactions

Alert routing

Then I would ask:

What signal existed before the user opened the incident?

Very often, some signal was already present.

It simply wasn't being collected, correlated, or turned into an actionable alert.

The Most Important Dashboard May Not Be an Infrastructure Dashboard

Infrastructure teams naturally organize dashboards around technology.

Compute

Networking

Database

Storage

But business applications don't operate in isolated technology towers.

A service-oriented dashboard might instead show:

CUSTOMER PORTAL

DNS: 🟢

Load Balancer: 🟢

Web Tier: 🟢

Application: 🟢

Database Connectivity: 🟢

Authentication: 🟢

External Integration: 🟢

Synthetic Transaction: 🟢

Now the dashboard answers:

“Is the Customer Portal working?”

instead of simply:

“Are the servers running?”

That is a much more useful operational perspective.

Five Questions I Ask During a Green-Infrastructure Incident

When infrastructure appears healthy but the application does not, these are the five questions I would prioritize.

1. Where Does the User Transaction Stop?

Identify the first failed step.

2. Which Dependency Exists Immediately After That Point?

Follow the service chain.

3. What Changed Recently?

Review deployments, patches, configuration changes, network changes, certificate renewals, secret rotations, and integrations.

4. Which Signal Should Have Detected This?

Identify the monitoring gap.

5. How Do We Prevent Users From Discovering This First Next Time?

Turn the incident into an operational improvement.

Those questions often provide more direction than staring at a wall of green metrics.

Final Takeaways

A green OCI dashboard is useful information.

It is not proof that the application is healthy.

Production availability exists across several layers:

Infrastructure

Processes

Connectivity

Identity

Dependencies

Applications

Business Transactions

A failure in any one of these layers can affect the user.

That means infrastructure teams need to evolve from monitoring individual resources toward understanding services and dependency chains.

The main lessons are:

Follow the transaction, not the server.

Validate dependencies from the consumer's perspective.

Preserve evidence before restarting when circumstances allow it.

Treat identity as a runtime dependency.

Monitor capacity before it becomes failure.

Validate recovery from the user's perspective.

And above all:

Never assume green infrastructure means a green business service.

Conclusion

Users do not consume Compute instances.

They do not consume VCNs.

They do not consume route tables, NSGs, block volumes, or monitoring dashboards.

They consume services.

That changes the way we should think about production health.

The question should not only be:

“Is OCI healthy?”

It should also be:

“Can the user successfully complete the transaction this architecture exists to provide?”

If the answer is no while every infrastructure indicator remains green, the dashboard isn't necessarily wrong.

It is simply showing us only part of the system.

That missing part is the Signal Gap.

The objective of mature observability is to make that gap smaller until infrastructure telemetry, application behavior, and business reality tell the same story.

Monitor the infrastructure. Understand the dependencies. Follow the transaction. Validate the service.

About the Author

João Teixeira
Oracle ACE Apprentice
Oracle EPM & OCI Infrastructure Specialist
JLTDS Oracle Tech

I share practical content around Oracle Cloud Infrastructure and Oracle EPM, with a focus on enterprise architecture, infrastructure operations, troubleshooting, observability, resilience, security, and lessons that can be applied to real production environments.


Comentários

Postagens mais visitadas deste blog

Oracle Essbase 21c Production Readiness Assessment: What I Check Before an Environment Goes Live

I Broke My OCI Environment on Purpose

OCI Landing Zone Blueprint