SLI / SLO / SLA
"A loja é confiável o suficiente?" é uma pergunta que ninguém consegue responder sem números. A gerente de produto quer lançar um novo checkout esta semana; o engenheiro de plantão diz que o serviço de pedidos teve um mês ruim e quer congelar os deploys. Sem uma definição compartilhada de "bom o suficiente", essa discussão é opinião contra opinião. Medir a confiabilidade exige um vocabulário comum que ligue a telemetria bruta às decisões de engenharia e aos compromissos com os clientes. A prática de Site Reliability Engineering do Google introduziu um modelo de três camadas com esse objetivo1, hoje padrão na indústria.
| Termo | Nome completo | Natureza |
|---|---|---|
| SLI | Service Level Indicator | Uma métrica mensurável |
| SLO | Service Level Objective | Uma meta interna para essa métrica |
| SLA | Service Level Agreement | Um compromisso contratual com os clientes |
flowchart LR
telemetry["Telemetria\n(logs, métricas, traces)"]
sli["SLI\nMedição bruta"]
slo["SLO\nMeta interna"]
sla["SLA\nContrato externo"]
budget["Error Budget\nAlavanca de engenharia"]
telemetry e1@-->|agregada em| sli
sli e2@-->|avaliado contra| slo
slo e3@-->|embasa| sla
slo e4@-->|o restante vira| budget
e1@{ animate: true }
e2@{ animate: true }
e3@{ animate: true }
e4@{ animate: true } SLI — A medição bruta
Um SLI é uma métrica quantitativa extraída diretamente da instrumentação que reflete a qualidade do sistema percebida pelo usuário. Nem toda métrica é um bom SLI; só aquelas que se correlacionam com o usuário estar ou não obtendo valor do serviço.
A forma mais útil de escrever um SLI é como uma razão entre eventos, de modo que ele fique sempre entre 0% e 100%2:
Por exemplo: "a proporção de requisições GET /products que retornam um status diferente de 5xx em menos de 300 ms". "Válidos" permite excluir eventos que não devem contar, como respostas 4xx causadas pelo cliente.
Categorias canônicas de SLI
| Categoria | O que mede | Exemplo de medição |
|---|---|---|
| Disponibilidade | Fração das requisições atendidas com sucesso | non-5xx responses / total HTTP requests |
| Latência | Fração das requisições atendidas rápido o suficiente | requests faster than 200 ms / total requests (equivalente a P95 < 200 ms) |
| Taxa de erros | Fração das requisições que resultam em erro | HTTP 5xx / total HTTP requests (o complemento da disponibilidade) |
| Vazão | Volume de trabalho que o sistema processa | Requests per second (geralmente uma métrica de capacidade, e não um SLI) |
| Durabilidade | Fração dos dados que podem ser recuperados | Successful reads / total attempted reads |
| Atualidade | Idade da escrita bem-sucedida mais recente | Time since last successful cache refresh |
Evite métricas de vaidade
Utilização de CPU, tamanho do heap da JVM e tempo de pausa do garbage collector não são bons SLIs por si sós. Um serviço pode estar com 95% de CPU e ainda assim atender todas as requisições corretamente — e, ao contrário, um serviço pode estar com 10% de CPU e completamente fora do ar. SLIs devem refletir o que o usuário experimenta, não o que a infraestrutura experimenta.
Como os SLIs são coletados
- Instrumentação na aplicação: contadores de requisições e histogramas de latência exportados via Spring Boot Actuator / Micrometer (Hands-on 6).
- Monitoramento sintético: sondas que enviam requisições reais de fora do sistema, em intervalos programados (por exemplo, o Prometheus Blackbox Exporter).
- Baseado em logs: análise dos logs de acesso para contar respostas 2xx vs 5xx.
- No cliente: medição a partir do navegador ou do app móvel, para a experiência real do usuário final.
O SLI de disponibilidade da loja em PromQL
O Spring Boot exporta o contador http_server_requests_seconds_count com um label status. O SLI de disponibilidade do serviço de pedidos nos últimos 5 minutos é:
sum(rate(http_server_requests_seconds_count{application="order", status!~"5.."}[5m]))
/
sum(rate(http_server_requests_seconds_count{application="order"}[5m]))
O numerador conta os eventos bons (tudo que não é 5xx), o denominador conta todos os eventos. Veja a aula de Observabilidade para PromQL.
SLO — A meta com que você se compromete
Um SLO é uma meta específica e delimitada no tempo para um SLI. Ele responde: "Quão boa esta métrica precisa ser para considerarmos o serviço saudável?"
Formato:
SLI ≥ thresholdem umarolling window
Uma janela móvel (rolling window) cobre sempre os últimos N dias (por exemplo, de 28 dias atrás até agora), então avança a cada minuto; uma janela de calendário é reiniciada no dia 1º de cada mês.
Exemplos:
| SLO | Significado |
|---|---|
Availability ≥ 99.9% em 28 dias | No máximo 0,1% das requisições pode falhar em qualquer período de 28 dias |
P95 latency ≤ 200 ms em 7 dias | 95% das requisições terminam em até 200 ms em qualquer janela de 7 dias |
Error rate ≤ 0.5% em 24 horas | No máximo 5 em cada 1000 requisições retornam 5xx em qualquer dia |
Escolhendo o SLO certo
SLOs devem ser ambiciosos, mas alcançáveis. Um SLO que nunca é violado não está impulsionando trabalho de confiabilidade — está frouxo demais. Um SLO violado o tempo todo é ruído — a equipe deixa de confiar nele.
- Comece medindo o SLI atual por 30–90 dias.
- Defina o SLO inicial no patamar observado menos uma pequena margem.
- Aperte-o com o tempo, à medida que o sistema melhora.
- Torne os SLOs públicos dentro da organização de engenharia, para que todas as equipes entendam as metas que estão perseguindo.
- Lembre-se da disponibilidade composta (visão geral): um serviço não pode prometer mais do que o produto dos serviços dos quais depende de forma síncrona.
Error Budget
O error budget (orçamento de erros) é a quantidade de não confiabilidade que o SLO permite. É a licença para assumir riscos da equipe de engenharia.
Para um SLO de disponibilidade de 99,9%, o orçamento é 0,1% — do tempo ou das requisições na janela, dependendo de como o SLI é definido.
Para um SLO de 99,9% em uma janela de 28 dias:
(Em um mês de calendário de 30,44 dias, os mesmos 99,9% dão ≈ 43,8 minutos — o número geralmente citado nas tabelas de "noves".)
O serviço de pedidos recebe cerca de 1.000.000 de requisições por dia. Em 28 dias, são 28.000.000 de requisições, então um SLO de 99,9% permite
Um deploy ruim que retorna 500 para 20.000 requisições em uma hora consome cerca de 70% do orçamento do mês de uma só vez.
Se o error budget está intacto, a equipe pode:
- Fazer deploys com frequência e aceitar algum risco de deploy
- Executar experimentos em sistemas de produção
- Assumir mais dívida técnica
Se o error budget está esgotado, a equipe deve:
- Congelar deploys não essenciais
- Priorizar o trabalho de confiabilidade em vez de novas funcionalidades
- Investigar e corrigir as causas-raiz que estão consumindo o orçamento
Essas regras só funcionam se forem acordadas antes: uma política de error budget é um documento curto, assinado por produto e engenharia, que diz o que acontece quando o orçamento acaba.
O error budget como ferramenta de negociação
Quando uma gerente de produto quer lançar uma funcionalidade arriscada e a equipe de SRE está relutante, o error budget dá uma resposta objetiva: "Temos 12 minutos de orçamento restantes nesta janela de 28 dias. Se fizermos o deploy e ele causar 30 minutos de degradação, vamos violar nosso SLO. Vamos esperar até recuperar orçamento suficiente."
Burn rate
A burn rate (taxa de consumo) mede a velocidade com que o error budget está sendo consumido em relação à janela do SLO2:
Com um SLO de 99,9%, uma taxa de erros de 0,1% é uma burn rate de 1 — o orçamento dura exatamente a janela inteira. Uma taxa de erros de 1,44% é uma burn rate de 14,4. Uma burn rate de \(b\) esgota o orçamento em (janela ÷ \(b\)).
Para uma janela de 28 dias:
| Burn rate | Orçamento esgotado em | Severidade |
|---|---|---|
| 1× | Fim da janela do SLO (28 dias) | Normal |
| 2× | 14 dias | Aviso |
| 6× | ~4,7 dias | Alta — abrir um ticket |
| 14,4× | ~1,9 dia (~47 horas) | Crítica — acionar o plantão imediatamente |
Os limites de 14,4× e 6× vêm do SRE Workbook: sustentada por 1 hora, uma burn rate de 14,4× consome cerca de 2% do orçamento; sustentada por 6 horas, uma de 6× consome cerca de 5%. (O Workbook os deriva para uma janela de 30 dias; com 28 dias as porcentagens são quase as mesmas.) Alertas de burn rate alta pegam cedo os incidentes rápidos, enquanto alertas de burn rate baixa pegam degradações lentas que, de outra forma, seriam invisíveis2.
Um alerta de burn rate para o serviço de pedidos
# Prometheus alerting rule (99.9% SLO → budget = 0.001)
- alert: OrderErrorBudgetFastBurn
expr: |
(
sum(rate(http_server_requests_seconds_count{application="order", status=~"5.."}[1h]))
/
sum(rate(http_server_requests_seconds_count{application="order"}[1h]))
) > (14.4 * 0.001)
for: 2m
labels:
severity: page
O alerta dispara por um sintoma que os usuários sentem (erros consumindo o orçamento), não por uma causa como CPU — veja alertas na aula de Observabilidade.
SLA — O compromisso contratual
Um SLA é um acordo formal entre o provedor do serviço e o cliente que define o nível de serviço esperado e as compensações (normalmente créditos de serviço) caso esse nível não seja atingido. SLAs são documentos jurídicos; descumpri-los tem consequências financeiras.
Estrutura de um SLA
- Serviços cobertos — quais produtos e regiões estão no escopo
- Metas de SLO — os compromissos de disponibilidade ou de latência
- Metodologia de medição — como o uptime é calculado, quais incidentes contam
- Exclusões — manutenção programada, força maior, indisponibilidades causadas pelo cliente
- Compensações — tabela de créditos de serviço para cada faixa de violação
Exemplos reais de SLA
Os compromissos abaixo foram retirados das páginas públicas de SLA dos provedores34; as condições exatas (tipo de implantação, região, faixas de crédito) mudam com o tempo, então sempre leia a página atual.
| Provedor | Serviço | Uptime mensal comprometido | Compensação por violação |
|---|---|---|---|
| AWS | EC2 (nível de região) | 99,99% | Créditos de serviço por faixa |
| AWS | S3 Standard | 99,9% | Créditos de serviço por faixa |
| AWS | RDS Multi-AZ | 99,95% | Créditos de serviço por faixa |
| Google Cloud | Compute Engine (instâncias em várias zonas) | 99,99% | Créditos de serviço por faixa |
| Azure | Virtual Machines (em várias Availability Zones) | 99,99% | Créditos de serviço por faixa |
Repare em duas coisas. Primeiro, os números mais altos só valem quando você implanta de forma redundante (várias zonas, Multi-AZ) — a redundância é o preço do nove extra. Segundo, a compensação é um crédito na sua fatura, não uma indenização pelas suas vendas perdidas: um SLA transfere parte do risco financeiro, mas não torna o seu sistema disponível.
SLA vs SLO
SLA e SLO são frequentemente confundidos. A distinção crucial:
| SLO | SLA | |
|---|---|---|
| Público | Equipe de engenharia | Cliente / negócio |
| Natureza | Meta interna | Contrato jurídico |
| Rigor | Maior (mais estrito) | Menor (mais tolerante) |
| Consequência da violação | Trabalho de confiabilidade, congelamento de funcionalidades | Créditos de serviço, multas |
Boa prática: defina seu SLO mais estrito do que seu SLA. A folga entre SLO e SLA é a margem de segurança que impede que um incidente de confiabilidade dispare penalidades contratuais. Se o SLA é 99,9%, o SLO pode ser 99,95%.
Boas práticas
| Prática | Justificativa |
|---|---|
| Menos SLIs, mais significativos | Dois ou três indicadores bem escolhidos superam dez ruidosos. Comece por disponibilidade e latência P99. |
| Janelas móveis de 28 dias | Quatro semanas sempre contêm o mesmo número de dias úteis e de fins de semana, então o SLI não é distorcido por meses de calendário de tamanhos diferentes. |
| Automatize os dashboards de SLO | O cálculo manual é sujeito a erros e lento demais. Grafana + Prometheus ou o Cloud Monitoring devem mostrar a conformidade atual com o SLO em tempo real. |
| Revise os SLOs a cada trimestre | As expectativas dos usuários e as capacidades do sistema evoluem. SLOs corretos no lançamento podem precisar de ajuste após um ano de crescimento. |
| Nunca defina SLO = 100% | 100% é inalcançável e não deixa espaço para manutenção planejada nem para deploys seguros. |
Armadilhas comuns
- Medir a coisa errada: um SLI calculado só a partir do endpoint de health check não diz nada sobre
POST /orders. - Médias em vez de percentis: uma latência média de 80 ms pode esconder 5% dos usuários esperando 4 s. Use percentis ou "fração das requisições mais rápidas que X".
- Misturar janelas: um error budget calculado em 30 dias comparado com um SLO em 28 dias leva a decisões erradas.
- SLO sem política: se nada muda quando o orçamento acaba, o SLO é só um número em um dashboard.
Pontos-chave
- Um SLI é a razão entre eventos bons e eventos válidos que reflete o que os usuários sentem; um SLO é uma meta para ele em uma janela; um SLA é um contrato com penalidades, mais frouxo que o SLO.
- O error budget é 1 − SLO, em tempo ou em requisições: 99,9% em 28 dias ≈ 40,3 minutos (≈ 43,8 minutos em um mês de 30,44 dias).
- Burn rate = taxa de erros observada ÷ orçamento; 14,4× esvazia um orçamento de 28 dias em cerca de 2 dias e deve acionar alguém.
- O orçamento transforma "lançar ou congelar?" em uma decisão baseada em dados — se houver uma política acordada.
- Sempre informe a janela e use percentis, nunca médias, para latência.
-
BEYER, B. et al. Site Reliability Engineering. Google / O'Reilly, 2016. Capítulos 3–4 (Embracing Risk; Service Level Objectives). ↩
-
BEYER, B. et al. The Site Reliability Workbook. Google / O'Reilly, 2018. Capítulo 2 — Implementing SLOs; Capítulo 5 — Alerting on SLOs. ↩↩↩
-
AWS Service Level Agreements. Amazon Web Services. ↩
-
Google Cloud Service Level Agreements. Google LLC. ↩