Visão Geral do Pipeline
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ção | Descriçã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) |
- 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
2. AnomalyReconciler (anomaly_controller.go)
Observa Anomaly CRs e os correlaciona em Issues.
Fluxo:
3. CorrelationEngine (correlation.go)
Motor de correlação que agrupa anomalias em incidentes.
Algoritmo de Correlação:
| Sinal | Peso | Justificativa |
|---|---|---|
oom_kill | 30 | Indica problema de memória severo |
error_rate | 25 | Impacto direto em usuários |
deploy_failing | 25 | Indisponibilidade do serviço |
latency_spike | 20 | Degradação de performance |
pod_restart | 20 | Instabilidade do pod |
pod_not_ready | 20 | Capacidade reduzida |
oom_kill (30) + pod_restart (20) = risk 50 → Medium. Se adicionar error_rate (25) = risk 75 → High.
Mapeamento de Fonte:
| Anomaly Source | Issue Source |
|---|---|
watcher | watcher |
prometheus | prometheus |
manual | manual |
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:
handleDetected()
handleDetected()
- Define
detectedAtemaxRemediationAttempts(padrão: 3) - Cria AIInsight CR com owner reference (Issue → AIInsight)
- Transiciona para
Analyzing - Requeue após 10 segundos
handleAnalyzing()
handleAnalyzing()
- Verifica se AIInsight tem
Analysispreenchida - Busca Runbook manual correspondente (
findMatchingRunbook— tiered matching) - Se encontrou Runbook manual →
createRemediationPlan()(manual tem precedência) - Se não encontrou Runbook manual mas AIInsight tem
SuggestedActions→generateRunbookFromAI()→createRemediationPlan()usando o Runbook auto-gerado - Se nenhum →
createAgenticRemediationPlan()(AgenticMode=true, sem ações pré-definidas — a IA decide cada passo) - Transiciona para
Remediating
findMatchingRunbook() -- Matching em camadas
findMatchingRunbook() -- Matching em camadas
- Tier 1: SignalType + Severity + ResourceKind (match exato, preferido)
- Tier 2: Severity + ResourceKind (fallback quando signal não bate)
SignalTyperesolvido de:issue.Spec.SignalType→ fallbackissue.Labels["platform.chatcli.io/signal"]
generateRunbookFromAI()
generateRunbookFromAI()
- Materializa
SuggestedActionsdo 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
CreateOrUpdatepara idempotência
handleRemediating()
handleRemediating()
- Busca RemediationPlan mais recente (
findLatestRemediationPlan) - Se
Completed→ IssueResolved+ invalida dedup do recurso- Se plano agêntico: gera PostMortem CR (timeline, causa raiz, impacto, lições) + Runbook reutilizável dos passos bem-sucedidos
- Se
Failede tentativas restantes → re-análise: coleta evidência de falha (collectFailureEvidence), limpa análise do AIInsight, volta para estadoAnalyzingcom failure context - Se
Failede max tentativas →Escalated+ invalida dedup do recurso
- Cada retry dispara re-análise do AI com contexto de falhas anteriores
- O AI recebe
previous_failure_contextcom evidência das tentativas que falharam - O prompt instrui: “Não repita as mesmas ações. Analise por que falharam e sugira uma abordagem fundamentalmente diferente”
- Gera novo Runbook auto-gerado com estratégia diferente (nome inclui attempt)
5. AIInsightReconciler (aiinsight_controller.go)
Observa AIInsight CRs e chama o AnalyzeIssue RPC para preencher a análise.
Fluxo:
Coleta contexto K8s
Coleta contexto K8s via
KubernetesContextBuilder (deployment, pods, eventos, revisões).Lê failure context
Lê failure context de annotation
platform.chatcli.io/failure-context (se re-análise).k8s_context.go):
Coleta 4 seções de contexto real do cluster (max 8000 chars):
- Deployment Status: replicas (desired/ready/updated/unavailable), conditions, container images + resources
- Pod Details (até 5 pods, unhealthy primeiro): phase, restart count, container states (Waiting/Terminated com reason + exit code)
- Recent Events (últimos 15): tipo, reason, message, count
- Revision History: Últimas 5 revisões (ReplicaSets) com diff de imagens entre revisões
| Campo | Origem | Descrição |
|---|---|---|
issue_name | Issue.Name | Nome do Issue |
namespace | Issue.Namespace | Namespace |
resource_kind | Issue.Spec.Resource.Kind | Tipo do recurso (Deployment) |
resource_name | Issue.Spec.Resource.Name | Nome do deployment |
signal_type | Issue.Spec.SignalType / labels | Tipo do sinal |
severity | Issue.Spec.Severity | Severidade |
description | Issue.Spec.Description | Descrição do problema |
risk_score | Issue.Spec.RiskScore | Score de risco |
provider | AIInsight.Spec.Provider | Provedor LLM |
model | AIInsight.Spec.Model | Modelo LLM |
kubernetes_context | KubernetesContextBuilder | Status do deployment, pods, eventos, revisões |
previous_failure_context | Annotation no AIInsight | Evidência de tentativas anteriores (retries) |
6. RemediationReconciler (remediation_controller.go)
Executa as ações definidas em um RemediationPlan.
Ações Suportadas:
| Tipo | O que Faz | Parâmetros |
|---|---|---|
ScaleDeployment | kubectl scale deployment/<name> --replicas=N | replicas (obrigatório) |
RestartDeployment | kubectl rollout restart deployment/<name> | — |
RollbackDeployment | Rollback para revisão anterior, saudável ou específica | toRevision (optional: previous, healthy, número) |
PatchConfig | Atualiza chave(s) em um ConfigMap | configmap, key=value |
AdjustResources | Ajusta CPU/memória requests/limits | memory_limit, memory_request, cpu_limit, cpu_request, container |
DeletePod | Remove o pod mais doente (CrashLoop > restarts) | pod (optional — auto-seleciona) |
Custom | Bloqueado — requer aprovação manual | — |
7. ServerClient (grpc_client.go)
Cliente gRPC compartilhado entre WatcherBridge e AIInsightReconciler.
| Metodo | Descriçã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: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:- Contexto do Issue (nome, namespace, recurso, severidade, risk score, descrição)
- Lista de ações disponíveis (
ScaleDeployment,RestartDeployment,RollbackDeployment,PatchConfig) - Instruções para retornar JSON estruturado com campos
analysis,confidence,recommendationseactions
- Remove markdown codeblocks (
```json ... ```) - Parseia JSON em
analysisResult - Clamp confidence entre 0.0 e 1.0
- 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:- Role + Issue details: contexto do incidente (tipo, severidade, recurso)
- Kubernetes context: estado real do cluster (refreshado a cada step via KubernetesContextBuilder)
- Tool definitions: 6 ações mutantes disponíveis + “Observe” (sem ação, espera próximo contexto)
- Conversation history: cada step anterior formatado com reasoning → action → observation
- Instructions: respond JSON, budget (step N of M), regras de segurança
resolved=true, a resposta inclui dados para geração do PostMortem (summary, root_cause, impact, lessons_learned, prevention_actions).
PostMortem Generation
Quando uma remediação agêntica resolve um Issue, oIssueReconciler gera automaticamente:
PostMortem CR
Criado viageneratePostMortem():
| Campo | Origem |
|---|---|
timeline | Issue.DetectedAt + cada step do AgenticHistory + resolved |
actionsExecuted | Steps com Action != nil (inclui resultado) |
summary | Annotation platform.chatcli.io/postmortem-summary (gerado pela IA) |
rootCause | Annotation platform.chatcli.io/root-cause |
impact | Annotation platform.chatcli.io/impact |
lessonsLearned | Annotation platform.chatcli.io/lessons-learned |
preventionActions | Annotation platform.chatcli.io/prevention-actions |
duration | Calculado: resolvedAt - detectedAt |
Runbook Auto-gerado (Agentic)
Criado viagenerateAgenticRunbook():
- 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:| Metrica | Tipo | Descrição |
|---|---|---|
chatcli_operator_issues_total | Counter | Total de issues por severidade e estado |
chatcli_operator_issue_resolution_duration_seconds | Histogram | Duração da detecção até resolução |
chatcli_operator_active_issues | Gauge | Número de issues não resolvidos |
Testes
O operator possui 96 testes (125 com subtests) cobrindo todos os componentes:| Componente | Testes | Cobertura |
|---|---|---|
| InstanceReconciler | 15 | CRUD, watcher, persistence, réplicas, RBAC, deletion, deepcopy |
| AnomalyReconciler | 4 | Criação, correlação, attachment a Issue existente |
| IssueReconciler | 12 | Máquina de estados, fallback AI, retry, plano agêntico, geração PostMortem |
| RemediationReconciler | 16 | Todos os tipos de ação, safety checks, loop agêntico (first step, resolved, max steps, timeout, action failed, observation) |
| AIInsightReconciler | 12 | Conectividade, mock RPC, parsing de análise, withAuth, TLS/token |
| PostMortemReconciler | 2 | Inicialização de estado, estado terminal |
| WatcherBridge | 22 | Mapeamento de alertas, dedup SHA256, hash, pruning, criação de Anomaly, buildConnectionOpts (TLS, token, ambos) |
| CorrelationEngine | 4 | Risk scoring, severidade, incident ID, anomalias relacionadas |
| Pipeline (E2E) | 3 | Fluxo completo: Anomaly→Issue→Insight→Plan→Resolved, escalonamento, correlação |
| MapActionType | 6 | Todos os mapeamentos string→enum |
Executar Testes
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
Verificar pipeline AIOps
kubectl get anomalies -A— anomalias sendo detectadaskubectl get issues -A— issues sendo criadoskubectl get aiinsights -A— IA analisando