Pular para o conteúdo principal
A Plataforma AIOps do ChatCLI e um sistema autônomo que detecta problemas no Kubernetes, analisa causas raiz com IA e executa remediações automáticas — tudo orquestrado por CRDs nativos do Kubernetes. Esta página cobre a arquitetura interna em profundidade. Para configuração e exemplos de uso, veja K8s Operator.

Visão Geral do Pipeline

Componentes da Plataforma v2

A plataforma AIOps foi expandida com componentes enterprise-grade:

Notificações e Escalação

6 canais (Slack, PagerDuty, OpsGenie, Email, Webhook, Teams) com throttling e escalação automática L1→L2→L3.

SLOs e SLAs

Burn rate alerting multi-janela (Google SRE model), error budget tracking, business hours com timezone.

Workflow de Aprovação

Auto/manual/quorum, blast radius, change windows, integração com Decision Engine.

Motor de Decisão com IA

Confiança ajustada por 5 fatores, circuit breaker, pattern learning, RCA enrichment.

Federação Multi-Cluster

Correlação cross-cluster, cascade detection, políticas por tier.

Chaos Engineering

7 tipos de experimento com safety checks, recovery verification, DryRun.

Auditoria e Compliance

Audit trail imutável, RBAC 4 níveis, relatórios de compliance (MTTD/MTTR).

Capacity e Custos

Forecast com regressão linear, noise reduction, ROI tracking.

REST API e Dashboard

A plataforma expõe uma API REST completa na porta :8090 com 30+ endpoints cobrindo incidents, SLOs, approvals, analytics, clusters e audit. Um Web Dashboard embutido está disponível em http://operator:8090/. Para referência completa da API, consulte a API Reference. 4 dashboards Grafana pré-configurados estão disponíveis em deploy/grafana/ para importação automática via sidecar.

Componentes Internos

1. WatcherBridge (watcher_bridge.go)

O WatcherBridge e o ponto de entrada do pipeline. Implementa a interface manager.Runnable do controller-runtime e roda como goroutine gerenciada pelo manager. Responsabilidades:
FunçãoDescrição
Start()Inicia o loop de polling (30s) com context cancelavel
poll()Consulta GetAlerts e cria Anomaly CRs
discoverAndConnect()Descobre servidor via Instance CRs no cluster
createAnomaly()Converte alert → Anomaly CR com labels de referência
alertHash()SHA256(type|deployment|namespace) para dedup
InvalidateDedupForResource()Remove entradas de dedup para um deployment+namespace
sanitizeK8sName()Garante nomes válidos para objetos K8s (63 chars, lowercase, sem caracteres especiais)
Dedup por SHA256:
hash = SHA256(alertType | deployment | namespace)
  • Sem componente temporal: Um problema contínuo (e.g. CrashLoopBackOff) gera apenas uma Anomaly
  • TTL: 2 horas — hashes expirados são podados automaticamente
  • Invalidação: Quando um Issue atinge estado terminal (Resolved/Escalated), as entradas de dedup para o recurso afetado são invalidadas, permitindo detecção imediata de recorrências
  • Resultado: Evita duplicatas durante problema ativo; detecta recorrência após resolução
Descoberta do Servidor:
1

Lista Instance CRs no cluster

2

Seleciona o primeiro Instance com Status.Ready=true

3

Conecta via gRPC insecure (10s timeout)

4

Retry

Se conexão falha, tenta novamente no próximo ciclo de poll.

2. AnomalyReconciler (anomaly_controller.go)

Observa Anomaly CRs e os correlaciona em Issues. Fluxo:
1

Recebe Anomaly CR

Anomaly recém-criado com Status.Correlated = false.
2

Agrupa anomalias

Chama CorrelationEngine.FindRelatedAnomalies() para agrupar.
3

Calcula risk score e severidade

4

Cria ou atualiza Issue CR

5

Marca Anomaly como correlacionada

