Pular para o conteúdo principal
O ChatCLI Operator vai além do gerenciamento de instâncias. Ele implementa uma plataforma AIOps completa que detecta anomalias autônomamente, correlaciona sinais, solicita análise de IA e executa remediação — tudo sem dependências externas além do provedor LLM. A plataforma suporta Deployments, StatefulSets, DaemonSets, Jobs e CronJobs, integra-se com Helm, ArgoCD e Flux para remediação GitOps-aware, analisa logs de aplicação com extração de stack traces (Java, Go, Python, Node.js), correlaciona métricas Prometheus com incidentes, e permite vincular repositórios de código-fonte para diagnóstico code-aware.

API Group e CRDs

O operator usa o API group platform.chatcli.io/v1alpha1 com 17 Custom Resource Definitions:
CRDShort NameDescrição
InstanceinstInstância do servidor ChatCLI (Deployment, Service, RBAC, PVC)
AnomalyanomSinal bruto do K8s Watcher (restarts, OOM, falhas de deploy, etc.)
IssueissIncidente correlacionado agrupando múltiplas anomalias
AIInsightaiAnálise de causa raiz gerada por IA com contexto enriquecido (logs, métricas, código, GitOps)
RemediationPlanrpAções concretas para resolver o problema (runbook ou IA agêntica)
RunbookrbProcedimentos operacionais manuais (opcional)
PostMortempmRelatório de incidente auto-gerado após resolução (todos os modos)
SourceRepositorysrcrepoVincula workloads a repositórios git para diagnóstico code-aware
NotificationPolicynpPolítica de notificações multi-canal com throttling e templates
EscalationPolicyepCadeia de escalação com níveis e timeouts (L1→L2→L3)
ServiceLevelObjectivesloSLO com burn rate alerting multi-janela (modelo Google SRE)
IncidentSLAslaSLA de resposta/resolução por severidade com business hours
ApprovalPolicyapPolítica de aprovação auto/manual/quorum com change windows
ApprovalRequestarWorkflow de aprovação com blast radius e evidências
ClusterRegistrationcrFederação multi-cluster com kubeconfig e health check
AuditEventaeTrilha de auditoria imutável (append-only)
ChaosExperimentchaosExperimentos de chaos engineering com 7 tipos e safety checks
Para documentação detalhada de cada componente da plataforma AIOps, consulte as páginas dedicadas em AIOps Platform.

Instalação do Operator

Um único comando instala tudo: 17 CRDs + RBAC + Deployment + Service + Dashboard.
Instala direto do GHCR — não precisa clonar o repositório:
helm install chatcli-operator \
  oci://ghcr.io/diillson/charts/chatcli-operator \
  --namespace chatcli-system \
  --create-namespace
Para fixar uma versão específica:
helm install chatcli-operator \
  oci://ghcr.io/diillson/charts/chatcli-operator \
  --version 1.139.0 \
  --namespace chatcli-system \
  --create-namespace
O chart do operator (chatcli-operator) é separado do chart do server (chatcli). O operator gerencia os controllers e o dashboard AIOps. O server é deployado via Instance CR ou pelo chart chatcli com watcher habilitado.
# Com Prometheus para métricas de incidentes
helm install chatcli-operator \
  oci://ghcr.io/diillson/charts/chatcli-operator \
  --namespace chatcli-system --create-namespace \
  --set prometheusUrl="http://prometheus-server.monitoring.svc:9090"

# Com imagem customizada
helm install chatcli-operator \
  oci://ghcr.io/diillson/charts/chatcli-operator \
  --namespace chatcli-system --create-namespace \
  --set image.repository=myregistry/chatcli-operator \
  --set image.tag=1.139.0

# Com ServiceMonitor para Prometheus Operator
helm install chatcli-operator \
  oci://ghcr.io/diillson/charts/chatcli-operator \
  --namespace chatcli-system --create-namespace \
  --set serviceMonitor.enabled=true
ValorPadrãoDescrição
image.repositoryghcr.io/diillson/chatcli-operatorImagem do operator
image.taglatestTag da imagem
replicaCount1Réplicas (leader election ativo por padrão)
api.port8090Porta do dashboard web e REST API
prometheusUrl""URL do Prometheus para coleta de métricas
leaderElecttrueLeader election para HA
serviceMonitor.enabledfalseCriar ServiceMonitor para Prometheus Operator
kubectl apply -f operator/config/crd/bases/
kubectl apply -f operator/config/rbac/role.yaml
kubectl apply -f operator/config/manager/manager.yaml
# Build a partir da raiz do repositório
docker build -f operator/Dockerfile -t myregistry/chatcli-operator:dev .

# Ou via Make
cd operator
make docker-build IMG=myregistry/chatcli-operator:dev
make docker-push IMG=myregistry/chatcli-operator:dev

Arquitetura da Plataforma AIOps

O que o Operator Gerencia

Além dos CRDs e reconcilers, o operator provê:
  • REST API Gateway (:8090) com 30+ endpoints para incidents, SLOs, approvals, analytics, clusters e audit
  • Web Dashboard embutido acessível em http://operator:8090/
  • Grafana dashboards pré-configurados disponíveis em deploy/grafana/ para importação automática via sidecar
  • 20+ métricas Prometheus cobrindo issues, remediações, SLOs, notificações e aprovações

Pipeline Autônomo

FaseComponenteO que Faz
1. DetecçãoWatcherBridgeConsulta GetAlerts do servidor a cada 30s. Cria Anomaly CRs (dedup SHA256). Invalida dedup quando Issue atinge estado terminal.
2. CorrelaçãoAnomalyReconciler + CorrelationEngineAgrupa anomalias por recurso + janela temporal. Calcula risk score e severidade. Cria/atualiza Issue CRs com signalType.
3. AnáliseAIInsightReconciler + 6 enrichersColeta contexto K8s (Deployments, StatefulSets, DaemonSets, Jobs, CronJobs, HPAs), análise avançada de logs (stack traces Java/Go/Python/Node.js, 24+ error patterns), métricas Prometheus (CPU/mem/latency trends), GitOps (Helm/ArgoCD/Flux status), código-fonte (correlação commit↔incidente), cascade analysis (cross-service).
4. RemediaçãoIssueReconcilerSelecao de runbook validada por IA: (a) encontra TODOS os runbooks candidatos (multi-runbook por trigger), (b) IA válida cada um contra a causa raiz (RUNBOOK_APPROVED: nome ou RUNBOOK_REJECTED), (c) se rejeitado ou sem candidatos, gera novo runbook das sugestões da IA (com hash único por causa raiz), ou (d) remediação agentica (IA atua step-by-step).
5. ExecuçãoRemediationReconciler54 tipos de ação: workload (Scale, Restart, Rollback, AdjustResources, DeletePod, RestartStatefulSetPod), StatefulSet (ScaleStatefulSet, RestartStatefulSet, RollbackStatefulSet, AdjustStatefulSetResources, DeleteStatefulSetPod, ForceDeleteStatefulSetPod, UpdateStatefulSetStrategy, RecreateStatefulSetPVC, PartitionStatefulSetUpdate), DaemonSet (RestartDaemonSet, RollbackDaemonSet, AdjustDaemonSetResources, DeleteDaemonSetPod, UpdateDaemonSetStrategy, PauseDaemonSetRollout, CordonAndDeleteDaemonSetPod), Job (RetryJob, AdjustJobResources, DeleteFailedJob, SuspendJob, ResumeJob, AdjustJobParallelism, AdjustJobDeadline, AdjustJobBackoffLimit, ForceDeleteJobPods), CronJob (SuspendCronJob, ResumeCronJob, TriggerCronJob, AdjustCronJobResources, AdjustCronJobSchedule, AdjustCronJobDeadline, AdjustCronJobHistory, AdjustCronJobConcurrency, DeleteCronJobActiveJobs, ReplaceCronJobTemplate), GitOps (HelmRollback, ArgoSyncApp), autoscaling (AdjustHPA), infra (CordonNode, DrainNode), storage (ResizePVC), security (RotateSecret), networking (UpdateIngress, PatchNetworkPolicy), advanced (ApplyManifest, ExecDiagnostic). Blast radius prediction antes da execução.
6. ResoluçãoIssueReconcilerSucesso → Resolved (invalida dedup). Falha → re-análise com contexto de falha (estratégia diferente) → até maxAttempts → Escalated.
7. PostMortemIssueReconcilerTodas as remediações (não apenas agênticas) geram PostMortem CR com timeline, causa raiz, lições, métricas, correlação git, cascade chain, trending (incidentes recorrentes), feedback do dev. Remediações bem-sucedidas também geram Runbooks reutilizáveis (um por causa raiz, nomes com hash).
8. NotificaçãoNotificationReconcilerEnvia notificações multi-canal (Slack, PagerDuty, OpsGenie, Email, Webhook, Teams) com throttling e templates. Escalação automática L1→L2→L3.
9. AprovaçãoApprovalReconcilerWorkflow de aprovação auto/manual/quorum com blast radius, change windows e integração com Decision Engine.
10. SLO MonitoringSLOReconcilerBurn rate alerting multi-janela (modelo Google SRE), error budget tracking, business hours com timezone.

