Skip to main content

Visão Geral

A plataforma AIOps do ChatCLI gerencia incidentes através de uma máquina de estados bem definida com 6 estados para incidentes e 6 estados para planos de remediação. Entender este ciclo de vida é essencial para operadores que precisam intervir quando a remediação automática falha.

Estados do Incidente

Novo estado Contained (chaos test 2026-05-23, GAP-03) — Antes deste fix, qualquer ação ScaleDeployment replicas=0 containment=true declarava o Issue como Resolved, mascarando indisponibilidade real. Agora a plataforma transita para Contained, que:
  • NÃO é terminal (auto-resolve quando o recurso volta com replicas > 0 E todos os pods ready)
  • Bloqueia o PostMortem de fechar (requiresHumanAction: true) até o operador confirmar via API ou anotação
  • Dispara notificações em política configurada para o estado Contained
  • É contado separadamente em analytics/summary.containedIssues
Configure uma NotificationPolicy com states: [Contained] para garantir que humanos sejam paginados quando isso acontecer.

Fluxo da Máquina de Estados

Fase de Detecção (Detected)

Quando o watcher bridge detecta anomalias, o correlation engine as agrupa em incidentes:
  1. Pontuação de sinal — cada tipo de sinal tem um peso (OOMKill=40, ErrorRate=30, PodRestart=25, etc.)
  2. Cálculo do risk score — agregado de todas as anomalias correlacionadas
  3. Determinação da severidade — Critical (risk > 80), High (> 60), Medium (> 40), Low (demais)
  4. Geração do ID do incidente — formato: INC-AAAAMMDD-NNN
  5. Máximo de tentativas de remediação configurado para 5 (padrão, configurável via Instance aiops.maxRemediationAttempts)

Fase de Análise (Analyzing)

O sistema cria um AIInsight CR para análise via IA. Durante a detecção, TODOS os runbooks candidatos são injetados no contexto da IA para validação.
  1. Descoberta de runbooks candidatos (em camadas):
    • Camada 1: Todos os runbooks com SignalType + Severity + ResourceKind
    • Camada 2: Fallback por Severity + ResourceKind
    • Multiplos runbooks podem existir por trigger (causas raiz diferentes geram runbooks diferentes)
  2. IA válida candidatos: O LLM recebe todos os runbooks candidatos e avalia cada um contra a análise de causa raiz atual:
    • RUNBOOK_APPROVED: <nome> → usa aquele runbook específico (caminho rápido)
    • RUNBOOK_REJECTED → ignora todos os candidatos, usa sugestões da IA ou modo agentico
    • Nenhum dos dois → usa primeiro candidato como default (compatibilidade)
  3. Se não ha candidatos e a IA tem ações sugeridas → gera um novo runbook
  4. Se não ha candidatos e nem ações da IA → entra no Modo Agentico (IA passo-a-passo)
  5. Transiciona para Remediating

Fase de Remediação (Remediating)

O remediation controller executa o plano usando um loop ReAct (Reason-Act-Observe):
  1. Snapshot pre-voo capturado para capacidade de rollback
  2. Para cada acao no plano:
    • OBSERVE — verifica se o recurso já está saudável (após a ação anterior). Se sim, para imediatamente sem executar as ações restantes (early exit)
    • ACT — executa a ação com checkpoint
    • Se a ação falha → rollback automático ao estado pre-voo
  3. Verificação final de saude (polling por até 90 segundos)
  4. Em caso de sucessoResolved + PostMortem gerado
  5. Em caso de falha → rollback automático tentado → re-análise com contexto da falha
Isso evita que ações contraditórias sejam executadas (ex.: AdjustResources seguido de RollbackDeployment que desfaria o ajuste) e reduz o impacto operacional ao mínimo necessário.

Mecanismo de Retry

Quando a remediação falha:
  • Tentativa < MaxAttempts (5): O sistema re-analisa com o contexto da falha injetado, potencialmente selecionando um runbook ou estratégia diferente
  • Todas as tentativas esgotadas: Transiciona para Escalated

Estado Escalated — O Que os Operadores Devem Fazer

Quando um incidente atinge Escalated, o sistema esgotou todas as opções automáticas. Veja o que acontece e o que você precisa fazer: O que o sistema faz automaticamente:
  1. Dispara a EscalationPolicy correspondente a severidade do incidente
  2. Envia notificações para L1 on-call (Slack, PagerDuty, etc.)
  3. Se não houver reconhecimento dentro do timeout configurado, escala para L2, depois L3
  4. Gera eventos de auditoria para compliance