Define Correlated = true com referência ao Issue.

3. CorrelationEngine (correlation.go)

Motor de correlação que agrupa anomalias em incidentes. Algoritmo de Correlação:
Para cada nova anomalia:
  1. Gera incident_id = hash(resource_kind + resource_name + namespace + signal_type)
  2. Busca Issue existente com mesmo incident_id
  3. Se existe -> adiciona anomalia ao Issue, recalcula risk score
  4. Se não existe -> cria novo Issue
Risk Scoring:
SinalPesoJustificativa
oom_kill30Indica problema de memória severo
error_rate25Impacto direto em usuários
deploy_failing25Indisponibilidade do serviço
latency_spike20Degradação de performance
pod_restart20Instabilidade do pod
pod_not_ready20Capacidade reduzida
Classificação de Severidade:
risk_score >= 80 -> Critical
risk_score >= 60 -> High
risk_score >= 40 -> Medium
risk_score <  40 -> Low
Exemplo: Um deployment com oom_kill (30) + pod_restart (20) = risk 50 → Medium. Se adicionar error_rate (25) = risk 75 → High. Mapeamento de Fonte:
Anomaly SourceIssue Source
watcherwatcher
prometheusprometheus
manualmanual

4. IssueReconciler (issue_controller.go)

Gerencia o ciclo de vida completo de um Issue através de uma máquina de estados. Estados e Transições:
  1. Define detectedAt e maxRemediationAttempts (padrão: 5, configurável via Instance aiops.maxRemediationAttempts)
  2. Cria AIInsight CR com owner reference (Issue → AIInsight)
  3. Transiciona para Analyzing
  4. Requeue após 10 segundos
  1. Verifica se AIInsight tem Analysis preenchida
  2. Busca Runbook manual correspondente (findMatchingRunbook — tiered matching)
  3. Se encontrou Runbook manual → createRemediationPlan() (manual tem precedência)
  4. Se não encontrou Runbook manual mas AIInsight tem SuggestedActionsgenerateRunbookFromAI()createRemediationPlan() usando o Runbook auto-gerado
  5. Se nenhum → createAgenticRemediationPlan() (AgenticMode=true, sem ações pré-definidas — a IA decide cada passo)
  6. Transiciona para Remediating
  • Tier 1: SignalType + Severity + ResourceKind (match exato, preferido)
  • Tier 2: Severity + ResourceKind (fallback quando signal não bate)
  • SignalType resolvido de: issue.Spec.SignalType → fallback issue.Labels["platform.chatcli.io/signal"]
  • Materializa SuggestedActions do AI como Runbook CR reutilizável
  • Nome: auto-{signal}-{severity}-{kind} (sanitizado)
  • Labels: platform.chatcli.io/auto-generated=true
  • Trigger: SignalType + Severity + ResourceKind (para reutilização futura)
  • Usa CreateOrUpdate para idempotência
  1. Busca RemediationPlan mais recente (findLatestRemediationPlan)
  2. Se Completed → Issue Resolved + invalida dedup do recurso
    • Se plano agêntico: gera PostMortem CR (timeline, causa raiz, impacto, lições) + Runbook reutilizável dos passos bem-sucedidos
  3. Se Failed e tentativas restantes → re-análise: coleta evidência de falha (collectFailureEvidence), limpa análise do AIInsight, volta para estado Analyzing com failure context
  4. Se Failed e max tentativas → Escalated + invalida dedup do recurso
Retry com Escalação de Estratégia:
  • Cada retry dispara re-análise do AI com contexto de falhas anteriores
  • O AI recebe previous_failure_context com evidência das tentativas que falharam
  • O prompt instrui: “Não repita as mesmas ações. Análise por que falharam e sugira uma abordagem fundamentalmente diferente”
  • Gera novo Runbook auto-gerado com estratégia diferente (nome inclui attempt)