Máquina de Estados do Issue

Criar Secret com API Keys

Antes de criar um Instance, você precisa de um Secret com as API keys do provedor LLM. O Instance referência este Secret via apiKeys.namesem ele, o servidor não consegue chamar a IA.
kubectl create secret generic chatcli-api-keys \
  --namespace chatcli-system \
  --from-literal=OPENAI_API_KEY="sk-sua-chave-aqui"
O Secret deve existir no mesmo namespace do Instance CR. O nome do Secret deve corresponder ao campo apiKeys.name na spec do Instance. Sem esse Secret, o servidor inicia mas não consegue executar análises de IA nem remediações agênticas.

CRD: Instance

O Instance gerencia instâncias do servidor ChatCLI no cluster.

Especificação Completa

apiVersion: platform.chatcli.io/v1alpha1
kind: Instance
metadata:
  name: chatcli-prod
  namespace: chatcli          # O namespace deve existir antes de criar o Instance
spec:
  replicas: 1
  provider: CLAUDEAI       # OPENAI, OPENAI_ASSISTANT, CLAUDEAI, BEDROCK, GOOGLEAI, XAI, ZAI, MINIMAX, MOONSHOT, OPENROUTER, STACKSPOT, OLLAMA, COPILOT, GITHUB_MODELS
  model: claude-sonnet-4-6

  image:
    repository: ghcr.io/diillson/chatcli
    tag: latest
    pullPolicy: IfNotPresent

  server:
    port: 50051
    tls:
      enabled: true
      secretName: chatcli-tls   # Deve conter tls.crt, tls.key E ca.crt (em self-signed, ca.crt=tls.crt) — ver cookbook §2.1
    token:
      name: chatcli-auth
      key: token

  watcher:
    enabled: true
    interval: "30s"
    window: "2h"
    maxLogLines: 100
    maxContextChars: 32000
    targets:
      - name: api-gateway
        namespace: production
        metricsPort: 9090
        metricsFilter: ["http_requests_*", "http_request_duration_*"]
      - name: auth-service
        namespace: production
        metricsPort: 9090
      - name: worker
        namespace: batch
      - name: postgres                  # Monitorar StatefulSet
        kind: StatefulSet
        namespace: production
      - name: fluentd-agent             # Monitorar DaemonSet
        kind: DaemonSet
        namespace: logging
      - name: etl-pipeline              # Monitorar CronJob
        kind: CronJob
        namespace: data

  resources:
    requests:
      cpu: 100m
      memory: 128Mi
    limits:
      cpu: 500m
      memory: 512Mi

  persistence:
    enabled: true
    size: 1Gi
    storageClassName: standard

  securityContext:
    runAsNonRoot: true
    runAsUser: 1000
    seccompProfile:
      type: RuntimeDefault

  apiKeys:
    name: chatcli-api-keys

  server:
    security:
      jwtSecretRef:
        name: chatcli-jwt
        key: secret
      rateLimitRps: 20
      # bindAddress: "0.0.0.0"  # Opcional — auto-detectado em Kubernetes

  extraEnv:
    - name: CHATCLI_AGENT_SECURITY_MODE
      value: "strict"
    - name: CHATCLI_AUDIT_LOG_PATH
      value: "/var/log/chatcli/audit.jsonl"

Campos do Spec

Raiz

CampoTipoObrigatórioPadrãoDescrição
replicasint32Não1Número de réplicas do servidor
providerstringSimProvedor LLM
modelstringNãoModelo LLM
imageImageSpecNãoConfiguração da imagem
serverServerSpecNãoConfiguração do servidor gRPC
watcherWatcherSpecNãoConfiguração do K8s Watcher
resourcesResourceRequirementsNãoRequests/limits de CPU e memória
persistencePersistenceSpecNãoPersistência de sessões
securityContextPodSecurityContextNãononroot/1000Security context do pod
fallbackFallbackSpecNãoCadeia de fallback entre provedores LLM
apiKeysSecretRefSpecNãoSecret com API keys (todos os providers do fallback)
aiopsAIOpsSpecNãoConfiguração do pipeline autônomo de gerenciamento de incidentes

AIOpsSpec

Configura o pipeline de remediação automatica. Todos os campos são opcionais com defaults sensiveis. Runbooks auto-gerados pela IA herdam o valor de maxRemediationAttempts desta configuração.
CampoTipoObrigatórioPadrãoRangeDescrição
maxRemediationAttemptsint32Não51-10Tentativas maximas de remediação antes de escalar para humano
resolutionCooldownMinutesint32Não100-120Minutos após resolver antes de aceitar novas anomalias do mesmo recurso
dedupTTLMinutesint32Não605-1440Tempo (min) que o cache de dedup retém hashes de alertas
enableAutoResolveboolNãotrueAuto-resolver issues Escalados quando o recurso recupera
agenticMaxStepsint32Não103-30Steps maximos por tentativa em modo agentico (cada step = 1 chamada a IA)
spec:
  aiops:
    maxRemediationAttempts: 5
    resolutionCooldownMinutes: 10
    dedupTTLMinutes: 60
    enableAutoResolve: true
    agenticMaxSteps: 10
No modo agentico, o postmortem inclui o raciocinio completo da IA em cada step — qual ação foi escolhida, por que, e o resultado observado. Isso garante auditoria total das decisoes autonomas da IA.

FallbackSpec

Configura failover automático entre provedores LLM. Quando o provedor primário falha (rate limit, timeout, erro de servidor), o sistema tenta automaticamente o próximo provedor na cadeia.
CampoTipoObrigatórioPadrãoDescrição
enabledboolSimAtiva a cadeia de fallback
providers[]FallbackProviderEntrySimLista ordenada de provedores fallback (primeiro = maior prioridade)
maxRetriesint32Não2Retentativas por provedor antes de ir para o próximo
cooldownBasestringNão"30s"Cooldown inicial após falha (backoff exponencial)
cooldownMaxstringNão"5m"Cooldown máximo

FallbackProviderEntry

CampoTipoObrigatórioDescrição
namestringSimNome do provedor: OPENAI, OPENAI_ASSISTANT, CLAUDEAI, BEDROCK, GOOGLEAI, XAI, ZAI, MINIMAX, MOONSHOT, OPENROUTER, STACKSPOT, OLLAMA, COPILOT, GITHUB_MODELS
modelstringNãoModelo LLM para este provedor
O provedor primário (spec.provider) é sempre tentado primeiro. Os provedores em fallback.providers são tentados na ordem listada quando o primário falha. O Secret em apiKeys deve conter as API keys de todos os provedores na cadeia.

