SLA calculator
The SLA calculator turns an SLA percentage into the downtime it allows per day, week, month, quarter and year, and multiplies the SLAs of every service in your request path into the composite SLA you can actually promise.
Composite SLA: 99.8401%
99.95% × 99.99% × 99.9% = 99.8401%
| Period | Downtime allowed |
|---|---|
| Day | 2m 18.184s |
| Week | 16m 7.287s |
| Month | 1h 10m 5.971s |
| Quarter | 3h 30m 17.912s |
| Year | 14h 1m 11.649s |
An SLA percentage is a downtime budget written as a fraction. 99.9% means you may be down 0.1% of the period, which is 43m 50s in an average month. The calculator does that conversion for any number, and then does the part a plain percentage converter skips: it multiplies in the services your app depends on, because your SLA can never be higher than theirs combined.
SLA calculator 99.9, 99.95 and 99.99
- 99.9%: 1m 26.4s per day, 43m 49.8s per month, 8h 45m 57.6s per year.
- 99.95%: 43.2s per day, 21m 54.9s per month, 4h 22m 58.8s per year.
- 99.99%: 8.64s per day, 4m 22.98s per month, 52m 35.76s per year.
All three use a 365.25-day year and a month of a twelfth of it, the same sums the calculator runs. Each extra nine divides the budget by ten, and the cost of staying inside it grows faster than that. 99.9 is one quick rollback a month. 99.99 is under 5 minutes, which no human on call can hit: by the time the alert is read the month is gone, so it takes automatic failover.
SLA uptime formula
- Allowed downtime:
period x (1 - SLA / 100). - Measured uptime:
(period - downtime) / period x 100. - Serial composite:
A x B x C, as fractions. Every dependency has to be up. - Parallel composite:
1 - (1 - A) x (1 - B). Down only when every copy is down at once.
const MONTH_MIN = (365.25 * 24 * 60) / 12; // 43,830 minutes
// Allowed downtime for one SLA, in minutes per month.
const allowed = (sla) => MONTH_MIN * (1 - sla / 100);
// Dependencies in series: every one has to be up, so multiply.
const serial = (...slas) => slas.reduce((acc, s) => acc * (s / 100), 1) * 100;
// Redundant copies with automatic failover: down only if all are down.
const parallel = (...slas) =>
(1 - slas.reduce((acc, s) => acc * (1 - s / 100), 1)) * 100;
const composite = serial(99.99, 99.95, 99.9); // host, database, payments API
console.log(composite.toFixed(2) + '%'); // 99.84%
console.log(allowed(composite).toFixed(0) + ' min/month'); // 70 min/month
console.log(parallel(99.9, 99.9).toFixed(4) + '%'); // 99.9999%Composite SLA: why you can promise less than your providers
A request to your app usually needs the host, the database and often a third-party API. If those publish 99.99, 99.95 and 99.9, the chain is 99.84%, which is 70 minutes a month before your own code has failed once. Promise a customer 99.9 on that stack and you have signed for an SLA your vendors alone can break. Put the composite in the contract, or remove a dependency from the request path, for example by queueing the payment call instead of waiting on it.
The parallel formula is how the big numbers get bought back. Two 99.9 regions with failover give 99.9999% on paper. That holds only if the failover is automatic and the two copies do not share a failure, like the same DNS provider or the same bad deploy. Most outages are shared failures, so treat the parallel result as a ceiling, not a forecast.
Logdash vs uptime.is
| Feature | Logdash | uptime.is |
|---|---|---|
| SLA to downtime per period | Day, week, month, quarter, year | Day, week, month, quarter, year |
| Composite SLA of dependencies | Multiplies them for you | Not built in |
| Business-hours SLA | No, 24/7 only | Hours per weekday |
| Measures delivered uptime | HTTP checks down to every 15 seconds | Calculator only |
When uptime.is is the better pick
- Your contract only counts business hours. uptime.is takes hours per weekday and Logdash assumes 24/7.
- You need the reverse sum, minutes of downtime back to a percentage, on a page made for it.
Measure the SLA you actually deliver
- Add the URL Create a service in Logdash and point its monitor at your health endpoint. Uptime is the share of checks that answered 200-399.
- Match the interval to the SLA A 5-minute check, the free plan, cannot see a 99.99 budget of 4m 23s a month. Builder checks every minute, Pro every 15 seconds.
- Prove the alert works Make the endpoint return 503. The next check marks it down and a Telegram alert arrives with the status code, so the first minute of the budget is not spent finding out.