Home / Invisible Cost Failures

Invisible Cost Failures: How Healthy Systems Burn Money for Years

Nothing was broken. Nothing alerted. The damage kept accumulating.

TL;DR

Cost failures stayed invisible because systems were healthy. Nothing was broken. SLAs were met. No incidents occurred. Teams interpreted stability as correctness. Success itself masked failure. This is what we saw.

  • No alert fired because utilization metrics reassured instead of warned - averages hide accumulation, "low usage" doesn't trigger action
  • Utilization metrics lied - percentiles and averages masked the growing waste over time
  • Reliability patterns amplified waste - high availability everywhere, autoscaling, retries, over-provisioning made waste less visible, not more
  • Nothing forced reconsideration - infrastructure decisions became permanent, no forcing function existed to re-question them
  • Cost accumulated quietly - monthly billing cycles delayed urgency, signals lagged behind reality
  • The accumulated cost was evidence of the pattern - fixes were straightforward, the blindness was not

For examples of invisible operational failures, see our HAProxy pillar guide. For how monitoring signals lie and how automation amplifies blindness, see our production operations guides.

Nothing Was Wrong - And That Was the Problem

We operated a system where everything appeared to be working correctly. Uptime was high. Response times were acceptable. Error rates were low. Customers weren't complaining. Dashboards showed green. Alerts weren't firing. SLAs were met. No incidents occurred.

This was the problem. Systems were healthy, so teams interpreted stability as correctness. When nothing breaks, there's no forcing function to question assumptions. Why would you change something that's working? Why would you optimize something that appears healthy? This is what we saw. This is what happened.

Approximately $550,000 USD per year was being spent unnecessarily. Not on failed experiments. Not on over-engineering. Not on obvious mistakes. On infrastructure decisions that felt reasonable at the time and never got revisited because nothing indicated they should be. Operational health signals showed everything was fine.

We've seen this pattern across multiple organizations. Systems that appear healthy prevent reevaluation. The absence of problems becomes the problem. Teams slowly lose the ability to see cost because operational health signals don't indicate cost efficiency. Success itself masks failure. This happens to competent teams.

The Core Issue:

Operational health metrics measure system behavior, not cost efficiency. When systems are "healthy" by these metrics, cost failures remain invisible. Stability becomes the enemy of optimization because it removes the forcing function to question assumptions.

The Pattern: Resources Once Created Were Never Revisited

This is the root cause. Infrastructure decisions, once made, became permanent because no forcing function existed to re-question them. Cost accumulated quietly over time, invisible to teams focused on operational health.

A resource gets created. Maybe it's a Kubernetes cluster. Maybe it's an EC2 instance running Spark jobs. Maybe it's an EFS mount point chosen for convenience. At the time of creation, the decision feels reasonable. There's urgency to ship. There's pressure to move fast. The cost seems acceptable relative to the immediate need.

Months pass. The resource continues running. It's not causing problems. It's not breaking anything. Utilization metrics might show it's underused, but utilization metrics measure operational health, not cost efficiency. They don't tell you if the resource was necessary in the first place, or if a cheaper alternative would work.

Years pass. The original engineer who created the resource has moved on. The context for why it exists is lost. Nobody questions it because it's working. The monthly bill includes it, but individual line items don't stand out. The cost has become normalized as "the cost of infrastructure."

This pattern repeats across dozens of resources. Each one feels small. Each one feels reasonable. But together, they accumulate. And because nothing is broken, because no alert is firing, because the system appears healthy, nobody notices. The absence of problems becomes the problem.

Infrastructure decisions became permanent by default. The absence of a forcing function to revisit them meant they persisted. This happens to competent teams operating healthy systems. It's a system behavior, not negligence.

Where the Blindness Manifested

Here are concrete examples of where the blindness manifested. Each felt reasonable at the time. Each passed without challenge because operational health signals indicated everything was fine. No signal indicated a cost problem.

CPU Over-Requesting in Kubernetes

Pods requested CPU resources based on "safety" rather than reality. Kubernetes schedulers allocated nodes based on these requests, not actual usage. Average utilization looked reasonable - 40% across the cluster. But that average hid a different reality.

Most pods were using 10-15% of their requested CPU. A few pods were using 80-90%. The average looked fine. But nodes were being provisioned based on the sum of requests, not the sum of actual usage. We were paying for capacity we weren't using, but utilization metrics reassured us because the average looked healthy.

Why it felt reasonable: Over-requesting prevents CPU throttling. It's safer to request too much than too little. No engineer wants their service to be throttled because they under-requested resources. This is standard practice.