WatcherSpec

CampoTipoObrigatórioPadrãoDescrição
enabledboolNãofalseAtiva o watcher
targets[]WatchTargetSpecNãoLista de recursos a monitorar (multi-target)
deploymentstringNãoDeployment único (legado)
namespacestringNãoNamespace do deployment (legado)
intervalstringNão"30s"Intervalo de coleta
windowstringNão"2h"Janela de observação
maxLogLinesint32Não100Max linhas de log por pod
maxContextCharsint32Não32000Budget de contexto LLM

WatchTargetSpec

CampoTipoObrigatórioPadrãoDescrição
namestringSim*Nome do recurso a monitorar (ex: postgres, fluentd)
deploymentstringNãoAlias deprecated para name — mantido para compatibilidade
kindstringNãoDeploymentTipo do recurso: Deployment, StatefulSet, DaemonSet, Job, CronJob
namespacestringSimNamespace do recurso
metricsPortint32Não0Porta Prometheus (0 = desabilitado)
metricsPathstringNão/metricsPath do endpoint Prometheus
metricsFilter[]stringNãoFiltros glob para métricas
Use name + kind para monitorar qualquer tipo de workload Kubernetes. Quando kind é omitido, assume Deployment. O campo legado deployment ainda funciona como alias para name. Exemplos:
targets:
  - name: api-gateway             # Deployment (kind padrão)
    namespace: production
  - name: postgres                # StatefulSet (banco de dados)
    kind: StatefulSet
    namespace: production
  - name: fluentd                 # DaemonSet (agente de logging)
    kind: DaemonSet
    namespace: logging
  - name: etl-pipeline            # CronJob (batch agendado)
    kind: CronJob
    namespace: data
O pipeline AIOps usará automaticamente ações de remediação específicas para cada tipo (ex: ScaleStatefulSet, RestartDaemonSet, SuspendCronJob) com base no kind detectado.

Recursos Criados pelo Instance

RecursoNomeDescrição
Deployment<name>Pods do servidor ChatCLI
Service<name>Service gRPC (headless automático quando réplicas > 1 para LB client-side)
ConfigMap<name>Variáveis de ambiente (provider, model, etc.)
ConfigMap<name>-watch-configYAML multi-target (se targets definido)
ServiceAccount<name>Identity para RBAC
Role<name>-watcherPermissões K8s do watcher (single-namespace)
RoleBinding<name>-watcherBinding da SA ao Role (single-namespace)
ClusterRoleBinding<namespace>-<name>-watcherBinding da SA à ClusterRole compartilhada (multi-namespace)
PVC<name>-sessionsPersistência (se habilitada)

Balanceamento gRPC

O gRPC usa conexões HTTP/2 persistentes que fixam em um único pod via kube-proxy, deixando réplicas extras ociosas.
  • 1 réplica (padrão): Service ClusterIP padrão
  • Múltiplas réplicas: Service headless (ClusterIP: None) é criado automaticamente, habilitando round-robin client-side via resolver dns:/// do gRPC
  • Keepalive: WatcherBridge faz ping a cada 30s (timeout de 5s) para detectar pods inativos rapidamente. O servidor aceita pings com intervalo mínimo de 20s (EnforcementPolicy.MinTime)
  • Transição: Ao escalar de 1 para 2+ réplicas (ou voltar), o operator deleta e recria o Service automaticamente (ClusterIP é imutável no Kubernetes)

RBAC Automático

  • Same namespace (todos os targets no mesmo namespace do Instance): Cria Role + RoleBinding por Instance
  • Cross-namespace (targets em namespace diferente do Instance, ou em múltiplos namespaces): Cria apenas ClusterRoleBinding por Instance, referenciando a ClusterRole compartilhada chatcli-watcher (pré-provisionada pelo Helm chart / kustomize)
  • Na deleção do CR, o ClusterRoleBinding é removido pelo finalizer; a ClusterRole compartilhada permanece (é propriedade do release)
A partir da v1.139.0, o operator não cria mais ClusterRole em runtime (hardening H5). As ClusterRoles compartilhadas — chatcli-watcher para o watcher e chatcli-role-{viewer,operator,admin,superadmin} para as platform roles — são instaladas pelo Helm chart do operator. O ServiceAccount do operator tem o verb bind restrito a esses nomes específicos via resourceNames, impedindo escalonamento de privilégio mesmo em caso de comprometimento.
Upgrade a partir de v1.105.0: clusters com Instances multi-namespace pré-existentes tinham um ClusterRoleBinding apontando para uma ClusterRole por-Instance (formato antigo). Como roleRef é imutável no Kubernetes, um helm upgrade direto travava o reconcile com cannot change roleRef. A partir de v1.139.0, o operator detecta o roleRef divergente no início de reconcileClusterRBAC, deleta o CRB obsoleto e recria apontando para chatcli-watcher — migração transparente, sem intervenção manual.

Imagem do Servidor e Auto-Resolução

A tag da imagem do servidor (spec.image.tag) segue três níveis de prioridade:
  1. Pin explícito em spec.image.tag — honrado literalmente (GitOps-friendly).
  2. Omitido — o operator resolve a partir do env var CHATCLI_OPERATOR_APP_VERSION, que o Helm chart injeta automaticamente a partir de .Chart.AppVersion. Efeito: helm upgrade chatcli-operator rola o servidor de todas as Instances que optaram por esse modo, sem patch manual.
  3. Fallbacklatest quando nenhum dos dois está presente (ex.: make deploy sem Helm).
apiVersion: platform.chatcli.io/v1alpha1
kind: Instance
metadata:
  name: chatcli-prod
spec:
  image:
    repository: ghcr.io/diillson/chatcli
    # tag omitido → herda appVersion do chart (recomendado p/ ambientes que atualizam via Helm)
  provider: CLAUDEAI
  model: claude-sonnet-4-6
  replicas: 2
Para ambientes que querem versionamento imutável, continue pinando spec.image.tag e gerencie o upgrade manual. Para ambientes que querem “helm upgrade = upgrade completo”, omita a tag.

Auto-Rollout em Mudanças de Configuração

O operator monitora mudanças em ConfigMaps e Secrets referenciados pelo Instance e dispara rolling updates automaticamente via hash annotations no PodTemplate:
AnnotationFonteQuando Muda
chatcli.io/watch-config-hashConfigMap <name>-watch-configTargets do watcher alterados
chatcli.io/configmap-hashConfigMap <name>Variáveis de ambiente atualizadas
chatcli.io/secret-hashSecret referenciado em apiKeys.nameAPI keys criadas ou atualizadas
chatcli.io/tls-hashSecret referenciado em server.tls.secretNameCertificados TLS renovados
Adicionar/remover targets no watcher.targets e aplicar o Instance causa rollout automático. Criar ou atualizar o Secret de API keys e renovar certificados TLS também disparam rollout automaticamente.

Observação de Secrets e ConfigMaps

O operator observa (Watches) Secrets no namespace do Instance. Quando um Secret referenciado em apiKeys.name ou server.tls.secretName é criado ou atualizado, o reconciler é acionado automaticamente — mesmo que o Secret não existisse quando o Instance foi criado.
  • ConfigMap e Secret envFrom: Marcados como optional: true, permitindo criar o Instance antes do Secret/ConfigMap
  • Ordem flexível de deploy: Namespace → Instance → Secret/ConfigMap (qualquer ordem após o namespace)

CRDs da Plataforma AIOps

Anomaly

Representa um sinal bruto detectado pelo WatcherBridge.
apiVersion: platform.chatcli.io/v1alpha1
kind: Anomaly
metadata:
  name: watcher-highrestartcount-api-gateway-1234567890
  namespace: production
