Reliability · SRE · the sequel to Article 17

SLOs for infrastructure teams whose users are other teams

Infrastructure SLOs fail not because the math is hard but because the user is ambiguous. Define who your consumer is and where your responsibility boundary sits, and the rest is Article-17 mechanics. The reframe that unlocks it: you’re not measuring a service — you’re measuring an interface between teams.

Primer·platform, network & shared-services leads·

Scope: the sequel to “SLOs from scratch” (Article 17), which taught the mechanics — SLI, SLO, error budget, burn rate, dependency math. This one handles the organizational reality that makes infrastructure SLOs genuinely harder than product SLOs, reusing the same hybrid-DNS example one level up. Burn-rate math, multi-tenant observability, and FinOps tiering are referenced, not re-taught.

Article 17 taught the mechanics, and they work. Then you take them to a platform team and they fall apart — not on the math, but on the very first question: whose experience are we measuring? A product team has end users and requests, and one golden signal writes itself. You have fifty internal teams, each pressing on your “service” from a different angle, each with their own SLOs stacked on top of yours. The mechanics still hold. But before any of them help, you have to see that you are not measuring a service at all. You are measuring an interface between teams.

TL;DR — it’s the user, not the math

  • Infrastructure SLOs fail on ambiguous users, not hard math. You’re measuring an interface between teams — name the consumer and draw the boundary first.
  • Define the SLI at your interface, one per capability (DNS resolution, egress, provisioning, pipeline runs). You cannot own an SLO for an outcome three layers above you.
  • Measure only what you control. At the Resolver endpoint, not the client; and your SLO must be looser than your dependency composite — you run on the provider’s SLA plus your own failure modes.
  • Infra SLOs are negotiated and published, not derived. Ask “what do you assume about us today?” (the answer is 100%), publish the real number, and — the principal move — tier it at a chargeback price so the SLO becomes a product instrument.
  • Your consumers can burn your budget. Defend it with per-tenant SLIs and quotas, attribute the burn, and don’t freeze your releases for their runaway.
Part 1The reframe: an interface between teams

Why product-SLO thinking breaks for platforms

Article 17’s mechanics quietly assume a product’s shape: one service, one kind of user, one golden signal. A platform has none of those. Your fifty internal teams each experience your “service” through a different door — one lives or dies on DNS latency, another on terraform apply time, another on NAT throughput. There is no single golden signal to pick; there are as many as there are capabilities you expose. And there’s a second twist a product team never faces: your consumers stack their own SLOs on top of yours. Your reliability isn’t the top of anyone’s stack — it’s an input to fifty other reliability numbers, and a miss you barely notice propagates upward into pages you’ll be blamed for. The reframe that makes the rest tractable: you are not measuring a service. You are measuring an interface between teams.

You measure the interface, not the serviceeach layer consumes the one below · define your SLI at the interface you exposeEnd usersNOT your consumer — three layers upApp teams (×50)your consumers — each presses a different capabilityPlatform / shared services = YOUthe layer you actually measureNetwork teamyour dependencyTelco / AWStheir SLA — the floor you stand onthe interface you exposedefine your SLI hereeach layerconsumesthe one belowconsumers stack their ownSLOs on top of yours — a misspropagates upward
Figure 1 · You sit in the middle of a consumer stack. Define your SLI at the interface you expose — the top edge of your layer — not at an end-user outcome three layers up that you neither control nor can be paged for.

Identify the actual consumer

So the first question isn’t “what’s our SLI” — it’s “whose experience are we on the hook for?” Infrastructure comes in layers, and each layer is the consumer of the one below: the app team consumes the platform, the platform consumes the network, the network consumes the telco. The trap is reaching too far up. You cannot own an SLO for an outcome three layers above you — you don’t control the app’s retry logic or the user’s Wi-Fi, and you can’t be paged for them. Your SLI lives at your interface.

The concrete method: stop saying “the platform” and enumerate the capabilities you expose — DNS resolution, egress connectivity, cluster provisioning, pipeline execution — and treat each as a separately measurable contract. A platform doesn’t have an SLO. It has one per capability, each with its own consumer, boundary, and number.

A platform doesn't have an SLO — it has one per capabilityenumerate the capabilities you expose; each is a separate contractPlatform /shared servicesone team, many doorsDNS resolutionconsumer: app teamsmeasuredat the Resolver endpointSLO99.9% query successEgress connectivityconsumer: all workloadsmeasuredat the NAT / egressSLO99.95% availabilityCluster provisioningconsumer: service teamsmeasuredat the control planeSLOready in < 2 hoursPipeline executionconsumer: dev teamsmeasuredat the pipelineSLOp95 run < 20 minEach has its own consumer, its own boundary, and its own number — measure them separately, publish them separately.
Figure 2 · A platform doesn’t have an SLO — it has one per capability. Each door you expose (DNS, egress, provisioning, pipelines) is a separate contract with its own consumer, boundary, and number.
Part 2Draw the boundary, pick the number

