← Back to Projects

Observability: Noise, Gaps and Blind Spots

Three investigations where monitoring was misleading the people who relied on it

Platform: APM + log management
Workloads: AKS, Functions, VMs
Focus: Signal quality
Role: Investigator

Overview

Observability only helps if the signal is right. These three cases each found a different way monitoring was misleading people: too much noise, data in the wrong place, and an average hiding the thing that was on fire.

Case 1: A Health Check Flooding the Logs

Symptom. A production service's most frequent transaction was a 404. It had been returning 404s, and never a success, for weeks, through many redeploys.

  1. Traced the caller: a function's health endpoint fetched an API documentation file from that service on every call, with no caching.
  2. Predicted the request rate from probe intervals × replicas. The measured rate matched exactly.
  3. Proved the route didn't exist in production: the docs route was switched off by the same flag as Swagger.
  4. Found the path hard-coded in a shared client library, so no configuration change could move it.

Impact. It was the single largest source of volume in that log partition, and its sub-millisecond responses skewed the service's latency percentiles. Fix: point the check at the service's real liveness endpoint.

The tempting wrong fix

Making the health endpoint return 503 when "Degraded" would fail every probe and send every pod into a restart loop, all over a documentation file.

Side finding: a tagged request proved a non-production service was calling a production backend because of a copied configuration value.

Case 2: Millions of Dev Logs in the Wrong Place

Symptom: "Please enable logging for dev." Reality: logging already worked, at millions of records a day from dozens of services. Every environment had its own log partition except dev, so dev logs landed in the default partition and never appeared in the picker.

Case 3: "Half Full" on a Full Disk

Symptom: a database VM's disk alert showed about 50% used. Reality: the metric averaged across all mounts, including a large temporary disk. The data volume itself was effectively 100% full and still growing every day.

alert per mount, not on the average (illustrative)
SELECT max(diskUsedPercent) FROM StorageSample
WHERE hostname LIKE '%db%' FACET mountPoint

Key Outcomes

Lessons Learned

Conclusion

Good observability isn't more data. It's knowing which numbers to distrust, and checking them.

Technologies Used

APMLog ManagementData PartitionsNRQLKubernetes ProbesAzure FunctionsASP.NET CoreHelm

About this case study: this write-up is drawn from my hands-on platform engineering experience. Organisation names, system names, figures and timelines have been changed or generalised, and all code, configuration and queries are illustrative examples written for this page.

← Certificate and Secret Lifecycle at ScaleMoving Central Logging to a New Region →
← Back to Projects Get in Touch