Prioridade de Remediação:
1. Runbook manual existente (match tiered: SignalType+Severity+Kind -> Severity+Kind)
2. Runbook auto-gerado pela IA (materializado como CR reutilizável)
3. Escalonamento (último recurso)

5. AIInsightReconciler (aiinsight_controller.go)

Observa AIInsight CRs e chama o AnalyzeIssue RPC para preencher a análise. Fluxo:
1

Verifica análise existente

Verifica se Status.Analysis já está preenchida (skip se sim).
2

Verifica conectividade

Verifica se servidor está conectado (requeue 15s se não).
3

Busca contexto

Busca Issue pai para contexto.
4

Coleta contexto K8s

Coleta contexto K8s via KubernetesContextBuilder (deployment, pods, eventos, revisões).
5

Lê failure context

Lê failure context de annotation platform.chatcli.io/failure-context (se re-análise).
6

Monta request

Monta AnalyzeIssueRequest com dados do Issue + contexto K8s + failure context.
7

Chama AnalyzeIssue RPC

Chama AnalyzeIssue RPC via ServerClient.
8

Preenche status

Preenche Status.Analysis, Confidence, Recommendations, SuggestedActions. Limpa annotation failure-context após re-análise concluída.
KubernetesContextBuilder (k8s_context.go): Coleta contexto real do cluster para Deployments, StatefulSets, DaemonSets, Jobs, CronJobs e HPAs (max 12000 chars):
  • Resource Status: replicas, conditions, containers, images + resources (cada tipo tem context builder dedicado)
  • StatefulSet: replicas, update strategy, partition, PodManagementPolicy, VolumeClaimTemplates
  • DaemonSet: desired/current/ready/available/unavailable, nodeSelector, tolerations
  • Job/CronJob: active/succeeded/failed, completions, parallelism, schedule, lastSuccessful
  • HPA: min/max replicas, current/desired, target utilization, current metrics, maxed-out detection
  • Pod Details (até 5 pods, unhealthy primeiro): phase, restart count, container states
  • Recent Events (últimos 15): tipo, reason, message, count
  • Revision History: Últimas 5 revisões (ReplicaSets) com diff de imagens
LogAnalyzer (log_analyzer.go): Análise avançada de logs de aplicação (além do tail básico de 50 linhas):
  • Stack Trace Extraction: detecta e extrai stack traces de Java (Exception/Caused by), Go (panic/goroutine), Python (Traceback), Node.js (Error at)
  • Error Pattern Detection: 24+ padrões críticos categorizados (crash, connectivity, dns, auth, storage, tls, database, cache, messaging)
  • Structured Log Parsing: extrai error/warn entries de logs JSON (campos level, msg, error, timestamp, logger)
  • Init Container Logs: analisa logs de init containers (revela falhas de startup)
  • Sidecar Logs: analisa logs de sidecars (istio-proxy, envoy, datadog-agent, etc.)
  • Critical Lines: extrai linhas FATAL/PANIC com 3 linhas de contexto antes/depois
  • Temporal Window: busca logs por janela temporal (10min antes do incidente), não apenas tail
MetricsCollector (metrics_collector.go): Queries ao Prometheus para dados quantitativos durante análise:
  • CPU/Memory: usage trends 30min antes → durante → 15min depois do incidente
  • Request/Error Rate: HTTP requests e 5xx por segundo
  • Latency: P50, P95, P99 histogram percentiles
  • HPA Metrics: current vs desired replicas, CPU target
  • Network: receive/transmit bytes/s
  • Trend Analysis: detecta spikes, drops, sustained_high/low com cálculo de % de mudança
  • Habilitado via: PROMETHEUS_URL env var no operator
GitOpsDetector (gitops_detector.go): Detecta e integra com ferramentas GitOps:
  • Helm Releases: detecta via Secrets type helm.sh/release.v1, status (deployed/failed/pending-upgrade), chart version, revisão anterior para rollback
  • ArgoCD Applications: sync status (Synced/OutOfSync), health (Healthy/Degraded), conditions, last sync result
  • Flux Kustomizations: ready status, source ref, conditions, last applied
