Skip to main content
A plataforma AIOps do ChatCLI gerencia Service Level Objectives (SLOs) e Service Level Agreements (SLAs) de incidentes por meio de dois CRDs Kubernetes. O controller de SLO calcula um SLI, um error budget e burn rates em múltiplas janelas (seguindo o modelo do Google SRE) e abre um 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.
Leia isto antes de desenhar seus SLOs. O controller de SLO não consulta o Prometheus. Todo SLI é calculado a partir dos próprios objetos Issue e Anomaly do operator (veja a seção “Como cada indicador é medido” abaixo). metricSource: prometheus, prometheusQuery, latencyPercentile e latencyThresholdMs são aceitos pelo CRD, mas hoje não têm efeito; um SLO com metricSource: prometheus avisa isso no status com a condition MetricSourceSupported=False (reason PrometheusNotEvaluated). Se você precisa de SLOs baseados em requisições via PromQL, monte-os no seu próprio Prometheus/Alertmanager; use este CRD para acompanhar disponibilidade e error budget baseados em incidentes dos workloads que o operator observa.

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

O ServiceLevelObjective define uma meta de confiabilidade para um serviço, com acompanhamento de error budget e alertas de burn rate.
O controller escreve o status (nunca preencha à mão):

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 o availability deixa todo Issue slo_violation fora 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.0 e todos os burn rates em 0. O erro passa em silêncio.

SLOTarget

SLOAlertPolicy

BurnRateWindow

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.
Para um SLO de availability em uma janela de 30 dias, isso significa:
Os campos de status derivam dele:
Uma meta de 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.
O controller sempre calcula e publica quatro janelas fixas: 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ê listar burnRateWindows. Para um SLO de 30 dias, estes são os valores mais usados:
Para derivar um threshold: burn_rate_threshold = dias_da_janela / dias_até_esgotar. Para um SLO de 30 dias em que você quer alertar quando o budget se esgotaria em cerca de 2 dias: 30 / 2.08 = 14.4x.
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 de availability 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.
A API REST do operator (header 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

Um IncidentSLA define as metas de resposta e resolução para uma severidade. Crie um objeto por severidade.
Status escrito pelo controller:

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 todo Issue. 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 no status.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 Detected além do responseTime só é sinalizado quando passa para Analyzing/Remediating. Um Issue aberto além do resolutionTime só é sinalizado quando vira Resolved, Escalated ou Failed.
  • Um Issue que nunca passa por Analyzing nem Remediating nunca tem a resposta verificada.
  • Contained não é estado final: o relógio de resolução continua até Resolved/Escalated/Failed.
  • Cada Issue é cronometrado uma única vez. Se um Issue Escalated for 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-checked e, em caso de violação, platform.chatcli.io/sla-violated (response, resolution ou 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, activeViolations e chatcli_operator_sla_violations_total{severity,type}, e registra o SLA na Issue (annotation platform.chatcli.io/sla-name),
  • preenche lastViolationAt e a condition SLAViolation=True (reason responseViolation ou resolutionViolation),
  • grava um AuditEvent sla_breach.
Ela não notifica ninguém nem escala por conta própria. Para ser avisado, crie um alerta sobre 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

Com businessHoursOnly: 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
Com um SLA high de resolutionTime: 4h:
  • Tempo SLA gasto: 105 minutos
  • Limite: 240 minutos
  • DENTRO DO SLA
Para incidentes critical, considere deixar businessHoursOnly desligado e usar clock 24/7. Problemas críticos em produção não devem aguardar o próximo dia útil. O horário comercial é definido por IncidentSLA, então cada severidade pode ter a sua escolha.

Cálculo do CompliancePercentage

  • totalIssuesTracked conta os Issues quando eles fecham (Resolved, Escalated ou Failed). totalViolations conta 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 IncidentSLA tem 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.
  • averageResponseTime e averageResolutionTime sã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 condition Analyzing do 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

Roteie os Issues que ele abre com uma regra de NotificationPolicy (veja Notificações):

SLAs de Incidente: Critical 5min/1h (24/7), Demais em Horário Comercial

Um IncidentSLA 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)

O SLI conta as Anomalies com 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 em deploy/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.
Importando os dashboards (a partir de um checkout do repositório do chatcli):

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.
Alertas Prometheus recomendados:

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