The responsibility boundary

When an app is slow, is it the app, the mesh, the network, or DNS? Everyone points at everyone, and the argument is unwinnable because nobody has a measurement scoped to what they actually own. An infrastructure SLO is only defensible if it measures precisely what you control — and the whole game is choosing the measurement point. Take the hybrid-DNS SLI from Article 17, “query success within 100 ms.” Measure it at the client, and your number folds in the on-prem forwarder and the client’s stub resolver — components you don’t own, whose failures you’ve now signed up for. Measure it at the Route 53 Resolver endpoint, and the number reflects exactly your responsibility and nothing else.

Measure at the boundary you ownthe same DNS SLI as Article 17 — re-anchored to what the platform controlsClientstub resolverOn-prem DNSnot yoursDirect ConnectdependencyRoute 53 Resolverinbound endpointPrivate zonethe answermeasure at the client?includes the forwarder + stubresolver you do NOT ownmeasure at the endpointyour responsibility boundaryYou run on their SLA: keep the SLO looser thanthe dependency composite (Resolver × Direct Connect × on-prem).
Figure 3 · The same DNS SLI as Article 17, re-anchored. Measured at the client it includes a forwarder and stub resolver you don’t own; measured at the Resolver endpoint it captures only what you control. The measurement point is the boundary.

Two consequences follow. First, shared fate: you run on top of AWS’s SLA, so your SLO must be looser than the composite of what you depend on — Resolver × Direct Connect × on-prem — because you cannot be more reliable than the floor you stand on. (That’s Article 17’s dependency math, now pointed at your dependencies.) Second, and more valuable politically: a well-placed SLI turns “the network is slow” from an argument into a measurement. When the DNS SLO is green and measured at your endpoint, “DNS is the problem” becomes a claim someone has to disprove with data. The boundary is where blame stops being a meeting and becomes a number.

Part 3Make it a contract

The negotiation

Here the two worlds diverge hardest. A product SLO is set from user data — you measure what users tolerate and pick a target under it. An infrastructure SLO is negotiated with the consumer teams, which makes it a political document as much as a technical one. Start every negotiation with one question: “what do you assume about us today?” The answer, nine times in ten, is 100% — teams have quietly architected against a guarantee you never made, with no retries, no caching, no failover, because they assumed you’d never be down. Surfacing that is half the value before you’ve set a single number. Then publish the SLO explicitly, so teams design for the real figure instead of an imaginary one. And ask the tiering question: do all fifty teams get the same SLO, or do Tier-1 workloads get a tighter one — at a chargeback price? That last move is where a platform SLO becomes a product-management instrument: differentiated tiers, differentiated cost, connected to unit economics. You’re no longer running a service; you’re pricing one.

Set it by negotiation — then publish itthe answer to 'what do you assume?' is 100%; publishing replaces it with a number teams design forASSUMED (today)100%no retries · no failoverbuilt against a guaranteeyou never madepublishPUBLISHED99.9%error budgetthe real number —teams design for it:retries · caching · failoverTiering — the SLO becomes a priced productTier-199.95%at a chargeback priceTier-299.9%the defaultTier-399.5%best-efforttighter reliability costs more — a distinctly principal-level lever.
Figure 5 · Consumers assume 100% and architect with no retries; publishing replaces the imaginary guarantee with a real number they design for — and tiering it at a chargeback price turns the SLO into a priced product.
 Product SLOInfrastructure SLO
ConsumerEnd usersOther teams — one per capability
Set fromUser-tolerance dataNegotiation with consumers
Golden signalOne (requests)One per capability
The document isA measurementA political contract
The leverReliabilityReliability + tier + chargeback

Error budgets when your consumers cause the burn

Now the asymmetry product teams never face: your consumers can spend your error budget. A runaway workload saturates the NAT; a bad deploy hammers the resolver. The burn is real, the budget is yours, and the fault is theirs.

When a consumer burns your budgetdefend the budget per-tenant — and don’t freeze yourself for their faultShared capabilityplatform DNS / NATone shared error budgetTenant Awithin shareTenant Bwithin shareTenant Crunaway workloadquotadefends budgetShared error budget this windowTenant C runawayOne tenant spends the shared budget — not the platform’s fault.Policy: consumer-caused burn→ quota the tenant, do NOT freeze the platform.Requires per-tenant attribution in telemetry —you must be able to name whose traffic burned it.
Figure 6 · A consumer-caused burn. One tenant’s runaway spends the shared budget; a per-tenant quota is the defended-budget mechanism; and the burn quotas that tenant rather than freezing the platform — which only works if telemetry attributes the burn per consumer.

