Executive brief · Infrastructure program

One AZ took the platform down.
We rebuilt for resilience you can prove — and cut the monitoring bill to zero licences.

A unified observability & resilience program for 2,000+ customers across three regions: replace poll-only SolarWinds with a self-hosted Prometheus + Grafana stack, make zone failure a shrug instead of an outage, and fix the ServiceNow change automation that keeps missing “Implementing.” Built as code, documented by itself.

2,000+
Customers protected
3
Regions · EU / BR / CN
15 min
Old poll blind-spot
$0
Monitoring licences
~$130k
Net saved / yr*

*Modeled midpoint of documented ranges — see The Money. Every figure carries a [validate with finance] flag, mirroring the source plan.

01 / Why now

Three failures, one root cause: we couldn’t see risk, and we couldn’t survive it.

The AZ1 outage wasn’t bad luck — it was a design we never chose on purpose, invisible to a monitoring tool that only polls every 15 minutes, wired to a change process that branches on free text. Each is fixable; together they’re the program.

Failure 01● Outage

Tier-1 pinned to a single zone

In West Europe, tier-1 workloads lived entirely in Availability Zone 1 — one fault domain. AZ1 had a platform event and everything went hard-down until manual rebuild. A zone-capable region gives you three zones; we were using one.

Failure 02● Blind spot

SolarWinds: poll-only, per-element, shallow

100% SolarWinds, 15-minute polling, no webhooks, per-element licensing that rises every year, and thin depth on Kubernetes, Azure and network flow. It never surfaced the zone-affinity risk behind the outage.

Failure 03● Broken automation

ServiceNow branches on free text

Change automation keyed off typed status (“Implementing”, “impl”, typos) and record names. Free text can’t be matched deterministically — changes get mis-routed or missed, and renames create duplicates.

02 / The stack

One design, deployed identically per region.

A self-hosted kube-prometheus-stack on AKS: exporters feed an HA Prometheus pair that fans out to alerting, dashboards and long-term storage. No managed/self-hosted split — because Azure Managed Prometheus & Grafana don’t exist in China (21Vianet).

SCRAPE TARGETS · PER REGION node_exporter VMs · on-prem hosts snmp_exporter switches · routers · fw blackbox_exporter HTTP · TCP · ICMP probes azure-metrics-exporter Azure Monitor · per sub kube-state-metrics + cAdvisor · workloads Prometheus HA pair · scrape · rules recording + SLO burn-rate Alertmanager route by owner → on-call / Teams Grafana (OSS) Entra-ID SSO · per-team folders Thanos / remote-write long-term object storage alert = <service>-<severity>-<symptom> → runbook link
Naming convention carried over from SolarWinds so every runbook cross-link survives the migration. Migration is parallel-run: stack goes up alongside SolarWinds, cut over per service, decommission SolarWinds last.
03 / Data residency

Three regions, three sets of rules — enforced by topology, not policy PDFs.

China isn’t “another region,” it’s another cloud. The architecture makes the residency boundary physical: metrics can only aggregate where the law allows.

EU West Europe● Global Azure

EMEA · primary

Full stack on AKS. May hold a read-only Thanos view of Brazil aggregates. Primary dashboards and alert routing.

  • Full kube-prometheus-stack
  • Read-only cross-view of BR
Brazil South● LGPD

Brazil · in-region

Full stack on AKS. Metrics stay in-region under LGPD — only non-sensitive aggregates may leave to EMEA.

  • In-region retention
  • Aggregates-only egress
China North 3● 21Vianet · isolated

China · sealed cloud

Fully isolated full stack — own Grafana, own identity. No cross-border scraping or querying, ever. Never point a Global-Azure Prometheus at China.

  • Zero cross-border telemetry
  • Residency sign-off before rollout

On-prem & small offices ship exporters to the nearest regional Prometheus, egress limited by network policy. This is also why managed SaaS (Datadog / Grafana Cloud) was rejected — cost at 2,000+ elements plus residency/egress conflicts with China and LGPD.