Why no signal challenged it: Utilization metrics showed averages that looked fine. Kubernetes doesn't alert when pods are over-requesting resources because over-requesting doesn't cause operational problems. The scheduler allocates nodes based on requests, and nodes run successfully. Nothing breaks, so nothing triggers review. The system appears healthy.

Bursty Analytics on EC2 Instead of Serverless

Analytics workloads ran on EC2 instances that stayed running 24/7. The workloads were bursty - heavy usage for 2-3 hours per day, idle the rest of the time. EC2 instances remained running to avoid cold starts.

The workloads were perfect candidates for serverless execution. They were stateless. They processed data in batches. They didn't require persistent connections. But they ran on always-on EC2 instances because "cold starts are slow."

Why it felt reasonable: Avoiding cold starts is important for user-facing services. The pattern of using EC2 for analytics felt natural. Serverless felt risky for "important" workloads.

Why no signal challenged it: EC2 instances showed utilization - 20% average CPU. But averages hide burstiness. The instances were running most of the time doing nothing, but utilization metrics averaged over 24 hours looked reasonable. Monitoring systems alert when utilization is high, not when it's low. Low utilization is interpreted as "capacity headroom," not "potential waste." No alert fires for "instances that could be serverless" because the instances aren't broken.

Spark on EC2 Instead of EMR Serverless

Spark jobs ran on EC2 instances managed by a data engineering team. The jobs processed large datasets. They ran on-demand when triggered. The EC2 instances were provisioned with significant resources to handle peak workloads.

EMR Serverless would have handled the same workloads at approximately 90% lower cost. The jobs were already containerized. They didn't require persistent state between runs. They were perfect candidates for serverless execution.

Why it felt reasonable: EC2 gives control. You can tune instances. You can debug issues directly. The data engineering team had expertise in managing Spark on EC2. Moving to serverless felt like giving up control.

Why no signal challenged it: The EC2 instances showed utilization during job runs. But utilization metrics don't capture the cost delta between EC2 and EMR Serverless. The monthly cost was high, but it was normalized as "the cost of running Spark." The jobs ran successfully. The instances performed well. No alert fires for "workloads that could use a cheaper compute model" because the current model works. Operational health signals don't indicate cost efficiency.

EFS Chosen for Convenience Over Locality

EFS mount points were chosen for shared storage across multiple EC2 instances. The use case didn't require the durability or multi-AZ features of EFS. Local storage or instance stores would have sufficed.

EFS was chosen because it was convenient. It mounted easily. It worked across availability zones. It required no management. The performance characteristics were acceptable for the workload.

Why it felt reasonable: EFS is the "easy" solution for shared storage. It requires no management. It works everywhere. The convenience outweighed the cost premium.

Why no signal challenged it: EFS costs are part of the monthly bill. But they're a line item, not an alert. The performance was acceptable. The durability was appreciated. The system worked. There was no signal that a cheaper alternative would work just as well because the current solution wasn't broken.

S3 ListBucket Over ~27M Objects Growing Monthly

An application used S3 ListBucket operations to discover objects. The bucket contained approximately 27 million objects and was growing monthly. ListBucket operations became increasingly expensive as the object count grew.

The application could have used object tagging, prefixes, or a database to track object locations. But ListBucket was simple. It worked. It didn't require additional infrastructure.

Why it felt reasonable: ListBucket is simple. It's a single API call. It requires no additional infrastructure. The cost per request seemed small.

Why no signal challenged it: S3 request costs accumulate slowly. Each ListBucket operation is inexpensive. But over 27 million objects, the cost grows. Monthly billing shows the total, but there's no alert for "S3 operations that scale poorly." The cost grows gradually, so it doesn't stand out as a problem. The application works. The operations complete successfully. Operational health signals don't indicate that the approach scales poorly from a cost perspective.

OpenSearch + RDS Clusters Duplicated Across ~10 Environments, Used 1–2x/Month

OpenSearch and RDS clusters were provisioned in approximately 10 environments. Most environments used these clusters 1-2 times per month. The clusters ran 24/7, incurring costs continuously.

These were development and staging environments. They didn't require high availability. They didn't require persistent clusters. They could have been created on-demand or shared across environments.

Why it felt reasonable: Each environment needed its own data store. Developers needed isolated environments. Provisioning full clusters felt like "doing it right."

Why no signal challenged it: The clusters showed low utilization, but utilization metrics don't capture "resources that are rarely used." Each cluster cost seemed reasonable in isolation. The cumulative cost across 10 environments was significant, but no alert fires for "resources used infrequently." The clusters work when needed. They're available when developers need them. Low utilization is expected for non-production. Operational health signals don't indicate that the provisioning model is wasteful.

Full HA in Sandbox and Pre-Prod with ~0% Utilization