Two things follow. First, defend the budget: per-tenant SLIs plus quotas turn “one team can take down the shared capability” into “one team can only spend its own share.” The quota is a budget-protection mechanism, not just a rate limit. Second, the policy question: does a consumer-caused burn trigger your change freeze? No — freezing your releases doesn’t fix their runaway, and it punishes the platform for a fault it didn’t commit. But that answer only holds if your telemetry can attribute the burn: you must be able to say whose traffic spent the budget. Per-consumer attribution — the multi-tenant observability problem — is what lets you route the consequence to the right team instead of eating it yourself. Without it, every burn looks like your fault, and you’ll freeze for things you didn’t do.

Anti-patterns

The failure modes are consistent enough to name and avoid.

The aggregate SLO hides the fireone number averages fifty tenants — green while three burnAggregate SLO (all tenants)99.9%looks healthy— the lie —Per-tenant, same windowT-199.98%T-299.95%T-397.2%🔥T-496.5%🔥T-595.9%🔥SLO 99.9%Three teams are on fire behind a green number. Report per-tenant, or the aggregate lies.
Figure 7 · The most dangerous one: the aggregate SLO. Averaged across fifty tenants the number is green while three teams are on fire — report per-tenant, or the aggregate lies.
Anti-patternWhy it liesFix
Component SLO nobody consumes“Router uptime 99.99%” while provisioning takes three weeksMeasure the capability the consumer feels, not the box you run
Measuring what you already graphThe SLI is chosen from convenience, not consumer painStart from the consumer’s experience; work back to the metric
SLOs as weaponsThe number wins blame wars instead of setting a contractPublish it as a mutual contract both sides read
Provider SLA as your SLOYou claim AWS’s 99.99% as yoursYou run on their SLA plus your own failure modes — your number is always lower
The aggregate SLOOne number averages fifty tenants — green while three burnReport per-tenant; an average hides the fire

Worked example: hybrid DNS as a platform contract

Put it together on one capability — the hybrid-DNS resolution from Article 17, taken up a level. Six steps, one page.

The six steps, as a spinethe same shape as the one-page contract below1Consumerwho is on the hook2Boundarymeasure what you own3SLIgood / valid at the interface4Targetnegotiated + windowed5Budget policyincl. consumer-burn clause6Publisheda one-page contract
Figure 8 · The six steps as a spine — consumer, boundary, SLI, target, budget policy, published — the same shape as the one-page contract below. The Article-17 mechanics are unchanged; only the framing around them is new.

Platform SLO — Hybrid DNS resolution (on-prem ⇆ AWS private zones)

1 · Consumer. The ~50 app teams whose workloads resolve names across the on-prem/AWS boundary. Not the end user — three layers up.

2 · Boundary. Measured at the Route 53 Resolver inbound endpoint — excludes the on-prem forwarder and client stub resolvers we don’t own.

3 · SLI at the interface. good = non-SERVFAIL within 100 ms at the endpoint; valid = queries reaching the endpoint. (Article 17’s SLI, re-anchored to the boundary.)

4 · Target + window. 99.9% over rolling 30 days. Consumers assumed 100%; measured baseline was 99.95%; the target is bounded by the Resolver × Direct Connect composite.

5 · Budget policy (incl. consumer-caused burn). Normal burn → change freeze on the DNS platform until recovered. Consumer-caused burn (one tenant’s misconfigured resolver flooding the endpoint) → quota that tenant; no platform freeze — per-tenant attribution shows it wasn’t us.

6 · Published. Owned by the networking platform team; reviewed quarterly with consumer reps; kept as a one-pager next to the config, in the shape of a one-page ADR.

That’s the whole contract — one page. Notice what happened: the Article 17 mechanics didn’t change at all. What changed was everything around them — who the consumer is, where the boundary sits, who can burn the budget. That’s the pattern for every platform SLO, and it’s the meta-lesson of the series: the framework isn’t replaced as you go up a level. It compounds.

References

  1. SLOs from scratch: picking your first SLI for a network service — Article 17, the mechanics this builds on.
  2. Google — The Site Reliability Workbook, chapters on Service Level Objectives and Implementing SLOs (incl. platform / multi-tenant considerations): sre.google/workbook/implementing-slos
  3. The one-page ADR — the one-page-contract form the published SLO takes.