SourceCodeAnalyzer (source_controller.go): Diagnóstico code-aware quando SourceRepository CRD está configurado:
  • Git Correlation: encontra commits nos 30min antes do incidente
  • Suspected Commit: identifica o commit mais provável (score por proximidade temporal + volume de mudanças)
  • Code Extraction: extrai trechos de código referenciados em stack traces (file path + line number → código fonte)
  • Config Analysis: lê Dockerfile, values.yaml, Chart.yaml para contexto de deploy
CascadeAnalyzer (cascade_analyzer.go): Análise de cascade failures cross-service:
  • Dependency Graph: descobre dependências via Services + EndpointSlices
  • Temporal Correlation: encontra issues ativos no mesmo namespace e cross-namespace em janela de 15-20min
  • Cascade Chain: ordena serviços por tempo de detecção (primeiro = root cause)
  • Root Cause Service: identifica o serviço origem do cascade
BlastRadiusPredictor (blast_radius.go): Predição de impacto antes da execução de ações:
  • PDB Check: verifica se a ação violaria PodDisruptionBudgets
  • Quota Check: verifica ResourceQuotas (>90% usado = warning)
  • Node Capacity: conta pods no node para ações de cordon/drain
  • Affected Services: descobre quais Services seriam impactados
  • Risk Level: classifica como low/medium/high/critical
AnalyzeIssueRequest:
CampoOrigemDescrição
issue_nameIssue.NameNome do Issue
namespaceIssue.NamespaceNamespace
resource_kindIssue.Spec.Resource.KindTipo do recurso (Deployment)
resource_nameIssue.Spec.Resource.NameNome do deployment
signal_typeIssue.Spec.SignalType / labelsTipo do sinal
severityIssue.Spec.SeveritySeveridade
descriptionIssue.Spec.DescriptionDescrição do problema
risk_scoreIssue.Spec.RiskScoreScore de risco
providerAIInsight.Spec.ProviderProvedor LLM
modelAIInsight.Spec.ModelModelo LLM
kubernetes_context6 enrichers combinadosK8s status (Deploy/STS/DS/Job/CronJob/HPA) + log analysis (stack traces, error patterns) + Prometheus metrics (trends) + GitOps (Helm/ArgoCD/Flux) + source code (commits, code snippets) + cascade analysis + RCA enrichment
previous_failure_contextAnnotation no AIInsightEvidência de tentativas anteriores (retries)

6. RemediationReconciler (remediation_controller.go)