Sandbox and pre-production environments were provisioned with full high availability configurations. Multi-AZ deployments. Automated failover. Redundant components. These environments had approximately 0% utilization most of the time.

These environments didn't require high availability. They were for testing and development. Downtime was acceptable. Single-AZ deployments would have sufficed.

Why it felt reasonable: Production uses HA, so pre-production should too. It ensures testing matches production. It feels "professional" to have HA everywhere.

Why no signal challenged it: The environments showed 0% utilization, but that's expected for non-production. No alert fires for "non-production resources that don't need HA." The cost is normalized as "the cost of proper environments." The environments work. They match production architecture. Operational health signals don't indicate that the HA configuration is unnecessary for these environments.

Snowflake Business Critical Tier Without a Real Failure-Driven Need

A Snowflake data warehouse ran on the Business Critical tier. This tier provides additional availability guarantees and faster failover. The workload didn't have requirements that necessitated this tier.

The Standard tier would have provided sufficient availability for the workload. The Business Critical tier added significant cost without providing corresponding value.

Why it felt reasonable: Business Critical sounds important. The additional availability feels like insurance. The cost premium seemed worth it for "critical" data.

Why no signal challenged it: Snowflake tier costs are part of the monthly bill. But there's no alert for "tiers that exceed requirements." The workload ran successfully, so the tier choice appeared validated. The additional availability guarantees felt like insurance. No signal indicated a lower tier would suffice because the current tier wasn't causing problems.

Why Cost Signals Lag Behind Reality

Cost signals lag behind reality because of how they're measured, how they're aggregated, and how they're presented. Utilization metrics measure operational health, not cost efficiency. They reassure instead of warn because they're designed to indicate system problems, not cost problems.

Utilization metrics show averages over time. A resource that's idle 80% of the time and busy 20% of the time shows 20% average utilization. That looks reasonable from an operational perspective. But it doesn't tell you if the resource was necessary in the first place, or if a cheaper alternative would work. Averages smooth out spikes and valleys. They hide the reality that a resource is mostly idle. They make waste look acceptable because the resource isn't broken.

"Low usage" doesn't trigger alerts because monitoring systems alert when usage is high, not when it's low. Low usage is interpreted as "capacity headroom," not "potential waste." There's no alert for "resources that could be eliminated" because elimination isn't an operational concern when the resource isn't causing problems.

Monthly billing cycles delay urgency. A cost that accumulates gradually doesn't feel urgent. A $500 monthly charge for an unused resource doesn't trigger immediate action. It's normalized over the month. It's just "the cost of infrastructure." Cost signals are lagging indicators. They show what you spent, not what you should have spent. They appear after decisions are made. They don't prevent waste; they document it.

This connects cost blindness to system design, not people. The signals available to teams don't surface waste because they're designed to surface operational health, which is different from cost efficiency. Healthy systems can be wasteful. The metrics that indicate health don't indicate efficiency. This happens to competent teams operating healthy systems. This is one example of a broader class of silent failure patterns - failures that persist because systems appear healthy while behavior degrades.

Key Insight:

Utilization metrics measure operational health, not cost efficiency. A resource can be healthy and wasteful simultaneously. The metrics that indicate "everything is fine" operationally don't indicate "this is optimal" from a cost perspective. This is why cost blindness happens to competent teams: the signals they rely on don't surface waste.

Reliability Patterns That Amplify Cost

Reliability patterns that make systems more resilient also make waste less visible. High availability everywhere, autoscaling, retries, and over-provisioning "for safety" all reduce the visibility of cost problems because they're interpreted as best practices, not potential waste.

High availability patterns provision redundant resources. Multi-AZ deployments. Standby instances. Backup systems. These resources increase resilience, but they also increase cost. And because they're "for reliability," their cost is normalized. There's no signal that asks "does this environment need HA?" because HA doesn't cause operational problems. It prevents them.

Autoscaling provisions capacity based on demand. But autoscaling doesn't optimize for cost; it optimizes for availability. It keeps capacity available even when not needed. It scales up proactively to avoid throttling. This increases cost, but it's interpreted as "smart scaling," not waste, because it prevents operational problems.

Retry logic amplifies load. When requests fail, applications retry. This increases backend load, which increases infrastructure needs. But retries are "for reliability," so their cost impact is normalized. There's no signal that asks "are these retries necessary?" because retries prevent user-facing failures.

Over-provisioning "for safety" increases capacity beyond actual needs. Extra CPU, extra memory, extra instances. This prevents throttling and OOMKills. But it also increases cost. Because it's "for safety," its cost is justified. There's no signal that asks "is this over-provisioning necessary?" because over-provisioning prevents operational problems.