spec:
  signalType: pod_restart    # pod_restart | oom_kill | pod_not_ready | deploy_failing | error_rate | latency_spike
  source: watcher            # watcher | prometheus | manual
  severity: warning          # critical | high | medium | low | warning
  resource:
    kind: Deployment
    name: api-gateway
    namespace: production
  description: "HighRestartCount on api-gateway: container app restarted 8 times"
  detectedAt: "2026-02-16T10:30:00Z"
status:
  correlated: true
  issueRef:
    name: api-gateway-pod-restart-1771276354

Campos do Anomaly Spec

CampoTipoDescrição
signalTypeAnomalySignalTypeTipo do sinal detectado
sourceAnomalySourceOrigem da detecção (watcher, prometheus, manual)
severityIssueSeveritySeveridade do sinal
resourceResourceRefRecurso K8s afetado (kind, name, namespace)
descriptionstringDescrição legível do problema
detectedAtTimeTimestamp da detecção

Sinais Detectados (21 tipos)

Sinais do Watcher:
AlertType (Server)SignalType (Anomaly)Descrição
HighRestartCountpod_restartPod com muitos restarts (CrashLoopBackOff)
OOMKilledoom_killContainer terminado por falta de memória
PodNotReadypod_not_readyPod não está no estado Ready
DeploymentFailingdeploy_failingDeployment com Available=False
Sinais adicionais (via Prometheus, webhooks ou detecção interna):
SignalTypeDescrição
error_rateTaxa de erros HTTP elevada
latencyLatência acima do threshold
cpu_highUso de CPU elevado
memory_highUso de memória elevado
disk_pressureNode com condição DiskPressure (disco cheio ou quase)
node_not_readyNode com condição NotReady (kubelet sem resposta, falha de rede ou hardware)
memory_pressureNode com condição MemoryPressure (memória insuficiente para novos pods)
pid_pressureNode com condição PIDPressure (processos excessivos, risco de fork bomb)
network_unavailableNode com rede indisponível (CNI falhou ou interface caiu)
pvc_pendingPVC em estado Pending
ingress_errorErros no Ingress controller
hpa_maxedHPA no máximo de réplicas
job_failedJob falhou
cronjob_missedCronJob não executou no schedule
certificate_expiringCertificado TLS expirando
image_pull_errorErro ao puxar imagem do container
crashloop_backoffPod em CrashLoopBackOff
helm_release_failedHelm release em estado failed
argocd_degradedArgoCD Application degradada
config_driftDrift de configuração detectado

Monitoramento de Nodes

O watcher monitora automaticamente a saude dos nodes onde os pods dos targets estão rodando. A cada ciclo de coleta, ele:
  1. Identifica os nodes via label selector dos pods do target
  2. Coleta as 5 condições oficiais do Kubernetes: Ready, DiskPressure, MemoryPressure, PIDPressure, NetworkUnavailable
  3. Coleta métricas de CPU/memória do node (via metrics server)
  4. Conta pods ativos vs capacidade do node
  5. Verifica se o node está cordoned (unschedulable)
CondiçãoSeveridadeSignalAção disponível
Node NotReadyCRITICALnode_not_readyCordonNode, DrainNode
DiskPressureCRITICALdisk_pressureCordonNode, DrainNode
MemoryPressureCRITICALmemory_highCordonNode, DrainNode
PIDPressureWARNINGnode_not_readyCordonNode
NetworkUnavailableCRITICALnode_not_readyCordonNode, DrainNode
Cordoned (Unschedulable)WARNINGnode_not_readyInformativo
Pod capacity >90%WARNINGnode_not_readyCordonNode
As informações de node são incluidas no contexto enviado a IA para análise, permitindo que a root cause seja correlacionada com problemas de infraestrutura (ex.: “OOMKill causado por MemoryPressure no node X”).

Issue

Incidente correlacionado que agrupa anomalias e gerencia o ciclo de vida da remediação.
apiVersion: platform.chatcli.io/v1alpha1
kind: Issue
metadata:
  name: api-gateway-pod-restart-1771276354
  namespace: production
spec:
  severity: high
  source: watcher
  signalType: pod_restart        # Propagated from Anomaly for tiered Runbook matching
  description: "Correlated incident: pod_restart on api-gateway"
  resource:
    kind: Deployment
    name: api-gateway
    namespace: production
  riskScore: 65
  correlatedAnomalies:
    - name: watcher-highrestartcount-api-gateway-1234567890
    - name: watcher-oomkilled-api-gateway-1234567891
status:
  state: Analyzing          # Detected | Analyzing | Remediating | Resolved | Escalated | Failed
  remediationAttempts: 0
  maxRemediationAttempts: 5  # default: 5, configurable via Instance aiops.maxRemediationAttempts
  detectedAt: "2026-02-16T10:30:00Z"
  conditions:
    - type: Analyzing
      status: "True"
      reason: AIInsightCreated

Estados do Issue

EstadoDescrição
DetectedIssue recém-criado, aguardando análise
AnalyzingAIInsight criado, aguardando resposta da IA (ou re-análise com failure context)
RemediatingRemediationPlan em execução
ResolvedRemediação bem-sucedida (dedup invalidado para detecção de recorrência)
EscalatedMax tentativas atingido ou sem ações disponíveis (dedup invalidado)
FailedFalha terminal

AIInsight

Análise de causa raiz gerada por IA com ações sugeridas para remediação automática.
apiVersion: platform.chatcli.io/v1alpha1
kind: AIInsight
metadata:
  name: api-gateway-pod-restart-1771276354-insight
  namespace: production
spec:
  issueRef:
    name: api-gateway-pod-restart-1771276354
  provider: CLAUDEAI
  model: claude-sonnet-4-6
status:
  analysis: "High restart count caused by OOMKilled. Container memory limit (512Mi) is insufficient for the current workload pattern."
  confidence: 0.87
  recommendations:
    - "Increase memory limit to 1Gi"
    - "Investigate possible memory leak in the application"
    - "Monitor GC pressure metrics"
  suggestedActions:
    - name: "Restart deployment"
      action: RestartDeployment
      description: "Restart pods to reclaim leaked memory immediately"
    - name: "Scale up replicas"
      action: ScaleDeployment
      description: "Add more replicas to distribute memory pressure"
      params:
        replicas: "4"
  generatedAt: "2026-02-16T10:31:00Z"

Campos do AIInsight Status

CampoTipoDescrição
analysisstringAnálise de causa raiz gerada pela IA
confidencefloat64Nível de confiança da análise (0.0-1.0)
recommendations[]stringRecomendações legiveis para humanos
suggestedActions[]SuggestedActionAções estruturadas para remediação automática
generatedAtTimeQuando a análise foi gerada

SuggestedAction

CampoTipoDescrição
namestringNome legível da ação
actionstringTipo da ação (54 tipos disponíveis — ver Tipos de Ação)
descriptionstringExplicação do motivo desta ação
paramsmap[string]stringParâmetros da ação (ex: replicas: "4")

RemediationPlan

Plano concreto de remediação gerado automaticamente a partir de Runbook ou ações da IA.
apiVersion: platform.chatcli.io/v1alpha1
kind: RemediationPlan
metadata:
  name: api-gateway-pod-restart-1771276354-plan-1
  namespace: production
spec:
  issueRef:
    name: api-gateway-pod-restart-1771276354
  attempt: 1
  strategy: "Attempt 1 (AI-generated): High restart count caused by OOMKilled"
  actions:
    - type: RestartDeployment
    - type: ScaleDeployment
      params:
        replicas: "4"
  safetyConstraints:
    - "No delete operations"
    - "No destructive changes"
    - "Rollback on failure"
status:
  state: Completed           # Pending | Executing | Completed | Failed | RolledBack
  result: "Deployment restarted and scaled to 4 replicas successfully"
  startedAt: "2026-02-16T10:31:30Z"
  completedAt: "2026-02-16T10:32:15Z"

Rollback Automático e Proteção de Estado