04 / The AZ1 fix

Zone failure should be a shrug, not an outage.

ADR-0001 makes zone-redundancy mandatory for tier-1 — and the Terraform refuses to deploy a single-zone tier-1 resource. The fix lives in code, not in a wiki nobody reads.

BEFORE · what happened ● Single fault domain
Zone 1
tier-1 api
postgres
ingress LB
Zone 2
— empty —
Zone 3
— empty —
AZ1 event → 100% tier-1 down. No capacity in surviving zones. Recovery = manual rebuild.
AFTER · ADR-0001 enforced ● Survives one zone loss
Zone 1
tier-1 api
pg standby
Zone 2
tier-1 api
pg primary
Zone 3
tier-1 api
LB endpoint
AZ1 event → degraded, not down. topologySpread + PDB keep quorum; ZRS + zone-redundant HA carry the data plane.
Compute

AKS user nodepools span zones [1,2,3] · topologySpreadConstraints + PDB tolerating one-zone loss.

Data

Managed disks on ZRS · PostgreSQL Flexible Server zone-redundant HA (primary + standby in different zones).

Network

Standard, zone-redundant Load Balancer & public IPs · no zonal single point of ingress.

Enforced

modules/aks fails the Terraform plan if a tier-1 resource has < 2 zones. Plus a Prometheus alert for any single-zone tier-1 workload.

05 / ServiceNow fix

Stop reading the label. Read the state.

Automation now branches on ServiceNow’s structured choice fields — state and approval — keyed on the immutable sys_id. Renames become updates, not duplicates. ServiceNow stays the system of record; we only consume the read side.

−5
New
−4
Assess
−3
Authorize
−2
Scheduled
−1
Implement
0
Review
3
Closed
4
Canceled
The one rule

if approval == "approved" and state == −1 (Implement):
  → draft/update runbook /30-runbooks/change/<number>.md
elif state in (3 Closed, 4 Canceled): → close draft
else: → hold pending, no publish

Why it broke before

The old check parsed the typed status text and keyed on record name. “Implementing” arrived as “impl”, “in progress”, or a typo — so the real signal (state == −1) was missed, and renames spawned duplicates.

Detection is unchanged and belt-and-braces: a real-time Business Rule → n8n webhook, plus a nightly reconciliation querying sys_updated_on to catch anything missed.

06 / Documented by itself

Every alert, node and change writes its own page — behind a pull request.

The same events that drive monitoring and change flow also draft the wiki. AI drafts; humans merge. Nothing publishes without review, and every generated page cites its source.

Event sources Prometheus · ServiceNow Service Bus docs.changes topic n8n router HA on AKS AI drafter front-matter + citation Pull request owner review → publish PR-GATED · AI DRAFTS, HUMANS MERGE · ROLLBACK = git revert
Generated pages live only under /_generated (a CI hand-edit guard enforces it); a nightly drift report catches divergence from upstream. Reuses the existing adapter → bus → drafter pipeline, not a new framework.
07 / The money

Zero licences, ~$130k a year back, and a full-region outage taken off the table.

Like-for-like on monitoring: we stop paying SolarWinds and stand up OSS on our own AKS. Resilience is a separate, deliberate investment — and one avoided AZ-class outage dwarfs it.

ANNUAL MONITORING COST · USD · midpoint of documented ranges
$62k $125k $187k $250k $0 SolarWinds today $185k licence + support · per-element · range $120k–$250k Prometheus + Grafana $55k compute $45k + storage $10k · $0 licence · range $35k–$75k ≈ $130k / yr saved
SolarWinds licence Compute Storage Net saving
THE VALUE STACK · per year
SolarWinds licence eliminated+$185k
New OSS monitoring run cost−$55k
Auto-docs toil removedsoft $
NET RECURRING SAVING
~$130k /yr

Range $45k–$215k. Net-positive from year one once the parallel-run window closes.

Resilience investment — priced separately