Executa as ações definidas em um RemediationPlan. Ações Suportadas (54 tipos em 9 categorias): Deployment / Genérico (19 ações):
CategoriaTipoO que FazParâmetros Chave
WorkloadScaleDeploymentAjusta réplicas do Deploymentreplicas
WorkloadRestartDeploymentRollout restart via annotation
WorkloadRollbackDeploymentRollback para revisão anterior/saudável/específica (via ReplicaSet)toRevision
WorkloadPatchConfigAtualiza dados de ConfigMapconfigmap, key=value
WorkloadAdjustResourcesAjusta CPU/memória nos containers do Deploymentcontainer, memory_limit, cpu_limit, etc.
WorkloadDeletePodRemove pod mais doente (auto-seleciona)pod (opcional)
WorkloadRestartStatefulSetPodRestart de pod específico ou rolling restart do StatefulSetpod (opcional)
GitOpsHelmRollbackRollback de Helm releaserevision
GitOpsArgoSyncAppTrigger sync ArgoCDrevision
AutoscalingAdjustHPAModifica HPA min/max/targetminReplicas, maxReplicas, targetCPUUtilization
InfraCordonNodeMarca node como unschedulablenode
InfraDrainNodeCordona e evicta pods do nodenode
StorageResizePVCExpande PVC (sem encolhimento)pvc, size
SecurityRotateSecretAtualiza Secret ou copia de outra sourcesecret, sourceSecret ou key=value
NetworkingUpdateIngressModifica backend/annotations do Ingressingress, backendService, backendPort
NetworkingPatchNetworkPolicyAdiciona portas em regras de ingress do NetworkPolicynetworkPolicy, allowPort, protocol
AdvancedApplyManifestAplica manifesto JSON de ConfigMapconfigmap, key
AdvancedExecDiagnosticExecuta comando de um allowlist read-only em podcommand (ver allowlist), pod, container
CustomBloqueado — requer aprovação manual
StatefulSet (9 ações):
TipoO que FazParâmetros Chave
ScaleStatefulSetScaling ordenado de réplicasreplicas
RestartStatefulSetRolling restart via annotation (ordenado)
RollbackStatefulSetRollback via ControllerRevision (não ReplicaSet)toRevision (previous|N)
AdjustStatefulSetResourcesAjusta CPU/memória nos containers do StatefulSetcontainer, memory_limit, cpu_limit, etc.
DeleteStatefulSetPodDeleta pod específico ou mais doente (preserva PVC)pod (opcional)
ForceDeleteStatefulSetPodForce-delete de pod preso em Terminating (grace=0)pod (OBRIGATÓRIO)
UpdateStatefulSetStrategyAltera tipo de updateStrategytype (RollingUpdate|OnDelete), maxUnavailable
RecreateStatefulSetPVCDeleta PVC preso para recriação pelo controladorpvc, confirm=true (OBRIGATÓRIO)
PartitionStatefulSetUpdateDefine partition para canary rolloutpartition
DaemonSet (7 ações):
TipoO que FazParâmetros Chave
RestartDaemonSetRolling restart de todos os pods do DaemonSet em todos os nodes
RollbackDaemonSetRollback via ControllerRevisiontoRevision (previous|N)
AdjustDaemonSetResourcesAjusta CPU/memória nos containers do DaemonSetcontainer, memory_limit, cpu_limit, etc.
DeleteDaemonSetPodDeleta pod (opcionalmente em node específico)pod ou node (opcional)
UpdateDaemonSetStrategyAltera estratégia de updatetype, maxUnavailable, maxSurge
PauseDaemonSetRolloutPausa rollout (maxUnavailable=0)
CordonAndDeleteDaemonSetPodCordona node + deleta pod do DaemonSet nelenode (OBRIGATÓRIO)
Job (9 ações):
TipoO que FazParâmetros Chave
RetryJobDeleta Job falhado + recria a partir do spec
AdjustJobResourcesAjusta CPU/memória no template do Jobcontainer, memory_limit, cpu_limit, etc.
DeleteFailedJobLimpa Job falhado e seus pods
SuspendJobPausa Job em execução (suspend=true)
ResumeJobRetoma Job suspenso (suspend=false)
AdjustJobParallelismAltera paralelismo do Jobparallelism
AdjustJobDeadlineAltera activeDeadlineSecondsactiveDeadlineSeconds
AdjustJobBackoffLimitAltera backoffLimitbackoffLimit
ForceDeleteJobPodsForce-delete de todos os pods do Job (grace=0)
CronJob (10 ações):
TipoO que FazParâmetros Chave
SuspendCronJobPausa agendamento do CronJob (suspend=true)
ResumeCronJobRetoma agendamento (suspend=false)
TriggerCronJobCria Job a partir do template imediatamente
AdjustCronJobResourcesAjusta CPU/memória no jobTemplatecontainer, memory_limit, cpu_limit, etc.
AdjustCronJobScheduleAltera expressão cron do scheduleschedule
AdjustCronJobDeadlineAltera startingDeadlineSecondsstartingDeadlineSeconds
AdjustCronJobHistoryAltera limites de históricosuccessfulJobsHistoryLimit, failedJobsHistoryLimit
AdjustCronJobConcurrencyAltera concurrencyPolicyconcurrencyPolicy (Allow|Forbid|Replace)
DeleteCronJobActiveJobsMata todos os Jobs ativos do CronJob
ReplaceCronJobTemplateSubstitui jobTemplate a partir de JSON em ConfigMapconfigmap, key
Safety Checks (pré-execução): Scale to 0 bloqueado (Deployment e StatefulSet). AdjustResources limit não pode ser menor que request (todos os tipos). DeletePod/DeleteStatefulSetPod recusa se só existe 1 pod. ForceDeleteStatefulSetPod exige nome explícito do pod. RecreateStatefulSetPVC exige confirm=true. Custom actions bloqueadas. Blast radius prediction verifica violações de PDB, resource quotas e serviços afetados — agora generalizado para todos os workload types via getPodTemplateLabels.Rollback Automático (pós-falha): Antes de qualquer ação, um ResourceSnapshot estruturado captura o estado completo do recurso. Para Deployments: réplicas, imagens, CPU/memória, HPA. Para StatefulSets: réplicas, containers, updateStrategy, partition. Para DaemonSets: containers, updateStrategy, maxUnavailable. Para Jobs: suspend, parallelism, backoffLimit, activeDeadlineSeconds, containers. Para CronJobs: suspend, schedule, concurrencyPolicy, limites de histórico, containers. Se uma ação falha ou a verificação de saúde expira (90s), o RollbackEngine restaura automaticamente o recurso ao estado pré-remediação. Funciona para Deployments, StatefulSets, DaemonSets, Jobs, CronJobs, Nodes e HPAs.
Fluxo de Execução (Standard):
Pending -> Snapshot -> Executing -> (checkpoint + ação, para cada ação)
  -> Verifying (90s timeout) -> Completed
  -> Se ação falha -> Rollback automático -> RolledBack
  -> Se verificação falha -> Rollback automático -> RolledBack
  -> Se rollback falha -> Failed