These patterns all make waste less visible, not more. They're interpreted as best practices. Their cost is normalized as "the cost of reliability." They prevent incidents, which validates their existence. But they also prevent cost visibility because operational health signals don't indicate cost efficiency.

This creates a parallel to invisible operational failures. Just as systems can appear healthy while having operational problems, systems can appear reliable while having cost problems. The patterns that increase reliability also decrease cost visibility.

For examples of how operational failures can be invisible, see our HAProxy pillar guide on how healthy systems can have invisible operational problems. The same principle applies to cost: healthy systems can have invisible cost problems.

The $550k Was Not the Lesson

The waste accumulated invisibly. Systems that appeared healthy prevented reevaluation. The fixes were straightforward, but the blindness was not.

The fixes were, in most cases, straightforward. Move Spark workloads to EMR Serverless. Right-size Kubernetes resource requests. Use serverless for bursty analytics. Share non-production clusters. Reduce HA in non-production environments. These aren't complex optimizations. They're straightforward changes.

The blindness was complex. How do you see waste when nothing is broken? How do you challenge assumptions when success validates them? How do you force reconsideration when there's no forcing function? This is what happened. This is what we saw.

The accumulated cost - approximately $550,000 USD per year - represents the cost of not re-examining assumptions. It represents the cost of systems that appeared healthy preventing optimization. It's evidence of the pattern, not a success metric.

The fixes were straightforward. The blindness was not. Understanding how competent teams slowly lose the ability to see cost is the lesson. The savings are incidental - they're just the outcome of addressing the blindness.

The Real Lesson:

Cost optimization isn't about finding waste. It's about maintaining the ability to see waste when systems appear healthy. The fixes are straightforward. The blindness is not. This happens to competent teams operating healthy systems.

How Teams Actually Reduce This Kind of Blindness

This is not about tools. This is about processes and forcing functions. Tools can help, but they don't solve the fundamental problem: how do you force reconsideration of decisions that appear to be working?

Periodic assumption reviews force teams to question resources that appear healthy. Quarterly reviews of infrastructure decisions. Annual "kill the resource" exercises. Regular "why does this exist?" discussions. These create forcing functions that revisit working systems.

Treating non-production differently by design prevents normalizing cost. Non-production environments should be cheap by default. They should require justification for expensive configurations. They should be destroyed when not in use. They should share resources across environments. These constraints force cost consciousness.

Understanding cost as a lagging indicator changes how teams interpret signals. Cost appears after decisions are made. It doesn't prevent waste; it documents it. Teams need to anticipate cost impact before resources are created, not after bills arrive.

Forcing functions that revisit "working" systems are necessary. Automated cost anomaly detection. Budget alerts that trigger reviews. Regular resource audits. "Last touched" tracking that identifies stale resources. These create signals that challenge the status quo.

There's no silver bullet. There's no tool that solves this. There's only the recognition that healthy systems can be wasteful, and the discipline to force reconsideration even when nothing is broken. This happens to competent teams. It's a system behavior, not negligence.

The goal is not to prevent all waste. The goal is to maintain visibility into waste when systems appear healthy. To recognize that stability can mask failure. To understand that this happens to competent teams operating healthy systems.

For more on how automation can amplify blindness, see our HAProxy automation guide. The same principles apply to cost: automation that makes systems more reliable can also make cost problems less visible.

Frequently Asked Questions

Uncomfortable questions about cost blindness

Because nothing was broken. Systems were healthy. SLAs were met. No incidents occurred. Teams interpreted stability as correctness. Success masked failure. Utilization metrics showed averages that looked reasonable from an operational perspective. Monthly billing normalized costs. There was no forcing function to question resources that appeared to be working. The absence of problems became the problem. This happens to competent teams operating healthy systems.

It's a design problem. Tools can help, but they don't solve the fundamental issue: how do you force reconsideration of decisions that appear to be working? Utilization metrics measure operational health, not cost efficiency. Monthly billing cycles delay urgency. Cost signals are lagging indicators. The problem is that healthy systems prevent reevaluation. Tools can surface data, but they don't create the forcing functions needed to challenge assumptions when nothing is broken.

Most teams operating production systems at scale are experiencing some form of this. The pattern is universal: resources created for reasonable reasons, never revisited because nothing is broken, accumulating cost invisibly. The scale varies, but the pattern is consistent. Healthy systems prevent optimization. Stability masks waste. Success validates assumptions. This happens to competent teams. The teams that avoid this are the ones that have explicit forcing functions to revisit working systems, not the ones with the best tooling.

Need Help Identifying Invisible Cost Failures?

Our site reliability engineers can help you identify and address invisible cost failures in your infrastructure. Get expert guidance on cost visibility, assumption reviews, and forcing functions that maintain cost consciousness even when systems appear healthy.

View Case Studies