Skip to main content
Este cookbook mostra o fluxo completo de um incidente na plataforma AIOps do ChatCLI — desde a detecção automática até o post-mortem com lições aprendidas. Nomes, horários e valores abaixo são ilustrativos; os nomes dos objetos seguem os padrões que o operator realmente usa.
O passo a passo assume um operator instalado pelo chart Helm em chatcli-system, uma Instance pronta com o watcher habilitado (o pipeline AIOps fala com a primeira Instance pronta do cluster, então rode uma por cluster), uma ApprovalPolicy que exige aprovação para esta mudança e uma NotificationPolicy que encaminha o Issue para o Slack. Anomalies, Issues, AIInsights, RemediationPlans, ApprovalRequests e PostMortems são criados no namespace do workload (production aqui), não no namespace do operator.

Anatomia de um Incidente

Cenário: OOMKill em Produção

1. Detecção Automática

O Watcher detecta que pods do payment-service estão sendo OOMKilled:

2. Issue Criado

O CorrelationEngine agrupa em um Issue as anomalias não correlacionadas do mesmo recurso nos últimos 10 minutos. O risk score é a soma dos pesos dos sinais (oom_kill 40 + memory_high 15 = 55), e um Issue aberto por uma anomalia oom_kill é sempre critical:
O incident ID INC-YYYYMMDD-NNN é um label (uma sequência por namespace e por dia); o nome do Issue é <recurso>-<sinal>-<unix time>.

3. Notificação Enviada

O NotificationReconciler compara o Issue com as suas NotificationPolicies e o envia aos canais delas (Slack, PagerDuty, Opsgenie, email, webhook ou Teams). Canais, roteamento, throttling e escalação estão em Notificações. Sem NotificationPolicy, nada é enviado.

4. IA Analisa o Problema

O IssueReconciler transforma as ações sugeridas em um Runbook (auto-oom-kill-critical-deployment-<hash>), a menos que já exista um Runbook correspondente, e cria o RemediationPlan payment-service-oom-kill-1773933601-plan-1.

5. Aprovação Necessária

Antes de executar, o RemediationReconciler consulta as ApprovalPolicies. Aqui uma política exige aprovação para mudanças de recursos em produção, então o plano espera em WaitingApproval:
Mesmo sem ApprovalPolicy casando, o plano ainda pode ficar retido: pelo tier do cluster (quando CHATCLI_OPERATOR_CLUSTER_NAME aponta para um ClusterRegistration cujo tier exige aprovação) ou pelo decision engine opt-in, que nunca executa sozinho um Issue critical. Essas solicitações usam as políticas sintéticas cluster-tier e decision-engine: um aprovador, timeout de 30 minutos.
Opção A — Aprovar via kubectl:
O valor é aprovador:motivo. O operator acrescenta a decisão em status.decisions e remove a annotation; uma regra de quorum precisa de uma annotation por aprovador até atingir requiredApprovers. Use platform.chatcli.io/reject para rejeitar. Opção B — Aprovar via Web Dashboard: Faça port-forward do Service do operator (kubectl -n chatcli-system port-forward svc/chatcli-operator 8090:8090), abra http://localhost:8090, informe uma API key com papel operator, vá em Approvals, digite seu nome e clique em Approve. Opção C — Aprovar via REST API:
As três opções registram uma decisão em status.decisions; o operator então aplica a regra (quorum, change window) e leva a solicitação a Approved ou Rejected. O dashboard e a REST gravam o aprovador como <nome> (api-key: <identidade>) e contam cada API key uma vez no quorum, então cada aprovador precisa da própria chave. Uma solicitação que não está mais pendente, ou que a mesma chave já decidiu, responde 409.

6. Remediação Executada

Após a aprovação, o RemediationReconciler executa:
O controller:
  1. Captura um ResourceSnapshot estruturado (replicas, imagens, requests+limits de CPU/memória, HPA min/max)
  2. Cria um ActionCheckpoint antes de cada ação
  3. Aplica AdjustResources (memória 512Mi → 1Gi)
  4. Verifica a saúde do deployment por até 90s
  5. Saudável (readyReplicas >= desired) → Completed
Proteção automática: se a ação falha (ex.: memory_limit inválido), o operator restaura o recurso para o estado do snapshot (replicas, imagens, recursos). O plano vai para RolledBack em vez de Failed. Se a verificação expira (90s sem saúde), o rollback também é executado. O campo postFailureHealthy confirma se o recurso voltou ao normal. Um plano falho ou revertido devolve o Issue para re-análise da IA com a evidência da falha, até atingir maxRemediationAttempts e o Issue escalar.

7. Issue Resolvido

  • A NotificationPolicy envia a resolução para o Slack
  • O Pattern Store (ConfigMap chatcli-pattern-store em production) registra um sucesso para oom_kill + Deployment + critical
  • As entradas de dedup do watcher para o recurso são limpas, e novas anomalias no mesmo recurso ficam suprimidas durante o cooldown de resolução (10 minutos por padrão, Instance spec.aiops.resolutionCooldownMinutes; 0 desliga)

8. PostMortem Automático

Todo plano concluído gera um PostMortem chamado pm-<issue>:
A timeline começa com um evento detected (a descrição do Issue), tem um evento por ação do plano, action_executed quando deu certo e action_failed quando falhou (em planos agênticos, o passo cuja observação falhou) e termina com resolved (o resultado do plano).

9. Revisão e Fechamento

Os dois endpoints exigem o papel operator; o corpo (reviewer, notes) é opcional. Informe o namespace: sem ?namespace=, esses endpoints de PostMortem procuram em default.
Se a remediação apenas conteve o problema (Issue Contained, PostMortem com requiresHumanAction: true), reconheça primeiro a ação pendente com POST /api/v1/postmortems/{name}/ack-human-action: um PostMortem fechado sem esse reconhecimento volta para Open.

Operação do Dia a Dia

Monitorar via CLI

Monitorar via API

A API REST permite 600 requisições por minuto por API key válida (30 por minuto por host de cliente sem chave); scripts que fazem polling devem ficar abaixo disso.

Runbooks Customizados

Runbooks casam por severidade + tipo de recurso (e por tipo de sinal, preferido quando bate). O operator busca Runbooks em todos os namespaces, então um Runbook vale para Issues correspondentes no cluster inteiro.

Métricas Importantes

Configure alertas no Prometheus/Grafana para essas métricas. Os arquivos JSON de dashboard em deploy/grafana/ têm painéis para elas; o dashboards-configmap.yaml de lá traz só os ServiceMonitors, e o comentário do cabeçalho dele tem os comandos exatos que montam o ConfigMap a partir dos quatro arquivos (um --from-file por JSON e depois o label grafana_dashboard=1), ou importe os JSONs manualmente.