Fluxo de Execução (Agentic):
Pending -> Executing -> (loop agentico: AI decide -> executa -> observa -> repeat)
  -> Verifying -> Completed | Failed

Cada reconcile = 1 step do loop agentico:
  1. Refresh contexto K8s (KubernetesContextBuilder)
  2. Envia histórico + contexto -> AgenticStep RPC
  3. AI responde: {reasoning, resolved, next_action}
  4. Se resolved=true -> Verifying (+ annotations com dados do PostMortem)
  5. Se next_action -> executa -> registra observação -> requeue 5s
  6. Se observation-only -> registra -> requeue 10s
  Safety: max 10 steps, timeout 10 minutos

7. ServerClient (grpc_client.go)

Cliente gRPC compartilhado entre WatcherBridge e AIInsightReconciler.
MétodoDescrição
NewServerClient()Cria instância (sem conexão)
Connect(addr)Conecta via gRPC insecure (10s timeout)
GetAlerts(namespace)Busca alertas do watcher
AnalyzeIssue(req)Envia issue para análise por IA
AgenticStep(req)Executa um passo do loop agêntico (context + history → next action)
IsConnected()Verifica se conexão está ativa
Close()Fecha conexão gRPC

Interação Server e Operator

GetAlerts RPC

O servidor expoe os alertas do K8s Watcher via gRPC:
rpc GetAlerts(GetAlertsRequest) returns (GetAlertsResponse);

message AlertInfo {
  string alert_type = 1;    // HighRestartCount, OOMKilled, PodNotReady, DeploymentFailing
  string deployment = 2;
  string namespace = 3;
  string message = 4;
  string severity = 5;
  int64 timestamp = 6;
}
O handler no servidor itera sobre os ObservabilityStore de cada target do MultiWatcher, filtra por namespace se específicado, e retorna alertas ativos.

AnalyzeIssue RPC

