Case study · A global consumer-health company
Self-service observability for a consumer-health company
We built a self-service observability platform on Azure for a global consumer-health company and rebuilt its order-to-cash alerts, which had not opened a genuine incident in 30 days.
At a glance
- Sector
- A global consumer-health company
- Duration
- April 2026 to October 2026
- Our role
- observability engineer embedded in the client's platform team
- Team
- TQM Invest, one observability engineer, with the client's platform, ITSM and integration teams
- New Relic
- NRQL
- NerdGraph
- Terraform
- Azure Functions
- Azure Key Vault
- Azure Policy
- GitHub Actions
- Python
- ServiceNow
Headline results
- An ITSM token that lived 1,799 seconds against a planned weekly refresh, caught before go-live. Our relay then ran 1,284 times in 17.8 days in September 2026, every run healthy.
- Six order-to-cash alerts rebuilt after 30 days without a genuine incident. By our records they have fired on real failures since September 2026.
- A planning-system feed that dropped about 1,500 rows per cycle now reads its tables whole.
- A first measured figure for marketplace order to ERP sales order, a number the business had never had.
The situation
The company was consolidating its monitoring onto one New Relic account. Azure resources, virtual machines and container apps were the easy part, since standard agents and integrations cover them.
The business ran on SaaS products as well: a data-integration platform, a supply-chain planning system, a marketplace order hub and an ITSM tool. None had a native integration. A team that wanted to know whether its nightly feeds ran had no good option.
An ingestion repository existed when we joined, with a minimal bootstrap and a first few integrations. Working inside the client's platform team, we built the self-service platform on it, then the integrations, the alert repairs, the ITSM routing and the dashboards.
All work ran in a managed virtual desktop behind a corporate proxy, against production systems owned by other teams with their own change calendars.
What we did
Rules before data
Before any data flowed we agreed the ground rules with the platform lead. Every Terraform-managed resource carries five tags (environment, service, owner, cost center, tier), and Azure Policy enforces the contract. Monitoring follows tags, never pasted entity IDs. Ingest keys and control-plane keys stay apart. Baseline alerts live as Terraform in a governance repository, custom alerts go through a request with a named approver, and New Relic holds the alert state, with the ITSM tool following it.
A platform teams can use without seeing a key
A team adds one entry to a Terraform map and one code folder. Each entry becomes its own resource group, Key Vault, storage account, Function App and managed identity. Variables hold secret names only, rendered as Key Vault references, so no secret value reaches git, variables or state. The platform's ingest key sits in a separate vault that no team identity can read.
A simplified version of the pattern, with placeholder names:
# Teams name their secrets; only references reach app settings and state.
integrations = {
orders-feed = { secrets = { "orders-api-key" = "ORDERS_API_KEY" } }
}
app_settings = merge(
{ "INGEST_KEY" = "@Microsoft.KeyVault(SecretUri=${var.platform_vault_uri}secrets/ingest-key/)" },
{ for name, setting in each.value.secrets :
setting => "@Microsoft.KeyVault(SecretUri=${module.team_vault[each.key].uri}secrets/${name}/)" },
)
A second tenant of an existing integration is a second deployment entry pointing at the same code, and every record carries its source environment so production dashboards never count test rows. Code deploys only after a successful infrastructure deploy, and it checks out the commit that triggered it.
Pollers that prefer a duplicate to a gap
Every integration follows one poller template. It advances its checkpoint only after a successful send, because a duplicate shows up in a query and a gap does not. It checks response shape and content type rather than trusting the HTTP status, since one vendor answered a bad session with its sign-on page and a 200.
The supply-chain planning system was mapped through a probe harness that refuses, before sending, any request not on a read allowlist, because the same API can delete planning data. The monitoring model built from that sweep exposed a production bug: the feed's row cap defaulted to the API's page size, and one table was larger than a page, so rows were dropped every cycle. We separated the page size from the ceiling and deployed the fix.
An ITSM integration whose token lives 30 minutes
The client required OAuth for alerts flowing into ServiceNow, and New Relic's webhook destination stores a static header. We built a relay on the platform: an Azure Function that mints a token and writes it into the destination. The design document implied 100 days. We measured the access token at 1,799 seconds; the 100 days belonged to the refresh token. The planned weekly schedule would have left routing dead for most of every week, so the relay runs every 20 minutes and records an audit event on every run.
The first live delivery failed with a 401. We first advised dropping OAuth for an API key, then withdrew that the same day when one token got a 200 from two table endpoints and a 401 only from the integration's endpoint. The cause was one access policy, which the ServiceNow team changed. We then agreed the incident payload with them over nine live test issues, since every incident had been landing at priority 5 with raw JSON as its description. The method is in the article linked below.
Alerts that could not fire
The order-to-cash policy behind a business-flow view had six conditions, and all six shared one defect: one-minute windows, empty windows filled with zero, and a five-minute "all windows" term against data that arrives every five minutes or once a day. None opened a genuine incident in 30 days. A repair made earlier in September had been recorded as confirmed on the strength of the preview chart.
We measured 7 to 30 days of each signal, then reshaped all six over NerdGraph from a script in git: windows matched to each feed's cadence, current state read from a gauge, and loss-of-signal paired with any last-value fill so a dead feed raises an alert. Where failure is the baseline we alert on missing success. One flow fails most of its runs by design, so its condition became "no successful acknowledgement in 4 hours".
Results
The relay ran 1,284 times between September 3 and 21, 2026, every run healthy, with no failed destination write. In the seven days to September 29, 34 of 34 deliveries to the development instance succeeded, and incident priority now follows alert priority. By our records, the rebuilt order-to-cash alerts have fired on real failures since September 2026. The planning feed reads its tables whole.
We also built nine production dashboards and two business-flow views. One query on the order dashboard answered a question the business had no number for: how long a marketplace order takes to become an ERP sales order.
Related reading
Go deeper
Standalone write-ups of the methods in this study.
Keeping an ITSM integration alive when its token lives 30 minutes
When your alerting tool stores a static header and your ITSM system issues 30-minute tokens, a small relay keeps incidents flowing, provided you measure the token and make the relay report its own failures.
Alerts that can never fire: judge by the evaluator, not the preview
Before changing the threshold on an alert that never fires, read the evaluator's own records, because the signal's shape or its routing is the more common cause.
Related case studies
Our own infrastructure
How we run our own infrastructure as code
We rebuilt the pipeline for our own Terraform estate so that a merge only ever produces a plan, and every apply, destroy check included, works on the plan file we reviewed.
Four near-duplicate CI workflows (about 1,240 lines) replaced by one caller and one reusable stack workflow, and no stack applies on merge.
- Terraform
- GitHub Actions
- AWS (OIDC)
- Cloudflare
- New Relic
A global industrial manufacturer
Three years running a manufacturer's hybrid estate
We measured that 95% of an industrial manufacturer's monitoring tickets closed themselves, then moved its monitoring to New Relic in a way that cut redundant alerting by about 80%, by our records.
About 650 monitoring tickets in 30 days, 95% closing themselves and none resolved at first line: the baseline we measured before the move.
- New Relic
- Zabbix
- ServiceNow
- AWS
- Azure
Our own product
Empty runs and correct billing for pay-per-result scrapers
We built a small shared kit that makes our paid scraping jobs fail with a plain reason when they deliver nothing, and it found a latent defect in every job that adopted it.
A shared zero-row guard, adopted by five actors, surfaced a latent defect in each one, including a default configuration that returned 0 rows instead of 25 and a partial block that threw away 245 fetched rows.
- TypeScript
- Node.js
- Python
- Apify SDK
- Crawlee
Running into something like this?
Thirty minutes, no commitment. Bring the problem; we will tell you what we would check first and whether we are the right people for it.
Related services:Observability