O que os operadores devem fazer:
  1. Reconhecer o incidente (para a progressão da escalação):
  2. Investigar e corrigir o problema manualmente
  3. Resolver o incidente via um dos tres metodos: Método 1: REST API (recomendado para automacao/scripts)
    Método 2: Web Dashboard Navegue até a página de detalhes do incidente e clique no botão “Resolve”. Insira a descrição da resolução no diálogo. Método 3: Kubernetes Direto (avancado)

Auto-Resolve para Issues Escalados

Quando um incidente atinge Escalated, o sistema continua monitorando o recurso a cada 30 segundos. Se o recurso recuperar (todas as replicas saudaveis), o incidente e automaticamente resolvido com a mensagem:
“Auto-resolved: resource recovered while awaiting human intervention”
Isso cobre os casos onde:
  • Um operador corrige o problema manualmente (kubectl rollout undo, etc.) sem usar a API
  • O recurso se auto-corrige (ex: problema de rede transitorio se resolve)
  • Um pipeline de CI/CD implanta uma correção enquanto o incidente ainda está aberto
O auto-resolve pode ser desabilitado via Instance CRD: spec.aiops.enableAutoResolve: false

Parâmetros AIOps Configuraveis

Todos os parâmetros de timing e retry são configuraveis via a seção aiops do Instance CRD:
Runbooks auto-gerados pela IA (tanto standard quanto agenticos) herdam automaticamente o valor de maxRemediationAttempts da configuração do Instance. Runbooks criados manualmente via YAML ou API usam o default do CRD (maxAttempts: 3) a menos que especificado explicitamente.

Estados do Plano de Remediação

Cada incidente pode ter múltiplos planos de remediação (um por tentativa):

Modo de Remediação Agentico

Quando nenhum runbook corresponde, o sistema usa remediação agentica dirigida por IA:
  1. IA propoe uma acao via AgenticStep RPC
  2. Acao e executada e o resultado e observado
  3. IA analisa a observacao e propoe a proxima acao
  4. Loop continua até resolver ou detectar convergencia
Guardrails de segurança:
  • Max steps: 10 (configurável via AgenticMaxSteps)
  • Max tempo: 10 minutos por plano agentico
  • Detecção de convergencia:
    • Ultimas 3 observações identicas → parada forcada
    • Padrão alternante A→B→A→B → parada forcada
    • 5 ações consecutivas falharam → parada forcada

Limiares de Confiança do Decision Engine

O decision engine determina se a remediação pode prosseguir automaticamente: Ajustes: Taxa de sucesso histórico, correspondência de padrão, hora do dia e contagem de issues ativas modificam o score base de confiança. Circuit breaker: Se 3+ remediações falharam na última hora, a auto-remediação é bloqueada inteiramente.

Rollback Engine

O rollback engine fornece redes de segurança em dois níveis:
  1. Snapshot pré-voo — capturado antes de QUALQUER ação. Restaura o estado completo do recurso.
  2. Checkpoints por acao — capturados antes de CADA acao. Permite rollback parcial.
Gatilhos de rollback automático:
  • Execução da ação falha
  • Verificação de saude expira (90 segundos)
Alvos de rollback suportados:
  • Deployment: replicas, imagens de container, limites de recursos
  • StatefulSet: replicas, imagens, recursos, partition
  • DaemonSet: imagens, recursos, max unavailable
  • Job/CronJob: suspend, deadline, backoff limit, parallelism
  • Node: uncordon (restaurar schedulable)

Tipos de Ação de Remediação

A plataforma suporta 46+ tipos de ação de remediação entre tipos de recurso:

Deployment (18 ações)

ScaleDeployment, RollbackDeployment, RestartDeployment, PatchConfig, AdjustResources, DeletePod, HelmRollback, ArgoSyncApp, AdjustHPA, RestartStatefulSetPod, CordonNode, DrainNode, ResizePVC, RotateSecret, ExecDiagnostic, UpdateIngress, PatchNetworkPolicy, ApplyManifest

StatefulSet (9 ações)

ScaleStatefulSet, RestartStatefulSet, RollbackStatefulSet, AdjustStatefulSetResources, DeleteStatefulSetPod, ForceDeleteStatefulSetPod, UpdateStatefulSetStrategy, RecreateStatefulSetPVC, PartitionStatefulSetUpdate

DaemonSet (7 ações)

RestartDaemonSet, RollbackDaemonSet, AdjustDaemonSetResources, DeleteDaemonSetPod, UpdateDaemonSetStrategy, PauseDaemonSetRollout, CordonAndDeleteDaemonSetPod

Job (9 ações)

RetryJob, AdjustJobResources, DeleteFailedJob, SuspendJob, ResumeJob, AdjustJobParallelism, AdjustJobDeadline, AdjustJobBackoffLimit, ForceDeleteJobPods