O servidor recebe o contexto do Issue e chama o LLM para análise:
rpc AnalyzeIssue(AnalyzeIssueRequest) returns (AnalyzeIssueResponse);

message SuggestedAction {
  string name = 1;
  string action = 2;
  string description = 3;
  map<string, string> params = 4;
}

message AnalyzeIssueResponse {
  string analysis = 1;
  float confidence = 2;
  repeated string recommendations = 3;
  string provider = 4;
  string model = 5;
  repeated SuggestedAction suggested_actions = 6;
}
Prompt Estruturado: O servidor constroi um prompt que inclui:
  1. Contexto do Issue (nome, namespace, recurso, severidade, risk score, descrição)
  2. Lista de 19 ações disponíveis organizadas por categoria (Workload, GitOps, Autoscaling, Infra, Storage, Security, Networking, Advanced)
  3. Instruções para retornar JSON estruturado com campos analysis, confidence, recommendations e actions
Parsing da Resposta:
  1. Remove markdown codeblocks (```json ... ```)
  2. Parseia JSON em analysisResult
  3. Clamp confidence entre 0.0 e 1.0
  4. Se parsing falhar → usa resposta raw como analysis com confidence 0.5

AgenticStep RPC

O servidor recebe o contexto do Issue, histórico de passos anteriores e contexto K8s atualizado, e decide a próxima ação:
rpc AgenticStep(AgenticStepRequest) returns (AgenticStepResponse);

message AgenticStepRequest {
  string issue_name = 1;
  string namespace = 2;
  string resource_kind = 3;
  string resource_name = 4;
  string signal_type = 5;
  string severity = 6;
  string description = 7;
  int32 risk_score = 8;
  string provider = 9;
  string model = 10;
  string kubernetes_context = 11;   // refreshado a cada step
  repeated AgenticHistoryEntry history = 12;
  int32 max_steps = 13;
  int32 current_step = 14;
}

message AgenticStepResponse {
  string reasoning = 1;              // raciocínio da IA (registrado no histórico)
  bool resolved = 2;                 // true = problema resolvido
  SuggestedAction next_action = 3;   // null quando resolved=true
  // Campos abaixo só populados quando resolved=true:
  string postmortem_summary = 4;
  string root_cause = 5;
  string impact = 6;
  repeated string lessons_learned = 7;
  repeated string prevention_actions = 8;
}
Prompt do AgenticStep: O servidor constrói um prompt estruturado com:
  1. Role + Issue details: contexto do incidente (tipo, severidade, recurso)
  2. Kubernetes context: estado real do cluster (refreshado a cada step via KubernetesContextBuilder)
  3. Tool definitions: 18 ações mutantes disponíveis + “Observe” (sem ação, espera próximo contexto)
  4. Conversation history: cada step anterior formatado com reasoning → action → observation
  5. Instructions: respond JSON, budget (step N of M), regras de segurança
Quando resolved=true, a resposta inclui dados para geração do PostMortem (summary, root_cause, impact, lessons_learned, prevention_actions).

PostMortem Generation

Quando qualquer remediação resolve um Issue (standard ou agêntica), o IssueReconciler gera automaticamente:

PostMortem CR

Criado via generatePostMortem():
CampoOrigem
timelineIssue.DetectedAt + cada step do AgenticHistory + resolved
actionsExecutedSteps com Action != nil (inclui resultado)
summaryAnnotation platform.chatcli.io/postmortem-summary (gerado pela IA)
rootCauseAnnotation platform.chatcli.io/root-cause
impactAnnotation platform.chatcli.io/impact
lessonsLearnedAnnotation platform.chatcli.io/lessons-learned
preventionActionsAnnotation platform.chatcli.io/prevention-actions
durationCalculado: resolvedAt - detectedAt
Além dos campos acima, o PostMortem é enriquecido automaticamente com:
  • Trending: detecção de incidentes recorrentes (contagem nos últimos 30 dias, PostMortems relacionados)
  • Cascade Chain: cadeia de cascade failure se houver issues correlacionados cross-service
  • Git Correlation: commit suspeito (SHA, autor, arquivos alterados, confiança)
  • GitOps Context: estado do Helm/ArgoCD/Flux no momento do incidente