O operator implementa um sistema de rollback automático que garante que remediações malsucedidas não deixem o cluster em estado pior do que antes. Antes de executar qualquer ação, o estado completo do recurso é capturado em um snapshot estruturado restaurável.
1

Snapshot Pré-Remediação

Antes da primeira ação, o RollbackEngine captura um ResourceSnapshot estruturado com: replicas, imagens dos containers, CPU/memory requests e limits, estado do HPA (min/max replicas), e estado do node (schedulable/unschedulable). Funciona para Deployments, StatefulSets, DaemonSets, Nodes e HPAs.
2

Checkpoint por Ação

Em planos com múltiplas ações, um ActionCheckpoint é capturado antes de cada ação individual. Isso permite saber exatamente qual ação modificou o quê e em que ponto o plano falhou.
3

Rollback Automático em Falha de Ação

Se qualquer ação falha durante a execução, o operator automaticamente restaura o recurso para o estado do PreflightSnapshot. Replicas, imagens, resources requests/limits e estado do HPA são revertidos. O plano transiciona para estado RolledBack (não Failed).
4

Rollback em Timeout de Verificação

Se todas as ações executam com sucesso mas o recurso não fica healthy dentro de 90 segundos (verification timeout), o operator também executa rollback automático para o estado pré-remediação.
5

Verificação Pós-Falha

Após o rollback, o operator verifica se o recurso voltou ao estado healthy (PostFailureHealthy). Essa informação é registrada no status do plano para auditoria e decisão sobre retry.
O que é capturado no snapshot:
RecursoCampos Capturados
Deploymentreplicas, container images, CPU/memory requests+limits, restart annotation
StatefulSetreplicas, container images, CPU/memory requests+limits
DaemonSetcontainer images, CPU/memory requests+limits
Nodeschedulable state (para reverter cordon/drain)
HPAminReplicas, maxReplicas
Exemplo de RemediationPlan com rollback executado:
apiVersion: platform.chatcli.io/v1alpha1
kind: RemediationPlan
metadata:
  name: api-gateway-plan-1
  namespace: production
status:
  state: RolledBack              # Ação falhou, rollback automático executado
  result: "Action AdjustResources (index 1) failed: invalid memory_limit | Rollback: Rolled back production/api-gateway: replicas: 5 → 3; container app: memory_limit=1Gi | Post-rollback: resource healthy"
  rollbackPerformed: true
  rollbackResult: "Rolled back production/api-gateway: replicas: 5 → 3; container app: memory_limit=1Gi"
  postFailureHealthy: true       # Recurso voltou ao normal após rollback
  preflightSnapshot:
    resourceKind: Deployment
    resourceName: api-gateway
    namespace: production
    replicas: 3
    containerImages:
      app: "ghcr.io/myorg/api-gateway:v2.1.0"
    containerResources:
      app:
        cpuRequest: "200m"
        cpuLimit: "1000m"
        memoryRequest: "256Mi"
        memoryLimit: "512Mi"
    hpaMinReplicas: 2
    hpaMaxReplicas: 8
    capturedAt: "2026-02-16T10:31:00Z"
  actionCheckpoints:
    - actionIndex: 0
      actionType: ScaleDeployment
      success: true
      timestamp: "2026-02-16T10:31:05Z"
    - actionIndex: 1
      actionType: AdjustResources
      success: false
      timestamp: "2026-02-16T10:31:10Z"
  evidence:
    - type: preflight_snapshot
      data: "Structured snapshot captured: kind=Deployment replicas=3 containers=1"
      timestamp: "2026-02-16T10:31:00Z"
    - type: action_completed
      data: "Action ScaleDeployment executed successfully"
      timestamp: "2026-02-16T10:31:05Z"
    - type: action_failed
      data: "Action AdjustResources failed: invalid memory_limit format"
      timestamp: "2026-02-16T10:31:10Z"
    - type: rollback
      data: "Rolled back production/api-gateway: replicas: 5 → 3; container app: memory_limit=1Gi"
      timestamp: "2026-02-16T10:31:11Z"
O rollback automático restaura o estado anterior à remediação, não resolve o problema original. Após o rollback, o IssueReconciler avalia se há tentativas restantes e dispara re-análise com contexto de falha — a IA recebe o que falhou e sugere uma estratégia diferente.
Fluxo completo em caso de falha: Campos de status adicionados ao RemediationPlan:
CampoTipoDescrição
preflightSnapshotResourceSnapshotEstado completo do recurso antes de qualquer ação
actionCheckpoints[]ActionCheckpointCheckpoint antes de cada ação com resultado (success/fail)
rollbackPerformedboolSe o rollback automático foi executado
rollbackResultstringDescrição do que foi revertido (replicas, images, resources)
postFailureHealthy*boolSe o recurso está healthy após rollback

Tipos de Ação (54 tipos)

Workload:
TipoDescriçãoParâmetros
ScaleDeploymentAjusta o número de réplicasreplicas
RestartDeploymentRollout restart do deployment
RollbackDeploymentDesfaz rollout (anterior, saudável ou revisão específica)toRevision (optional: previous, healthy, ou número)
PatchConfigAtualiza chaves de um ConfigMapconfigmap, key=value
AdjustResourcesAjusta CPU/memória requests/limits de containersmemory_limit, memory_request, cpu_limit, cpu_request, container
DeletePodRemove pod mais doente (CrashLoop > restarts)pod (optional — auto-seleciona o mais doente)
RestartStatefulSetPodRestart de pod StatefulSet (preserva identidade/storage)pod (optional — omitir para rolling restart do StatefulSet inteiro)
GitOps:
TipoDescriçãoParâmetros
HelmRollbackRollback de Helm release para revisão anteriorrevision (optional — padrão: anterior)
ArgoSyncAppTrigger de sync em ArgoCD Applicationrevision (optional — padrão: HEAD)
Autoscaling:
TipoDescriçãoParâmetros
AdjustHPAModifica min/max replicas ou target utilization do HPAminReplicas, maxReplicas, targetCPUUtilization
Infraestrutura:
TipoDescriçãoParâmetros
CordonNodeMarca node como unschedulablenode
DrainNodeCordon + evict pods do nodenode
Storage:
TipoDescriçãoParâmetros
ResizePVCExpande PVC (somente expansão, não redução)pvc, size (ex: 20Gi)
Security:
TipoDescriçãoParâmetros
RotateSecretAtualiza valores de Secret ou copia de sourcesecret, sourceSecret ou key=value
Networking:
TipoDescriçãoParâmetros
UpdateIngressModifica backend ou annotations de Ingressingress, backendService, backendPort, annotation.*
PatchNetworkPolicyAdiciona portas permitidas a NetworkPolicynetworkPolicy, allowPort, protocol
Advanced:
TipoDescriçãoParâmetros
ApplyManifestAplica manifesto JSON de um ConfigMapconfigmap, key
ExecDiagnosticExecuta comando diagnóstico whitelisted em podcommand (string exata — ver allowlist)
CustomAção personalizada (bloqueada por safety checks)

ExecDiagnostic Allowlist

