Yar Kravtsov

We Added Monitoring to Everything (Except the Thing That Kept Breaking)

· platform, observability

Production has dashboards. Production has alerts. Production has structured logging, tracing, on-call rotations, and incident runbooks. When production breaks at 3 AM, you can reconstruct the timeline and find root cause.

Your test environment has SSH.

Your CI runners have a re-run button.

Your preview environments have hope.

That is the observability gap in developer infrastructure, and it quietly eats engineering time.

The reasoning that keeps it dark

The logic is simple: production serves customers, so production gets instrumented. Developer infrastructure only affects engineers, so it can be operated by vibes.

I get why this happens. Observability costs money. Eight dollars per committer per month for CI visibility. Per-host pricing for development servers. Log ingestion for systems “only engineers will see.”

When someone proposes monitoring for test environments, the first response is almost always a cost calculation.

But the cost of not instrumenting is also real. It is just harder to see.

It shows up as an engineer spending three hours debugging a build failure that centralized logs would have explained in five minutes. It shows up as a release blocked for half a day because a test environment is unhealthy and nobody can see why. It shows up as a root cause that stays unexplained because the fix worked and everyone moved on.

You pay either way.

You either pay the vendor, or you pay in engineering hours.

The vendor sends an invoice. The engineering hours disappear into the calendar, so the cost feels optional.

It is not.

Blind test environments

A test environment goes unhealthy. How does the team find out?

Not from an alert. Not from a dashboard.

From a failed deploy, or a QA engineer asking in Slack whether staging is broken.

Someone SSHes into the host. They grep logs. They find a proxy routing to a container that no longer exists because the container restarted and got a new IP. Or they find a service that OOM-killed silently. Or a config value that was wrong.

The information existed in container logs, system metrics, and process state.

Nobody collected it.

The same failure in production would have triggered an alert, surfaced a dashboard, and been resolved in minutes. In test, it takes hours. Not because the problem is harder. Because the diagnostic path is manual every time.

The annoying pattern is predictable: everyone agrees log aggregation should exist in the test environment. It goes on the roadmap. The quarter ends. Priorities move. Three months later, the same debugging marathon happens again, and someone says “we should really add log aggregation to test.”

Around we go.

Silent CI runners

A CI runner dies mid-job. The job fails. The engineer sees “runner unavailable” or “process exited unexpectedly.” They click re-run.

Maybe it works.

Maybe it does not.

What happened? Out of memory? Spot instance reclaimed? Scaling policy terminated it mid-job? Disk full? Network partition? Kernel panic?

You do not know. You will never know. There is no runner-level observability.

You know the symptom: job failed. You do not know the cause. Since re-running often works, nobody investigates. The failure becomes background noise.

“Sometimes CI fails, just re-run it.”

That sentence represents a depressing amount of engineering time.

Over time, this becomes a vibe: CI is flaky. But nobody can say how flaky, why, or whether it is getting worse. The data was never collected.

You are operating build infrastructure on feel. In 2026. What a concept.

The debugging marathon

This is the expensive pattern: multi-hour investigations where most of the time is spent collecting information that should have been available immediately.

A feature does not work in preview. The engineer checks application logs. They look fine. They check infrastructure. A dependent service is not starting. They try to inspect that service’s logs, but there are no aggregated logs in this environment.

So they get shell access to the container. Read raw logs. Find a missing environment variable, refused connection, or unmet startup dependency. Fix it. It works.

Total time: half a day.

Time the fix took: five minutes.

Time spent finding the information: everything else.

That ratio tells you what is broken. The problem was not hard. The observability to find it did not exist.

Some teams respond by building diagnostic scripts: a bash runbook that checks the ten common failure modes and prints the first one it finds. Ugly? Yes. Effective? Also yes.

But that script is also an admission. The environment is too opaque to debug by observation alone. The script exists because the observability does not.

What this costs

Do rough math.

Take your engineering team. Count hours per week spent debugging infrastructure issues: CI failures, test environment problems, preview environment mysteries, build system surprises. Not application bugs. Infrastructure friction.

For a team of 30 to 50 engineers, this can easily land between 10 and 40 hours per week.

At the low end, that is a quarter of an engineer. At the high end, it is a full-time engineer, every week, all year, manually diagnosing problems tooling should have explained.

Now compare that to tooling cost. The tool costs $8 per committer per month. The engineer costs $15,000 per month.

You are choosing the expensive option and feeling frugal about it.

Start with logs, not metrics

Metrics are good for dashboards and alerts. But when an engineer is debugging a broken environment at 4 PM on Thursday, they usually need logs.

Structured, searchable, centralized logs.

Not kubectl logs piped through grep. Not an SSH session to a host where logs may already be rotated away.

Most log aggregation systems support short retention tiers for non-production. Seven days of searchable logs from test and preview environments costs a fraction of the production log bill and covers most debugging sessions.

Instrument CI at the runner level

Your CI system tells you which jobs passed and failed. It usually does not tell you why a runner was slow, why it died, or what resource pressure looked like during the build.

Runner-level metrics, CPU, memory, disk, network, piped into your existing monitoring stack let you answer “why was this build slow?” without guessing.

If your runners are cloud instances, this data probably already exists. You just need to collect it.

This is one of the best low-effort observability wins available to a platform team.

Build diagnostics for common failures

Not everything needs a dashboard.

Sometimes the best move is a script that checks the ten common reasons a preview environment is broken and reports the first real problem.

This work is unglamorous. It is also the difference between “debug for two hours” and “run the check, see the answer, fix it in five minutes.”

Every failure mode encoded into diagnostics is a failure mode that stops wasting someone’s afternoon.

That is a good trade.

Make the cost visible

The observability gap survives because its cost is invisible.

Make it visible.

Track hours spent on infrastructure debugging. Flag incidents where root cause was “we could not see what was happening.” Report CI flakiness rates and mean time to diagnose.

Once a manager can see “we lost 35 engineering hours this month to blind infrastructure,” this stops being a nice-to-have. It becomes an ROI calculation.

ROI calculations get funded.

The principle nobody wants to say out loud

We agree that operating production without observability is negligent.

No alerts, no dashboards, no structured logging? For a customer-facing system? Unacceptable.

But the same teams operate CI runners, test environments, preview environments, and build systems almost completely blind, then call it cost control.

The argument is identical in both places: you cannot operate what you cannot see.

The only difference is who pays.

In production, customers pay. In developer infrastructure, engineers pay in hours, frustration, and lost trust in the tools they depend on.

The question is not whether you can afford observability tooling.

The question is whether your engineers’ time is worth instrumenting for.

Based on how most organizations behave, the answer is apparently no.

That is expensive in ways that never show up on an invoice.