Error Budget Tracking
Overview
An error budget turns "is this service reliable enough" from a vague feeling
into a number: given a target (e.g., 99.9% uptime, or a max acceptable error
rate), the budget is the amount of unreliability you're allowed before you've
spent it. Burn rate is how fast you're spending it. This skill computes both
from whatever observability data is actually available, and — just as
importantly — knows when there isn't enough to compute a formal burn rate at
all, and falls back to something honest instead of a fabricated number.
Anti-triggers
- Contractual SLAs on service-desk tickets — a response or resolution
target on a client agreement is a different measurement from an SLO burn
rate; use
sla-escalation-playbooks in ops-pack.
- Vendor-computed response metrics — MTTA, MTTR, and incident counts are
already calculated by the platform; use
pagerduty-analytics.
- Configuring the checks behind the SLI — check types, heartbeats, and
monitor groups are
betterstack-monitors.
Discovering available tools first
This pack is cross-vendor. Before pulling any observability data:
- Call
conduit__search_tools to discover which observability connectors
are live — Sentry (error rate/issue volume), Datadog or Grafana
(uptime/latency SLIs, dashboards, monitors), BetterStack (uptime checks,
status pages). Tool names follow <vendor-slug>__<tool_name>, e.g.
sentry__list_issues, datadog__list_monitors, betterstack__list_monitors.
- Also check whether an SLO is formally defined anywhere reachable (a
Datadog/Grafana SLO object, a documented target) versus needing to be
inferred or asked for.
- Only call the concrete tools discovery returns. If no observability
connector at all is available, say so — there is no data to compute
reliability trend from, formal or informal.
Key Concepts
SLO, SLI, and error budget, applied practically
- SLI (Service Level Indicator) — the measured signal: error rate,
uptime percentage, latency percentile. This is what the observability tool
actually reports.
- SLO (Service Level Objective) — the target for that SLI over a period,
e.g. "99.9% uptime over 30 days" or "error rate under 0.1% over 7 days."
- Error budget — the allowed amount of failure implied by the SLO: at
99.9% over 30 days, the budget is roughly 43 minutes of downtime (or
equivalent error volume) for the period. Budget remaining = allowed
failure minus failure incurred so far in the period.
- Burn rate — how fast the budget is being consumed relative to a steady
pace that would exactly exhaust it by period end. A burn rate of 1.0 means
"on pace to exactly exhaust the budget at period end." A burn rate
meaningfully above 1.0 (commonly used thresholds: 2x sustained, or a sharp
spike like 10x+ over a short window) signals the budget will be exhausted
before the period ends if the current pace continues.
Computing burn rate from available data
The formal calculation needs three things: a defined SLO target, a
measurement period, and current SLI data over that period. When all three
are available:
- Compute allowed-failure budget for the period from the SLO target.
- Compute actual failure incurred so far in the period from the SLI data
(error count/rate from Sentry, downtime from Datadog/Grafana/BetterStack
uptime checks).
- Burn rate ≈ (budget consumed so far / budget that should be consumed at
this point in the period if pace were even). A value materially above 1.0
means the budget is being spent faster than a linear pace would allow.
- State the formula and the source data explicitly in the output — a burn
rate number without its inputs isn't verifiable or useful to challenge.
What counts as budget-threatening vs. noise
Not every error spike or downtime blip threatens the budget. Distinguish:
- Noise — a brief spike that self-resolves and represents a small
fraction of the total budget for the period (e.g., a 2-minute blip against
a 43-minute monthly budget). Worth noting, not escalating.
- Budget-threatening — a sustained elevated rate (burn rate meaningfully
above 1.0 sustained over hours, not minutes), or a single event large
enough to consume a significant fraction of the remaining period budget in
one incident. Both warrant escalation — the first because it will exhaust
the budget on the current trajectory, the second because it already has.
A single data point is never enough to call something a trend — look at the
trajectory over at least several data points or a meaningful fraction of the
measurement window before characterizing something as budget-threatening
rather than a transient blip.
Degrading gracefully when no formal SLO is defined
Most connected services will not have a formally defined SLO object sitting
in Datadog or Grafana, and that's normal, not a failure state. When no SLO
target is discoverable and the user hasn't stated one:
- Do not fabricate a target. Don't assume "99.9%" or any other number
as if it were agreed policy.
- Fall back to raw trend reporting. Report the raw SLI instead of a
derived burn rate: current error rate vs. the trailing baseline (e.g.,
prior 7-day average), or current uptime percentage vs. trailing baseline,
with the trend direction (improving / flat / degrading) stated plainly.
- Say explicitly that this is a trend report, not a burn-rate
calculation, and what would be needed to compute a real burn rate (a
stated SLO target and period) — so the gap is visible rather than
papered over with an invented number.
- If the user supplies a target ad hoc ("we want 99.9% uptime"), treat that
as the SLO for this run and compute burn rate normally, but note that
it's an ad hoc target, not one formally configured in the connected tool.
Common Workflows
Compute error-budget status for a service with a formal SLO
- Discover tools via
conduit__search_tools.
- Retrieve the SLO target and current-period SLI data from the connected
tool that defines it (Datadog/Grafana SLO object, or BetterStack uptime
history against a stated target).
- Compute budget consumed, budget remaining, and burn rate per the formula
above.
- Classify: healthy (burn rate ≈ 1.0 or below), at-risk (sustained burn rate
above 1.0), or exhausted (budget already spent for the period).
- Report with the formula, inputs, and classification stated explicitly.
Report reliability trend for a service with no formal SLO
- Discover tools via
conduit__search_tools.
- Pull the raw SLI available (Sentry error rate, Datadog/Grafana metric,
BetterStack uptime) for the current period and a trailing baseline period
of the same length.
- Compare current vs. baseline and state the trend direction.
- Report explicitly as a trend report, not a burn-rate calculation, and
note what a formal SLO would need to be defined to upgrade this to one.
Rank multiple services by budget health (scorecard)
- Discover tools and enumerate connected services/monitors.
- For each service, run the appropriate workflow above (formal SLO burn
rate where available, trend report otherwise) — do not force every
service into the same calculation type if their available data differs.
- Rank worst-first: exhausted > at-risk (formal) > degrading trend (no SLO)
healthy/flat > improving. State which classification type applied to
each service so the ranking logic is auditable.
Error Handling
No observability connector discovered
Say so explicitly: "No observability connector is available through the
gateway, so reliability status can't be computed for any service." Do not
fabricate uptime or error-rate figures.
Observability connected, but no SLO defined and no target given
Fall back to raw trend reporting per the graceful-degradation rules above —
never invent a target to force a burn-rate number.
Insufficient historical data for a trend or baseline
State this explicitly (e.g., "only 2 days of history available, insufficient
for a reliable 7-day baseline comparison") rather than reporting a trend
built on too little data as if it were solid.
Related Skills
- Incident Postmortem — a single incident
that materially burns the budget is worth cross-referencing in the
postmortem's impact section
- On-Call Handoff — a service trending toward
budget exhaustion is a reasonable "watch this" item to carry into the next
handoff even before it pages
1---2name: error-budget-tracking3description: Error-budget and burn-rate assessment from whatever observability tools (Sentry, Datadog, Grafana, BetterStack) are connected: SLI, SLO, error budget, and burn rate applied practically, how to compute burn rate from available SLI data and the thresholds that make it actionable, what separates a budget-threatening trend from noise, and the fallback to raw trend reporting against a trailing baseline when no formal SLO is defined.4---56# Error Budget Tracking78## Overview910An error budget turns "is this service reliable enough" from a vague feeling11into a number: given a target (e.g., 99.9% uptime, or a max acceptable error12rate), the budget is the amount of unreliability you're allowed before you've13spent it. Burn rate is how fast you're spending it. This skill computes both14from whatever observability data is actually available, and — just as15importantly — knows when there isn't enough to compute a formal burn rate at16all, and falls back to something honest instead of a fabricated number.1718## Anti-triggers1920- **Contractual SLAs on service-desk tickets** — a response or resolution21 target on a client agreement is a different measurement from an SLO burn22 rate; use `sla-escalation-playbooks` in ops-pack.23- **Vendor-computed response metrics** — MTTA, MTTR, and incident counts are24 already calculated by the platform; use `pagerduty-analytics`.25- **Configuring the checks behind the SLI** — check types, heartbeats, and26 monitor groups are `betterstack-monitors`.2728## Discovering available tools first2930This pack is cross-vendor. Before pulling any observability data:31321. Call `conduit__search_tools` to discover which observability connectors33 are live — Sentry (error rate/issue volume), Datadog or Grafana34 (uptime/latency SLIs, dashboards, monitors), BetterStack (uptime checks,35 status pages). Tool names follow `<vendor-slug>__<tool_name>`, e.g.36 `sentry__list_issues`, `datadog__list_monitors`, `betterstack__list_monitors`.372. Also check whether an SLO is formally defined anywhere reachable (a38 Datadog/Grafana SLO object, a documented target) versus needing to be39 inferred or asked for.403. Only call the concrete tools discovery returns. If no observability41 connector at all is available, say so — there is no data to compute42 reliability trend from, formal or informal.4344## Key Concepts4546### SLO, SLI, and error budget, applied practically4748- **SLI (Service Level Indicator)** — the measured signal: error rate,49 uptime percentage, latency percentile. This is what the observability tool50 actually reports.51- **SLO (Service Level Objective)** — the target for that SLI over a period,52 e.g. "99.9% uptime over 30 days" or "error rate under 0.1% over 7 days."53- **Error budget** — the allowed amount of failure implied by the SLO: at54 99.9% over 30 days, the budget is roughly 43 minutes of downtime (or55 equivalent error volume) for the period. Budget remaining = allowed56 failure minus failure incurred so far in the period.57- **Burn rate** — how fast the budget is being consumed relative to a steady58 pace that would exactly exhaust it by period end. A burn rate of 1.0 means59 "on pace to exactly exhaust the budget at period end." A burn rate60 meaningfully above 1.0 (commonly used thresholds: 2x sustained, or a sharp61 spike like 10x+ over a short window) signals the budget will be exhausted62 before the period ends if the current pace continues.6364### Computing burn rate from available data6566The formal calculation needs three things: a defined SLO target, a67measurement period, and current SLI data over that period. When all three68are available:69701. Compute allowed-failure budget for the period from the SLO target.712. Compute actual failure incurred so far in the period from the SLI data72 (error count/rate from Sentry, downtime from Datadog/Grafana/BetterStack73 uptime checks).743. Burn rate ≈ (budget consumed so far / budget that should be consumed at75 this point in the period if pace were even). A value materially above 1.076 means the budget is being spent faster than a linear pace would allow.774. State the formula and the source data explicitly in the output — a burn78 rate number without its inputs isn't verifiable or useful to challenge.7980### What counts as budget-threatening vs. noise8182Not every error spike or downtime blip threatens the budget. Distinguish:8384- **Noise** — a brief spike that self-resolves and represents a small85 fraction of the total budget for the period (e.g., a 2-minute blip against86 a 43-minute monthly budget). Worth noting, not escalating.87- **Budget-threatening** — a sustained elevated rate (burn rate meaningfully88 above 1.0 sustained over hours, not minutes), or a single event large89 enough to consume a significant fraction of the remaining period budget in90 one incident. Both warrant escalation — the first because it will exhaust91 the budget on the current trajectory, the second because it already has.9293A single data point is never enough to call something a trend — look at the94trajectory over at least several data points or a meaningful fraction of the95measurement window before characterizing something as budget-threatening96rather than a transient blip.9798### Degrading gracefully when no formal SLO is defined99100Most connected services will not have a formally defined SLO object sitting101in Datadog or Grafana, and that's normal, not a failure state. When no SLO102target is discoverable and the user hasn't stated one:1031041. **Do not fabricate a target.** Don't assume "99.9%" or any other number105 as if it were agreed policy.1062. **Fall back to raw trend reporting.** Report the raw SLI instead of a107 derived burn rate: current error rate vs. the trailing baseline (e.g.,108 prior 7-day average), or current uptime percentage vs. trailing baseline,109 with the trend direction (improving / flat / degrading) stated plainly.1103. **Say explicitly that this is a trend report, not a burn-rate111 calculation**, and what would be needed to compute a real burn rate (a112 stated SLO target and period) — so the gap is visible rather than113 papered over with an invented number.1144. If the user supplies a target ad hoc ("we want 99.9% uptime"), treat that115 as the SLO for this run and compute burn rate normally, but note that116 it's an ad hoc target, not one formally configured in the connected tool.117118## Common Workflows119120### Compute error-budget status for a service with a formal SLO1211221. Discover tools via `conduit__search_tools`.1232. Retrieve the SLO target and current-period SLI data from the connected124 tool that defines it (Datadog/Grafana SLO object, or BetterStack uptime125 history against a stated target).1263. Compute budget consumed, budget remaining, and burn rate per the formula127 above.1284. Classify: healthy (burn rate ≈ 1.0 or below), at-risk (sustained burn rate129 above 1.0), or exhausted (budget already spent for the period).1305. Report with the formula, inputs, and classification stated explicitly.131132### Report reliability trend for a service with no formal SLO1331341. Discover tools via `conduit__search_tools`.1352. Pull the raw SLI available (Sentry error rate, Datadog/Grafana metric,136 BetterStack uptime) for the current period and a trailing baseline period137 of the same length.1383. Compare current vs. baseline and state the trend direction.1394. Report explicitly as a trend report, not a burn-rate calculation, and140 note what a formal SLO would need to be defined to upgrade this to one.141142### Rank multiple services by budget health (scorecard)1431441. Discover tools and enumerate connected services/monitors.1452. For each service, run the appropriate workflow above (formal SLO burn146 rate where available, trend report otherwise) — do not force every147 service into the same calculation type if their available data differs.1483. Rank worst-first: exhausted > at-risk (formal) > degrading trend (no SLO)149 > healthy/flat > improving. State which classification type applied to150 each service so the ranking logic is auditable.151152## Error Handling153154### No observability connector discovered155156Say so explicitly: "No observability connector is available through the157gateway, so reliability status can't be computed for any service." Do not158fabricate uptime or error-rate figures.159160### Observability connected, but no SLO defined and no target given161162Fall back to raw trend reporting per the graceful-degradation rules above —163never invent a target to force a burn-rate number.164165### Insufficient historical data for a trend or baseline166167State this explicitly (e.g., "only 2 days of history available, insufficient168for a reliable 7-day baseline comparison") rather than reporting a trend169built on too little data as if it were solid.170171## Related Skills172173- [Incident Postmortem](../incident-postmortem/SKILL.md) — a single incident174 that materially burns the budget is worth cross-referencing in the175 postmortem's impact section176- [On-Call Handoff](../oncall-handoff/SKILL.md) — a service trending toward177 budget exhaustion is a reasonable "watch this" item to carry into the next178 handoff even before it pages