A ação ExecDiagnostic faz match exato de string contra um allowlist de comandos read-only. Qualquer variação (flags diferentes, host alternativo, etc.) é rejeitada com command "..." not in approved diagnostic commands whitelist. Comandos aprovados por padrão (~90):
CategoriaComandos
Processo / shellenv, whoami, id, hostname, pwd, uname -a, uname -r, ps aux, ps -ef, top -b -n1
Filesystem / recursosdf -h, df -i, free -m, free -h, mount, uptime, ls -la /, ls -la /tmp, ls -la /var/log, du -sh /tmp, du -sh /var/log
Cgroups v2 (pod moderno)cat /sys/fs/cgroup/memory.max, memory.current, memory.events, memory.stat, cpu.max, cpu.stat
Cgroups v1 (pod legado)cat /sys/fs/cgroup/memory/memory.{limit_in_bytes,usage_in_bytes,oom_control,stat}, cat /sys/fs/cgroup/cpu/cpu.{cfs_quota_us,cfs_period_us,stat}
/proc introspectioncat /proc/1/{cgroup,status,limits,cmdline,environ}, cat /proc/{meminfo,cpuinfo,loadavg,version}, cat /proc/net/{tcp,udp,sockstat}
Rede (read-only)netstat -tlnp/-an/-rn, ss -tlnp/-an/-s, ip addr, ip -s link, ip route, ip -6 route, ip neigh, ifconfig, arp -a
DNS / resolvercat /etc/{hosts,resolv.conf,nsswitch.conf}, nslookup/getent/dig/host kubernetes.default.svc.cluster.local, nslookup kube-dns.kube-system.svc.cluster.local
Health / métricas / pprofcurl -s localhost{,:8080}/{health,healthz,ready,readyz,live,livez}, curl -s localhost:{8080,8081,9090,9091}/metrics, curl -s localhost:9090/-/{ready,healthy}, curl -s localhost:6060/debug/pprof/{,goroutine,heap}?debug=1
Envoy / Istio sidecarcurl -s localhost:15000/ready, curl -s localhost:{15020,15021}/healthz/ready
wget fallback (Alpine)wget -qO- http://localhost{,:8080}/{health,healthz,metrics}
Reachability TCPnc -zv kubernetes.default.svc.cluster.local 443, nc -zv kube-dns.kube-system.svc.cluster.local 53
Extender via env var CHATCLI_ALLOWED_DIAGNOSTIC_COMMANDS (comma-separated, lido uma vez na inicialização):
spec:
  extraEnv:
    - name: CHATCLI_ALLOWED_DIAGNOSTIC_COMMANDS
      value: "dig +short redis.default.svc.cluster.local, nc -zv redis.default.svc.cluster.local 6379"
Cada entrada é matching exato. nslookup <outro-host> não funciona — é rejeitado. Se precisar de um host específico, adicione a string completa ao env var.
A IA recebe esse allowlist no prompt de remediação (server/handler_analysis.go) e é instruída a escolher o comando certo por sintoma: memory.events para OOM, cpu.stat para throttling, getent/dig para DNS, pprof para apps Go travadas, nc -zv para dependência externa.
StatefulSet:
TipoDescriçãoParâmetros
ScaleStatefulSetScaling ordenado de réplicasreplicas
RestartStatefulSetRolling restart via annotation
RollbackStatefulSetRollback via ControllerRevisiontoRevision
AdjustStatefulSetResourcesAjusta CPU/memóriacontainer, memory_limit, cpu_limit
DeleteStatefulSetPodDeleta pod específico ou mais doentepod (opcional)
ForceDeleteStatefulSetPodForce-delete de pod preso (grace=0)pod (OBRIGATÓRIO)
UpdateStatefulSetStrategyAltera updateStrategytype, maxUnavailable
RecreateStatefulSetPVCDeleta PVC preso para recriaçãopvc, confirm=true
PartitionStatefulSetUpdatePartition para canary rolloutpartition
DaemonSet:
TipoDescriçãoParâmetros
RestartDaemonSetRolling restart em todos os nodes
RollbackDaemonSetRollback via ControllerRevisiontoRevision
AdjustDaemonSetResourcesAjusta CPU/memóriacontainer, memory_limit, cpu_limit
DeleteDaemonSetPodDeleta pod (opcionalmente em node específico)pod, node (opcional)
UpdateDaemonSetStrategyAltera estratégia de updatetype, maxUnavailable, maxSurge
PauseDaemonSetRolloutPausa rollout (maxUnavailable=0)
CordonAndDeleteDaemonSetPodCordona node + deleta podnode (OBRIGATÓRIO)
Job:
TipoDescriçãoParâmetros
RetryJobDeleta Job falhado + recria
AdjustJobResourcesAjusta CPU/memória no templatecontainer, memory_limit, cpu_limit
DeleteFailedJobLimpa Job falhado
SuspendJobPausa Job (suspend=true)
ResumeJobRetoma Job (suspend=false)
AdjustJobParallelismAltera paralelismoparallelism
AdjustJobDeadlineAltera deadlineactiveDeadlineSeconds
AdjustJobBackoffLimitAltera backoff limitbackoffLimit
ForceDeleteJobPodsForce-delete de todos os pods
CronJob:
TipoDescriçãoParâmetros
SuspendCronJobPausa agendamento
ResumeCronJobRetoma agendamento
TriggerCronJobCria Job imediatamente
AdjustCronJobResourcesAjusta CPU/memória no jobTemplatecontainer, memory_limit, cpu_limit
AdjustCronJobScheduleAltera scheduleschedule
AdjustCronJobDeadlineAltera deadlinestartingDeadlineSeconds
AdjustCronJobHistoryAltera limites de históricosuccessfulJobsHistoryLimit, failedJobsHistoryLimit
AdjustCronJobConcurrencyAltera política de concorrênciaconcurrencyPolicy
DeleteCronJobActiveJobsMata Jobs ativos
ReplaceCronJobTemplateSubstitui template de ConfigMapconfigmap, key

Exemplos de RemediationPlan com Novas Ações

apiVersion: platform.chatcli.io/v1alpha1
kind: RemediationPlan
metadata:
  name: checkout-helm-rollback-plan-1
  namespace: production
spec:
  issueRef:
    name: checkout-helm-release-failed-123
  attempt: 1
  strategy: "Rollback Helm release to previous stable revision"
  actions:
    - type: HelmRollback
      params:
        revision: "41"    # revision específica (omitir para anterior)

Runbook (Manual ou Auto-gerado)

Procedimentos operacionais. Runbooks manuais têm prioridade sobre tudo. Quando não há Runbook manual, a IA gera automaticamente um Runbook CR reutilizável a partir das ações sugeridas.
apiVersion: platform.chatcli.io/v1alpha1
kind: Runbook
metadata:
  name: high-error-rate-deployment
  namespace: production
spec:
  description: "Standard procedure for high error rate incidents on Deployments"
  trigger:
    signalType: error_rate
    severity: high
    resourceKind: Deployment
  steps:
    - name: Scale up
      action: ScaleDeployment
      description: "Increase replicas to absorb the error spike"
      params:
        replicas: "4"
    - name: Rollback
      action: RollbackDeployment
      description: "Revert to previous stable version if scaling doesn't help"
  maxAttempts: 3

RemediationPlan (Agentic Mode)

Quando não há Runbook manual nem ações sugeridas pela IA, o operator cria um plano agêntico. A IA atua como um agente com skills Kubernetes em um loop observe-decide-act:
apiVersion: platform.chatcli.io/v1alpha1
kind: RemediationPlan
metadata:
  name: api-gateway-pod-restart-plan-1
  namespace: production
spec:
  issueRef:
    name: api-gateway-pod-restart-1771276354
  attempt: 1
  strategy: "Agentic AI remediation"
  agenticMode: true
  agenticMaxSteps: 10
  agenticHistory:
    - stepNumber: 1
      aiMessage: "High restart count with OOMKilled. Scaling up to reduce memory pressure."
      action:
        type: ScaleDeployment
        params:
          replicas: "5"
      observation: "SUCCESS: ScaleDeployment executed successfully"
    - stepNumber: 2
      aiMessage: "Pods still restarting. Adjusting memory limits."
      action:
        type: AdjustResources
        params:
          memory_limit: "1Gi"
          memory_request: "512Mi"
      observation: "SUCCESS: AdjustResources executed successfully"
    - stepNumber: 3
      aiMessage: "All pods running stable. Issue resolved."
status:
  state: Completed
  agenticStepCount: 3
  agenticStartedAt: "2026-02-16T10:31:00Z"