Zone-redundancy adds $20k–$50k/yr (≈2–3× data-plane footprint on tier-1 + cross-zone transfer) and ~0.5–1.0 FTE of run effort, offset by IaC + auto-docs.

What it buys: a single AZ1-class tier-1 outage across a 2,000-customer B2B estate is six-to-seven figures in SLA credits, churn and trust. The uplift is a rounding error against one outage — it applies to tier-1 only; dev & ephemeral are exempt.

Line itemTodayProposed
Monitoring licence + support$120–250k$0
Monitoring compute (3 regions + dev)incl.$30–60k
Metrics storage / long-termincl.$5–15k
Zone-redundancy uplift (tier-1)$0$20–50k
Ops effortvendor + admin0.5–1.0 FTE
Net recurring · monitoring only≈ −$130k

Method: every figure is the documented order-of-magnitude range from the source plan (§4); the “midpoint” columns are ours for the deck. Zone-redundancy and FTE are shown as a distinct resilience line, not folded into the monitoring saving. All figures carry a [validate with finance] flag — confirm the SolarWinds contract exit terms and the parallel-run window before quoting leadership.

08 / Security & compliance

Residency is architecture. Access is least-privilege. AI never publishes on its own.

Residency

China stays in China

21Vianet stack is fully isolated — no cross-border scrape or query. Brazil metrics stay in-region under LGPD; only aggregates leave.

Identity

Entra-ID SSO + RBAC

Grafana behind Entra-ID with per-team folders. Key Vault is RBAC, purge-protected, private-endpoint only. Secrets never in code.

Change safety

PR-gated everything

AI drafts are pull requests with owner-routed reviewers; low-confidence work is labelled needs-sme. Rollback is git revert.

Data protection

Classified + ACL-trimmed

Every page has a classification field; ACL trimming, secret-scanning and PII redaction run in the adapters before anything reaches the wiki or RAG index.

Private networking

Private endpoints by default

Postgres, Redis, Service Bus, AI Search and Key Vault on private endpoints; Log Analytics diagnostic settings on every resource.

No new SPOFs

The monitoring can’t be the outage

Prometheus HA pair + n8n HA on AKS, all zone-redundant per ADR-0001 — so the observability stack survives the failures it watches for.

09 / Delivery

Twenty weeks, dev-first, SolarWinds retired last.

Terraform stands up a zone-redundant AKS + monitoring dev platform in West Europe first — proving the AZ1 fix and the SolarWinds replacement before a single production cutover.

WEEKS 1–2
Dev platform
Terraform: zone-redundant AKS + monitoring in dev. Proves the fix.
WEEKS 3–6
EMEA parallel-run
Prometheus beside SolarWinds. Exporters via Ansible/AWX. Core dashboards.
WEEKS 7–10
Depth + integrations
Network + Azure exporters. ServiceNow fix live. Single-zone alert.
WEEKS 11–16
Brazil + China
BR rollout. CN fully isolated in-region stack. Residency reviewed.
WEEKS 17–20
Cutover + auto-docs
Per-service cutover. Auto-docs live. Decommission SolarWinds last.
ONGOING
Continuous improve
SLOs, drift reports, dashboard & runbook feedback loop.
10 / Decisions we need

What we’re asking leadership to green-light.

01
Adopt zone-redundancy as a tier-1 standard (ADR-0001)
IaC-enforced; single-zone tier-1 deploys fail the plan. Accept the ~2–3× tier-1 data-plane uplift as the price of surviving a zone.
02
Approve the SolarWinds → Prometheus migration (ADR-0002)
Parallel-run, per-service cutover, decommission last. Authorise confirming the contract exit terms with the vendor.
03
Fund ~0.5–1.0 FTE run cost
Offset by auto-docs + IaC. This is the operational cost of owning our own monitoring instead of renting it.
04
Sign off China (21Vianet) data-residency posture
Fully isolated in-region stack, zero cross-border telemetry — needs a residency review before rollout.
05
Validate all cost figures with finance
Turn the documented ranges into contracted numbers before this deck goes to the board.