O PostMortem CR é owned pelo Issue (cascade delete).

Runbook Auto-gerado (Agentic)

Criado via generateAgenticRunbook():
  • Nome: agentic-{signal}-{severity}-{kind} (sanitizado)
  • Steps: apenas os passos com ação bem-sucedida
  • Labels: auto-generated=true, source=agentic
  • Usa CreateOrUpdate (reutilizado para incidentes futuros do mesmo tipo)

Prometheus Metrics do Operator

O operator expoe métricas Prometheus para observabilidade:
MetricaTipoDescrição
chatcli_operator_issues_totalCounterTotal de issues por severidade e estado
chatcli_operator_issue_resolution_duration_secondsHistogramDuração da detecção até resolução
chatcli_operator_active_issuesGaugeNúmero de issues não resolvidos

Testes

O operator possui 130 testes (185 com subtests) cobrindo todos os componentes:
ComponenteTestesCobertura
InstanceReconciler15CRUD, watcher, persistence, réplicas, RBAC, deletion, deepcopy
AnomalyReconciler4Criação, correlação, attachment a Issue existente
IssueReconciler12Máquina de estados, fallback AI, retry, plano agêntico, geração PostMortem
RemediationReconciler38Todos os 54 tipos de ação (Deployment + StatefulSet + DaemonSet + Job + CronJob), safety constraints, loop agêntico, rollback, verificação
AIInsightReconciler12Conectividade, mock RPC, parsing de análise, withAuth, TLS/token
PostMortemReconciler2Inicialização de estado, estado terminal
WatcherBridge22Mapeamento de alertas, dedup SHA256, hash, pruning, criação de Anomaly, buildConnectionOpts (TLS, token, ambos)
CorrelationEngine4Risk scoring, severidade, incident ID, anomalias relacionadas
Pipeline (E2E)3Fluxo completo: Anomaly→Issue→Insight→Plan→Resolved, escalonamento, correlação
MapActionType6+17Todos os 54 mapeamentos string→enum incluindo StatefulSet, DaemonSet, Job, CronJob

Executar Testes

cd operator
go test ./... -v

Diagrama de Ownership (Garbage Collection)

  • Instance e owner de todos os recursos Kubernetes que cria (Deployment, Service, ConfigMap, SA, PVC)
  • Issue e owner de AIInsight, RemediationPlan e PostMortem (cascade delete)
  • Anomalies são independentes (não tem owner) para preservar histórico

Checklist de Implantação AIOps

1

Instalar Operator via Helm (CRDs + RBAC + Deployment + Dashboard)

helm install chatcli-operator \
  oci://ghcr.io/diillson/charts/chatcli-operator \
  --namespace chatcli-system --create-namespace
2

Criar Secret com API keys

Crie o Secret com as API keys do provedor LLM escolhido.
3

Criar Instance CR

Crie o Instance CR com watcher.enabled: true e targets configurados.
4

Verificar servidor

kubectl get instances — confirme que o servidor ChatCLI está rodando.
5

Verificar pipeline AIOps

  • kubectl get anomalies -A — anomalias sendo detectadas
  • kubectl get issues -A — issues sendo criados
  • kubectl get aiinsights -A — IA analisando
6

(Opcional) Criar Runbooks manuais

Crie Runbooks manuais para cenários específicos.
7

Monitorar métricas

Monitore métricas do operator via Prometheus.

Próximo Passo

K8s Operator

Configuração e exemplos

K8s Watcher

Detalhes de coleta e budget

Modo Servidor

RPCs GetAlerts, AnalyzeIssue e AgenticStep

Monitoramento K8s

Receita: Monitoramento K8s com IA