1. Your SLO
2. What you get
Allowed downtime
| Window | Full-outage minutes allowed |
|---|
Alert policy (fires when both windows exceed the threshold)
| Severity | Burn rate | Windows | Error ratio above | Total outage detected in |
|---|
Findings
| Rule | Level | Detail |
|---|
No findings.
Prometheus rules file
Run promtool check rules slo-api.rules.yml and try each expression in your own Prometheus before loading it.
Prefer a CLI?
node cli.mjs plan --slo 99.9 --rps 40
node cli.mjs plan --slo 99.9 --json
node cli.mjs rules --slo 99.9 --name api \
--errors 'http_requests_total{job="api",code=~"5.."}' \
--total 'http_requests_total{job="api"}' > slo-api.rules.yml
Get cli.mjs and engine.mjs — Node 18+, nothing to install, no network call. plan exits 1 on an unreachable threshold, so it can gate a pull request that edits an SLO. More: how to set multi-window burn-rate alerts for an SLO.
Common questions
What is a multi-window, multi-burn-rate alert?
Instead of alerting when the error rate crosses a fixed number, you alert on how fast the error budget is being spent. A burn rate of 1 uses the whole budget exactly at the end of the period; 14.4 uses 2% of a 30-day budget in one hour. Requiring a long and a short window to both exceed the threshold makes it page quickly on real outages and reset quickly once fixed.
Why does my 99% or 90% SLO never alert?
The page threshold is the burn rate times the allowed error ratio. For a 90% SLO that is 14.4 x 10% = 144%, which an error ratio cannot reach, so the alert can never fire. The tool flags this and you should lengthen the window or lower the budget fraction.
Does this connect to my Prometheus or read my metrics?
No. It does arithmetic on the numbers you type and prints a rule file. It never contacts any server and nothing you type is uploaded.
Are the generated rules safe to paste into production?
Treat them as a reviewed starting point. They assume your error and total selectors are counters you can rate(), that traffic is steady enough for ratio alerts, and that you have tested the expression in your own Prometheus. Run promtool check rules and try the expressions in the expression browser first.