CronJob (10 ações)

SuspendCronJob, ResumeCronJob, TriggerCronJob, AdjustCronJobResources, AdjustCronJobSchedule, AdjustCronJobDeadline, AdjustCronJobHistory, AdjustCronJobConcurrency, DeleteCronJobActiveJobs, ReplaceCronJobTemplate

Sistema de Aprendizado de Runbooks

Node Failure — Fluxo de Remediação

Quando um node apresenta problemas, o watcher detecta a condição e emite anomalias automaticamente:
As ações CordonNode e DrainNode respeitam PodDisruptionBudgets e fazem eviction graceful. O contexto de node (CPU, memória, pod count, condições) e incluido na análise da IA, permitindo decisões mais precisas. A plataforma constrói uma biblioteca de estratégias aprendidas ao longo do tempo. Cada remediação bem-sucedida gera um runbook reutilizável que pode ser aplicado a incidentes futuros com a mesma causa raiz.

Como os Runbooks São Nomeados

Nomes de runbooks incluem um hash da análise de causa raiz da IA, garantindo que causas diferentes produzam runbooks diferentes:

Seleção Multi-Runbook

Quando múltiplos runbooks correspondem ao mesmo trigger (sinal + severidade + tipo), a IA recebe TODOS os candidatos e seleciona o mais apropriado:
Se nenhum dos candidatos corresponde a causa raiz atual, a IA responde com RUNBOOK_REJECTED, gera uma nova estratégia do zero, e um novo runbook e criado com hash único — expandindo a biblioteca para incidentes futuros.

Ciclo de Vida do Runbook

Com o tempo, a plataforma se torna mais rapida e precisa — falhas comuns são resolvidas via runbooks (segundos) em vez de análise completa da IA (minutos).

Geração de PostMortem

Quando um incidente e resolvido (automaticamente ou manualmente), um PostMortem CR e auto-gerado contendo:
  • Timeline — eventos cronológicos da detecção a resolução
  • Análise de causa raiz — gerada por IA com score de confiança
  • Ações executadas — histórico completo de remediação
  • Avaliação de impacto — pods, serviços e SLOs afetados
  • Lições aprendidas — recomendações da IA para prevenção
  • Correlação com Git — deploys recentes que podem ter causado o problema
  • Análise de cascata — incidentes relacionados entre servicos
PostMortems podem ser revisados e fechados via os endpoints Review PostMortem e Close PostMortem.

PostMortems com requiresHumanAction

Quando o Issue pai está em estado Contained, tanto o Issue quanto o PostMortem são gerados com os fields tipados em status (GAP-07 fix):
Comportamentos garantidos:
  • O PostMortemReconciler se recusa a transitar para Closed enquanto a anotação aiops.chatcli.io/human-action-acknowledged não for true (mesmo se alguém forçar kubectl patch)
  • Quando o auto-resolve dispara (humano restaura replicas), o controller limpa os dois fields e adiciona condition RequiresHumanAction: False — o CR nunca mente sobre o estado atual
  • A REST API expõe os fields como top-level no IncidentItem (spec.requiresHumanAction, spec.requiredAction) para dashboards renderizarem direto sem precisar fetch do PostMortem matching
Migração de schema (v1alpha1) — Na 1.122.x os fields viviam em PostMortemSpec, violando a convenção K8s (Spec = user input, Status = controller-derived facts). Pior: o valor era null em runtime porque o controller escrevia via Status().Update() enquanto o CRD declarava em Spec. O fix moveu para PostMortemStatus e adicionou em IssueStatus. O hook de upgrade de CRD (GAP-06) atualiza o schema automaticamente — não há ação manual necessária.
Para reconhecer a ação executada e desbloquear o fechamento:
No web dashboard, isso aparece como o botão “Ack Human Action” (roxo) na linha do PostMortem quando requiresHumanAction=true.

Correlação com Chaos Engineering

Issues que disparam durante uma ChaosExperiment ativa no mesmo namespace recebem automaticamente os labels:
  • platform.chatcli.io/source=chaos-experiment
  • platform.chatcli.io/chaos-experiment=<nome-do-experimento>
Esses labels alteram o comportamento da plataforma: Veja Chaos Engineering para detalhes da CR e do controller.

Integração com SLA

Cada severidade de incidente pode ter uma configuração de SLA:
  • Tempo de resposta — tempo máximo da detecção até a primeira análise
  • Tempo de resolução — tempo máximo da detecção até a resolução
  • Horario comercial — opcionalmente pausar o relogio do SLA fora do horario comercial
  • Política de escalação — disparada automaticamente na violação do SLA