Safety Guards: Maximum of 10 steps (configurable via agenticMaxSteps), timeout of 10 minutes. If an action fails, the observation reports “FAILED: error” and the loop continues — the AI receives the feedback and adapts.
Na resolução agêntica: O operator gera automaticamente:
  1. PostMortem CR com timeline, causa raiz, impacto, lições aprendidas
  2. Runbook CR reutilizável com os passos bem-sucedidos (label source=agentic)

PostMortem (Auto-generated)

Relatório de incidente gerado automaticamente após qualquer resolução de remediação (standard ou agêntica). Contém o histórico completo do incidente: detecção, análise, ações executadas, resolução, além de métricas, correlação git, cascade chain, trending de incidentes recorrentes e campo de feedback do desenvolvedor.
apiVersion: platform.chatcli.io/v1alpha1
kind: PostMortem
metadata:
  name: pm-api-gateway-pod-restart-1771276354
  namespace: production
spec:
  issueRef:
    name: api-gateway-pod-restart-1771276354
  resource:
    kind: Deployment
    name: api-gateway
    namespace: production
  severity: high
status:
  state: Open              # Open | InReview | Closed
  summary: "OOMKilled containers caused cascading restarts on api-gateway"
  rootCause: "Memory limit (512Mi) insufficient for current workload pattern"
  impact: "Service degradation for 5 minutes, 30% error rate increase"
  timeline:
    - timestamp: "2026-02-16T10:30:00Z"
      type: detected
      detail: "Issue detected: pod_restart on api-gateway"
    - timestamp: "2026-02-16T10:31:00Z"
      type: action_executed
      detail: "ScaleDeployment to 5 replicas"
    - timestamp: "2026-02-16T10:31:35Z"
      type: action_executed
      detail: "AdjustResources memory_limit=1Gi"
    - timestamp: "2026-02-16T10:32:10Z"
      type: resolved
      detail: "All pods stable, issue resolved"
  lessonsLearned:
    - "Memory limits should account for peak workload patterns"
    - "Set up HPA to auto-scale on memory pressure"
  preventionActions:
    - "Configure HPA with min 3 replicas for api-gateway"
    - "Set memory limit to 1Gi across all environments"
  duration: "2m10s"
  generatedAt: "2026-02-16T10:32:10Z"
  # Novos campos de enrichment (preenchidos automaticamente pelo operator)
  metricSnapshots:
    - name: "memory_usage"
      value: "498000000"
      timestamp: "2026-02-16T10:30:00Z"
      phase: "during"
    - name: "memory_usage"
      value: "312000000"
      timestamp: "2026-02-16T10:35:00Z"
      phase: "after"
  blastRadius:
    - resource:
        kind: Service
        name: api-gateway-svc
        namespace: production
      impact: "5xx responses during pod restarts"
      severity: "high"
  gitCorrelation:
    commitSHA: "a1b2c3d4e5f6"
    commitMessage: "feat: add webhook handler for notifications"
    author: "dev@team.com"
    timestamp: "2026-02-16T09:15:00Z"
    confidence: 0.82
    filesChanged:
      - "internal/webhook/handler.go"
      - "internal/webhook/handler_test.go"
  trending:
    occurrenceCount: 3
    windowDays: 30
    relatedPostMortems:
      - "pm-api-gateway-oom-20260205"
      - "pm-api-gateway-oom-20260210"
    pattern: "Recurring oom_kill on Deployment/api-gateway (3 occurrences in 30 days)"
  gitOpsContext: "Helm release 'api-gateway' chart=api-gw version=2.1.0 status=deployed revision=15"
  logAnalysisSummary: "1 Go panic stack trace; 8 critical error patterns (resource/connectivity)"
  cascadeChain:
    - "production/api-gateway(root_cause)"
    - "production/frontend(victim)"
  # Feedback do dev (preenchido manualmente após revisão)
  feedback:
    overrideRootCause: ""          # vazio = concorda com a IA
    remediationAccuracy: 4         # 1-5 scale
    comments: "Boa análise, mas poderia ter sugerido AdjustResources antes do restart"
    providedBy: "sre@team.com"
    providedAt: "2026-02-17T09:00:00Z"

Campos do PostMortem Status

CampoTipoDescrição
statePostMortemStateEstado: Open, InReview, Closed
summarystringResumo do incidente gerado pela IA
rootCausestringCausa raiz determinada pela IA
impactstringImpacto do incidente
timeline[]TimelineEventLinha do tempo (detected, analyzed, action_executed, resolved)
actionsExecuted[]ActionRecordAções executadas com resultado
lessonsLearned[]stringLições aprendidas
preventionActions[]stringAções preventivas sugeridas
durationstringDuração total do incidente
generatedAtTimeQuando o PostMortem foi gerado
reviewedAtTimeQuando o PostMortem foi revisado por humano
metricSnapshots[]MetricSnapshotMétricas Prometheus capturadas antes/durante/depois do incidente
blastRadius[]BlastRadiusEntryServiços e recursos impactados pelo incidente
gitCorrelationGitCorrelationCommit suspeito correlacionado ao incidente (SHA, autor, arquivos, confiança)
sliImpactstringImpacto nos SLIs e error budgets
errorBudgetBurnedfloat64Percentual de error budget consumido
trendingTrendingInfoInformação de padrão recorrente (contagem, janela, PostMortems relacionados)
feedbackDevFeedbackFeedback humano (override de causa raiz, accuracy 1-5, comentários)
gitOpsContextstringEstado do Helm/ArgoCD/Flux no momento do incidente
logAnalysisSummarystringResumo dos achados da análise de logs
cascadeChain[]stringCadeia de cascade failure se aplicável

Matching de Runbooks (Tiered)

Tier 1: SignalType + Severity + ResourceKind (match exato, preferido)
Tier 2: Severity + ResourceKind (fallback quando signal não bate)

Prioridade de Remediação

1. Runbook manual existente (match tiered)
2. Runbook auto-gerado pela IA (materializado como CR reutilizável)
3. Remediação agêntica por IA (loop observe-decide-act, gera PostMortem + Runbook)
4. Escalonamento (apenas quando agêntico falha após max tentativas)

SourceRepository (Code-Aware Diagnostics)

Vincula um workload Kubernetes ao seu repositório de código-fonte. Quando configurado, a IA recebe contexto de código durante análise de incidentes: commits recentes correlacionados ao timestamp, trechos de código referenciados em stack traces, e arquivos de configuração (Dockerfile, values.yaml).
Validação de entrada (hardening): spec.url aceita apenas as formas https://, ssh:// ou git@host:path, e spec.branch é restrito a [A-Za-z0-9._/-] sem - inicial — fechando o vetor de injeção de argumento no git (ex.: --upload-pack). Leitura de trechos referenciados em stack traces é confinada ao clone do repositório via os.Root (sem traversal nem escape por symlink). URLs ou branches fora do padrão fazem o sync falhar com erro explícito no status.
apiVersion: platform.chatcli.io/v1alpha1
kind: SourceRepository
metadata:
  name: api-gateway-repo
  namespace: production
spec:
  url: "https://github.com/myorg/api-gateway.git"
  branch: main
  authType: token
  secretRef: git-token       # Secret com key "token"
  resource:
    kind: Deployment
    name: api-gateway
    namespace: production
  paths: ["cmd/", "internal/"]
  dockerfile: "Dockerfile"
  language: "Go"
  syncIntervalMinutes: 30
---
apiVersion: v1
kind: Secret
metadata:
  name: git-token
  namespace: production
type: Opaque
stringData:
  token: "ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
O que o operator faz com o SourceRepository:
  1. Clone shallow do repositório (depth 50) e sync periódico (configurável via syncIntervalMinutes)
  2. Indexa linguagens detectadas, entrypoints (main.go, app.py, index.ts, etc.), config files (Dockerfile, values.yaml, Chart.yaml)
  3. Correlação temporal: encontra commits nos 30 min antes do incidente
  4. Commit suspeito: identifica o commit mais provável de ter causado o problema (score por proximidade temporal + volume de mudanças)
  5. Extração de código: quando stack traces referenciam arquivos (ex: handler.go:42), extrai trechos com contexto de 5 linhas antes/depois
  6. Feed para IA: todo o contexto é incluído no prompt de análise
