Issue quando uma janela de burn rate dispara. O controller de SLA cronometra cada Issue contra metas de resposta e resolução por severidade, com horário comercial opcional.
SLO vs SLA: Entendendo a Diferença
A boa prática é definir SLOs mais rigorosos que os SLAs. Se seu SLA garante 99.9%, defina o SLO em 99.95%. Isso cria uma margem de segurança (error budget interno) que permite detectar degradações antes que o SLA seja violado.
ServiceLevelObjective CRD
OServiceLevelObjective define uma meta de confiabilidade para um serviço, com acompanhamento de error budget e alertas de burn rate.
Campos do Spec
Raiz
SLOIndicator
Como cada indicador é medido
Todas as buscas ficam restritas ao namespace do próprio SLO. Issues e Anomalies são criados no namespace do workload afetado, então o SLO precisa morar lá também.
Na prática, isso significa:
availabilityé o único indicador baseado em tempo, e o único cujo error budget corresponde a “downtime permitido”. Minutos de Issues sobrepostos são somados: dois Issues simultâneos no mesmo serviço contam em dobro.- Os indicadores baseados em anomalias medem a proporção de anomalias de um tipo, e não uma proporção de requisições. Sem nenhuma anomalia na janela, o SLI é
1.0. Se todas as anomalias da janela forem do tipo contado, o SLI é0. - Os Issues que o próprio SLO abre levam o label
platform.chatcli.io/service=<serviceName>, mas oavailabilitydeixa todo Issueslo_violationfora dos minutos de incidente: o page é consequência do downtime, não mais downtime, então um Issue de violação de SLO aberto não aprofunda a violação. - Uma janela que não pode ser interpretada (veja abaixo) vira zero, o que deixa o SLI em
1.0e todos os burn rates em0. O erro passa em silêncio.
SLOTarget
SLOAlertPolicy
BurnRateWindow
- Availability
- Error Rate
- Latency
- Throughput
Como Funciona o Cálculo (Google SRE Model)
O controller reconcilia cada SLO a cada 60 segundos e também sempre que o SLO ou um dos Issues que ele possui muda.Error Budget
O error budget é a quantidade máxima de “erro” permitida dentro da janela do SLO.availability em uma janela de 30 dias, isso significa:
Os campos de status derivam dele:
100 tem budget zero: o budget fica inteiro (SLI = 1) ou esgotado.
Burn Rate
O burn rate indica a velocidade com que o error budget está sendo consumido.burnRate1h, burnRate6h, burnRate24h e burnRate72h. As janelas que você lista em burnRateWindows são calculadas à parte a cada reconcile, só para decidir se o alerta dispara.
1
Calcular a taxa de erro em cada janela
2
Calcular o burn rate
Divida a taxa de erro pelo error budget.
3
Verificar as duas janelas
Um alerta só dispara quando o burn rate é >= threshold na janela curta E na longa.
4
Abrir um Issue
Um alerta novo registra uma entrada em
status.activeAlerts, incrementa chatcli_operator_slo_violations_total, grava um AuditEvent slo_violation e abre um Issue (veja “O que dispara e quando”). Esse Issue segue o fluxo normal de incidentes: notificações, escalação e cronometragem de SLA.Multi-Window Alerting: Thresholds Recomendados
Não existem janelas embutidas: nada dispara até você listarburnRateWindows. Para um SLO de 30 dias, estes são os valores mais usados:
Esses thresholds foram pensados para SLIs baseados em requisições. Eles servem para o indicador
availability, que é baseado em tempo. Nos indicadores de proporção de anomalias, o burn rate anda em saltos grandes: uma anomalia error_rate entre 2 na janela dá taxa de erro de 0.5, ou seja, burn rate de 500x para uma meta de 99.9%. Escolha metas e thresholds desses indicadores levando isso em conta.Exemplo Numérico Completo
Considere um SLO deavailability de 99.9% em 30 dias para o api-gateway, com um único incidente: um Issue no api-gateway foi detectado há 20 horas e resolvido 20 minutos depois.
Error Budget Tracking
Campos de Status
O CRD não tem campo de estado; a API REST deriva
Healthy/AtRisk/Breached do status (veja “Consultando SLOs” abaixo). Não existem thresholds de aviso de budget (50/25/10%). Monte esses avisos como alertas do Prometheus sobre chatcli_operator_slo_error_budget_remaining (veja “Prometheus Metrics” abaixo).
O que dispara e quando
Os Issues abertos por um SLO têm
spec.source: watcher, spec.signalType: slo_violation, spec.resource = indicator.resource (ou o próprio SLO, se não definido), um riskScore baseado no budget consumido (degraus 50/75/90/100), os labels platform.chatcli.io/signal=slo_violation e platform.chatcli.io/service=<serviceName> e as annotations platform.chatcli.io/slo-name, slo-window e burn-rate. O SLO é o dono deles, então apagar o SLO apaga esses Issues.
Um budget que se recupera e se esgota de novo aciona de novo: cada esgotamento abre exatamente um Issue.
Consultando SLOs
CURRENT é uma fração, não um percentual. BUDGETREMAINING% é o status.errorBudgetRemainingPercentage, a parcela do budget que resta, em percentual.X-API-Key, role viewer ou superior) expõe os SLOs em modo somente leitura:
Cada SLO nas respostas REST também traz
burnRate1h, burnRate6h, burnRate24h, burnRate72h, activeAlerts (quantos alertas estão disparados), errorBudgetUsed (a parte consumida, na mesma unidade de errorBudgetTotal) e um state derivado:
Em
/budget, burnRate é o burn rate de 1 hora (1.0 = consumindo o budget exatamente no ritmo permitido). GET /api/v1/analytics/summary conta os SLOs AtRisk e Breached em slosAtRisk.
IncidentSLA CRD
UmIncidentSLA define as metas de resposta e resolução para uma severidade. Crie um objeto por severidade.
Campos do Spec
responseTime e resolutionTime aceitam dias inteiros na frente de uma duração Go (1d, 2d12h); semanas e dias fracionados (1.5d) não são aceitos. O CRD valida o padrão, então o API server recusa um valor malformado. Um valor que passa no padrão mas ainda não pode ser usado (por exemplo 0m) coloca a condition Ready=False com reason InvalidDuration, e o SLA não é aplicado até ser corrigido; um SLA válido informa Ready=True.Qual SLA vale para um Issue
O controller avalia todoIssue. Ele usa o primeiro IncidentSLA com a severidade do Issue no namespace do Issue. Se não houver, usa o primeiro com essa severidade encontrado em qualquer namespace. Assim dá para manter um conjunto padrão para o cluster inteiro em um namespace e sobrescrevê-lo por namespace. Mantenha um único IncidentSLA por severidade em cada namespace: com vários, não está definido qual vence.
Como resposta e resolução são medidas
O relógio começa nostatus.detectedAt do Issue (ou na sua criação).
A cronometragem tem limites que você precisa conhecer:
- As violações são detectadas nas transições de estado, não por um timer correndo. Um Issue parado em
Detectedalém doresponseTimesó é sinalizado quando passa paraAnalyzing/Remediating. Um Issue aberto além doresolutionTimesó é sinalizado quando viraResolved,EscalatedouFailed. - Um Issue que nunca passa por
AnalyzingnemRemediatingnunca tem a resposta verificada. Containednão é estado final: o relógio de resolução continua atéResolved/Escalated/Failed.- Cada Issue é cronometrado uma única vez. Se um Issue
Escalatedfor resolvido depois, ele não é reavaliado. - O controller marca o Issue com as annotations
platform.chatcli.io/sla-response-checked,platform.chatcli.io/sla-resolution-checkede, em caso de violação,platform.chatcli.io/sla-violated(response,resolutionou os dois).
O que uma violação faz
Cada violação:- adiciona um registro em
status.recentViolations(só os 50 últimos são mantidos), - incrementa
totalViolations,activeViolationsechatcli_operator_sla_violations_total{severity,type}, e registra o SLA na Issue (annotationplatform.chatcli.io/sla-name), - preenche
lastViolationAte a conditionSLAViolation=True(reasonresponseViolationouresolutionViolation), - grava um AuditEvent
sla_breach.
chatcli_operator_sla_violations_total no Prometheus.
activeViolations conta as violações cuja Issue ainda não foi resolvida. Quando a Issue chega a Resolved, as violações dela são subtraídas do SLA indicado em platform.chatcli.io/sla-name (mesmo que a severidade da Issue tenha mudado depois), e quando o valor chega a 0 a condition passa a SLAViolation=False (reason NoActiveViolation). Uma Issue que termina em Escalated ou Failed mantém as violações ativas até ser resolvida.BusinessHoursSpec
Não existe calendário de feriados: o relógio corre em todos os dias da semana listados.
Como o Clock de Business Hours Funciona
CombusinessHoursOnly: true e businessHours definido, só conta o tempo dentro da janela. Fora dela, o relógio fica pausado.
1
Incidente detectado
Issue detectado às 17:45 (sexta-feira).
2
Clock conta 15 minutos (sexta)
De 17:45 até 18:00 = 15 minutos de SLA clock.
Clock pausa às 18:00 (fim do horário comercial).
3
Fim de semana: clock pausado
Sábado e domingo não estão em
workDays.
Tempo SLA acumulado: 15 minutos.4
Segunda-feira: clock retoma
Clock retoma às 09:00 de segunda-feira.
Se o incidente é resolvido às 10:30 de segunda:
- Sexta: 15 minutos
- Segunda: 1h30 = 90 minutos
- Total SLA: 105 minutos (1h45)
5
Avaliação de compliance
Com um SLA
critical de resolutionTime: 1h:- Tempo SLA gasto: 105 minutos
- Limite: 60 minutos
- VIOLAÇÃO
high de resolutionTime: 4h:- Tempo SLA gasto: 105 minutos
- Limite: 240 minutos
- DENTRO DO SLA
Cálculo do CompliancePercentage
totalIssuesTrackedconta os Issues quando eles fecham (Resolved,EscalatedouFailed).totalViolationsconta violações: um Issue que viola resposta e resolução conta duas vezes. A compliance nunca fica abaixo de 0 e vale 100 enquanto nada foi acompanhado.- Cada
IncidentSLAtem a sua compliance, que também é a da sua severidade (chatcli_operator_sla_compliance_percentage{severity}). Os contadores são acumulados desde a criação do objeto: não existe período móvel. averageResponseTimeeaverageResolutionTimesão recalculados quando um Issue é resolvido. Eles cobrem todos os Issues daquela severidade no cluster, e não só os do namespace do SLA. O tempo de resposta vem da conditionAnalyzingdo Issue.
O relatório de compliance em
GET /api/v1/analytics/compliance cobre o período absoluto from-to (padrão: os últimos 7 dias). Com objetos IncidentSLA no escopo, a seção de SLA conta as violações de resposta e de resolução que o controller deles registrou em cada Issue (platform.chatcli.io/sla-violated), e IncidentSLAs[] lista cada SLA com os próprios contadores (CompliancePercentage, ActiveViolations, TotalViolations, TotalIssuesTracked). Sem nenhum IncidentSLA, ele volta a contar todo Issue Escalated como violação de resolução. O relatório mantém as chaves JSON em PascalCase, e as durações vêm em nanossegundos. GET /api/v1/policies/sla lista os objetos IncidentSLA (somente leitura, role viewer).Exemplos YAML Completos
SLO de 99.9% Availability com Burn Rate Alerting
NotificationPolicy (veja Notificações):
SLAs de Incidente: Critical 5min/1h (24/7), Demais em Horário Comercial
UmIncidentSLA por severidade:
medium-sla e low-sla usam os padrões de businessHours (09:00-18:00, segunda a sexta). O objeto precisa estar presente mesmo assim: businessHoursOnly: true sem businessHours volta para o clock 24/7.SLO de Latência para um Deployment (Baseado em Anomalias)
signalType: latency (geradas pelo watcher a partir de alertas HighLatency/Latency) contra todas as Anomalies do payment-service na janela.
Grafana Dashboards
O repositório traz 4 dashboards Grafana emdeploy/grafana/, construídos sobre as métricas do operator:
SLO Burn Rate & SLA Compliance
slo-burn-rate.json: error budget restante, SLI atual, burn rate por janela fixa (1h/6h/24h/72h) contra as linhas de referência de 14.4/6/3/1x, tempo até esgotar o budget, compliance de SLA, distribuição dos tempos de resposta/resolução e violações por tipo.Remediation Stats & Operator Health
remediation-stats.json: estatísticas de remediação, mais uma seção de SLA com compliance e p95 dos tempos de resposta/resolução por severidade.AIOps Overview
aiops-overview.json: visão geral da plataforma com issues, anomalias e remediações.Incident Timeline & Workflows
incident-timeline.json: fluxo dos incidentes da detecção à análise, remediação e resolução.Prometheus Metrics
O operator expõe estas métricas na sua porta de métricas (8080, path /metrics).
Métricas de SLO
Métricas de SLA
Os gauges só são atualizados enquanto o SLO ou o SLA é reconciliado. Apagar um SLO não remove os últimos valores dele do
/metrics até o operator reiniciar.Próximo Passo
Notificações e Escalação
Sistema de notificação multicanal e escalação automática
Workflow de Aprovação
Controle de mudanças com políticas de aprovação e blast radius
AIOps Platform
Aprofundamento na arquitetura AIOps
K8s Operator
Configuração do operator e CRDs