O repositório é clonado localmente no operator pod. Para repos privados, crie um Secret com a chave correspondente ao authType escolhido e referencie em secretRef. O operator suporta repos HTTPS (token/basic) e SSH (ssh-key).

Correlation Engine

O motor de correlação agrupa anomalias em issues usando:

Risk Scoring

Cada tipo de sinal tem um peso:
SinalPeso
oom_kill30
error_rate25
deploy_failing25
latency_spike20
pod_restart20
pod_not_ready20
O risk score é a soma dos pesos das anomalias correlacionadas (máximo 100).

Classificação de Severidade

Risk ScoreSeveridade
>= 80Critical
>= 60High
>= 40Medium
< 40Low

Agrupamento

  • Anomalias no mesmo recurso (deployment + namespace) dentro da mesma janela temporal são agrupadas no mesmo Issue
  • Incident ID deterministico: hash do recurso + tipo de sinal (evita duplicatas)

WatcherBridge

O WatcherBridge e o componente que conecta o servidor ChatCLI ao operator:
  • Polling: Consulta GetAlerts do servidor a cada 30 segundos
  • Descoberta: Localiza o servidor via Instance CRs (primeiro Instance com endpoint gRPC pronto)
  • Dedup: Hash SHA256 do tipo+deployment+namespace (sem componente temporal — um problema contínuo gera apenas uma Anomaly). TTL de 2 horas
  • Invalidação de dedup: Quando Issue atinge estado terminal (Resolved/Escalated), entradas de dedup para o recurso são removidas, permitindo detecção imediata de recorrência
  • Poda: Remove hashes expirados automaticamente (> 2h)
  • Criação: Converte alertas em Anomaly CRs com nomes K8s válidos

Exemplos de Uso

apiVersion: platform.chatcli.io/v1alpha1
kind: Instance
metadata:
  name: chatcli-simple
spec:
  provider: OPENAI
  apiKeys:
    name: chatcli-api-keys

Status e Monitoramento

kubectl get instances
NAME            READY   REPLICAS   PROVIDER    AGE
chatcli-aiops   true    1          CLAUDEAI    5m
kubectl get issues -A
NAME                                    SEVERITY   STATE         RISK   AGE
api-gateway-pod-restart-1771276354      high       Remediating   65     2m
worker-oom-kill-3847291023              critical   Analyzing     90     30s
kubectl get aiinsights -A
NAME                                           ISSUE                                   PROVIDER   CONFIDENCE   AGE
api-gateway-pod-restart-1771276354-insight      api-gateway-pod-restart-1771276354      CLAUDEAI   0.87         1m
kubectl get remediationplans -A
NAME                                          ISSUE                                   ATTEMPT   STATE       AGE
api-gateway-pod-restart-1771276354-plan-1      api-gateway-pod-restart-1771276354      1         Completed   1m
kubectl get postmortems -A
NAME                                          ISSUE                                   SEVERITY   STATE   AGE
pm-api-gateway-pod-restart-1771276354         api-gateway-pod-restart-1771276354      high       Open    30s
kubectl get anomalies -A
NAME                                               SIGNAL        SOURCE    SEVERITY   AGE
watcher-highrestartcount-api-gateway-1234567890     pod_restart   watcher   warning    3m
watcher-oomkilled-worker-9876543210                 oom_kill      watcher   critical   1m

Desenvolvimento

cd operator

# Build
go build ./...

# Testes (130 funções de teste, 185 com subtests)
go test ./... -v

# Docker (deve ser construído a partir do root do repositório)
docker build -f operator/Dockerfile -t myregistry/chatcli-operator:dev .

# Deploy via Helm (recomendado)
helm install chatcli-operator ../deploy/helm/chatcli-operator/ \
  --namespace chatcli-system --create-namespace \
  --set image.repository=myregistry/chatcli-operator \
  --set image.tag=dev

# Ou deploy via kubectl (alternativa)
make deploy IMG=myregistry/chatcli-operator:dev

Segurança

O Operator implementa múltiplas camadas de segurança por padrão, seguindo o princípio de fail-closed (negar por padrão):

Autenticação da REST API

A API REST opera em modo fail-closed por padrão — não há modo dev sem autenticação. Toda requisição deve incluir um header X-API-Key válido com role mapeada (viewer/operator/admin). As API keys são carregadas com a seguinte ordem de prioridade e recarregadas automaticamente a cada 30 segundos:
  1. Secret chatcli-operator-secrets (prioridade) — campo api-keys com lista YAML {key, role, description}
  2. ConfigMap chatcli-operator-config (fallback) — mesmo campo api-keys
  3. Rejeita a requisição (ou aceita em dev-mode se CHATCLI_OPERATOR_DEV_MODE=true)
Dois Secrets distintos no projeto — não confunda com as LLM keys do servidor (chatcli-api-keys consumido pelo chatcli server via Instance.spec.apiKeys.name). Tabela comparativa em Segurança — Autenticação.O Secret chatcli-operator-secrets precisa estar no mesmo namespace que o pod do operator (o controller resolve via POD_NAMESPACE env / arquivo do ServiceAccount, com fallback chatcli-system). Se você fez helm install --namespace <X>, crie o Secret em <X>.
Alterações nas API keys — tanto no Secret quanto no ConfigMap — são detectadas automaticamente a cada 30s. Nenhum restart do operator é necessário.

Allowlist de Tipos de Recurso

O Operator classifica tipos de recurso Kubernetes em duas categorias:
Pods, Deployments, StatefulSets, DaemonSets, Services, ConfigMaps, Ingresses, Jobs, CronJobs, ReplicaSets, Endpoints, PersistentVolumeClaims, HorizontalPodAutoscalers, NetworkPolicies, ServiceAccounts, Namespaces, Events.

Scrubbing de Logs

Antes de enviar logs de aplicação ao LLM para análise, o Operator remove 18 padrões sensíveis, incluindo:
  • Tokens JWT/Bearer, API keys, senhas
  • Endereços de e-mail, IPs internos, URLs com credenciais
  • Números de cartão de crédito, SSNs, certificados PEM

TLS e RBAC

  • TLS 1.3 obrigatório em todas as conexões do servidor ChatCLI
  • ClusterRoles com privilégio mínimo (read-only por padrão)
  • NetworkPolicy configurável para restringir tráfego de rede ao namespace do Operator
  • Hardening H5 — RBAC sem escalonamento em runtime: o operator nunca cria ou altera ClusterRole/ClusterRoleBinding em runtime. As ClusterRoles compartilhadas (chatcli-watcher, chatcli-role-*) são pré-provisionadas pelo Helm chart, e o SA do operator tem o verb bind restrito a esses nomes via resourceNames. Um operator comprometido não consegue referenciar uma ClusterRole mais privilegiada em um novo ClusterRoleBinding.

Auditoria

  • AuditEvent CRD para trilha de auditoria imutável (append-only)
  • Logs estruturados com Request ID para correlação
  • Integração com CHATCLI_AUDIT_LOG_PATH via extraEnv
spec:
  extraEnv:
    - name: CHATCLI_AGENT_SECURITY_MODE
      value: "strict"
    - name: CHATCLI_AUDIT_LOG_PATH
      value: "/var/log/chatcli/audit.jsonl"
Em modo strict, o agent security bloqueia qualquer operação de escrita no cluster que não esteja na allowlist. Isso é recomendado para ambientes de produção.

Próximo Passo

AIOps Platform

Deep-dive na arquitetura AIOps

K8s Watcher

Detalhes de coleta e budget

Modo Servidor

RPCs GetAlerts e AnalyzeIssue

Monitoramento K8s

Receita: Monitoramento K8s com IA