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çã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: 5, configurável via Instanceaiops.maxRemediationAttempts) - 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. Análise 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 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
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
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_URLenv var no operator
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
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
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
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
| 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 | 6 enrichers combinados | K8s 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_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 (54 tipos em 9 categorias):
Deployment / Genérico (19 ações):
| Categoria | Tipo | O que Faz | Parâmetros Chave |
|---|---|---|---|
| Workload | ScaleDeployment | Ajusta réplicas do Deployment | replicas |
| Workload | RestartDeployment | Rollout restart via annotation | — |
| Workload | RollbackDeployment | Rollback para revisão anterior/saudável/específica (via ReplicaSet) | toRevision |
| Workload | PatchConfig | Atualiza dados de ConfigMap | configmap, key=value |
| Workload | AdjustResources | Ajusta CPU/memória nos containers do Deployment | container, memory_limit, cpu_limit, etc. |
| Workload | DeletePod | Remove pod mais doente (auto-seleciona) | pod (opcional) |
| Workload | RestartStatefulSetPod | Restart de pod específico ou rolling restart do StatefulSet | pod (opcional) |
| GitOps | HelmRollback | Rollback de Helm release | revision |
| GitOps | ArgoSyncApp | Trigger sync ArgoCD | revision |
| Autoscaling | AdjustHPA | Modifica HPA min/max/target | minReplicas, maxReplicas, targetCPUUtilization |
| Infra | CordonNode | Marca node como unschedulable | node |
| Infra | DrainNode | Cordona e evicta pods do node | node |
| Storage | ResizePVC | Expande PVC (sem encolhimento) | pvc, size |
| Security | RotateSecret | Atualiza Secret ou copia de outra source | secret, sourceSecret ou key=value |
| Networking | UpdateIngress | Modifica backend/annotations do Ingress | ingress, backendService, backendPort |
| Networking | PatchNetworkPolicy | Adiciona portas em regras de ingress do NetworkPolicy | networkPolicy, allowPort, protocol |
| Advanced | ApplyManifest | Aplica manifesto JSON de ConfigMap | configmap, key |
| Advanced | ExecDiagnostic | Executa comando de um allowlist read-only em pod | command (ver allowlist), pod, container |
| — | Custom | Bloqueado — requer aprovação manual | — |
| Tipo | O que Faz | Parâmetros Chave |
|---|---|---|
ScaleStatefulSet | Scaling ordenado de réplicas | replicas |
RestartStatefulSet | Rolling restart via annotation (ordenado) | — |
RollbackStatefulSet | Rollback via ControllerRevision (não ReplicaSet) | toRevision (previous|N) |
AdjustStatefulSetResources | Ajusta CPU/memória nos containers do StatefulSet | container, memory_limit, cpu_limit, etc. |
DeleteStatefulSetPod | Deleta pod específico ou mais doente (preserva PVC) | pod (opcional) |
ForceDeleteStatefulSetPod | Force-delete de pod preso em Terminating (grace=0) | pod (OBRIGATÓRIO) |
UpdateStatefulSetStrategy | Altera tipo de updateStrategy | type (RollingUpdate|OnDelete), maxUnavailable |
RecreateStatefulSetPVC | Deleta PVC preso para recriação pelo controlador | pvc, confirm=true (OBRIGATÓRIO) |
PartitionStatefulSetUpdate | Define partition para canary rollout | partition |
| Tipo | O que Faz | Parâmetros Chave |
|---|---|---|
RestartDaemonSet | Rolling restart de todos os pods do DaemonSet em todos os nodes | — |
RollbackDaemonSet | Rollback via ControllerRevision | toRevision (previous|N) |
AdjustDaemonSetResources | Ajusta CPU/memória nos containers do DaemonSet | container, memory_limit, cpu_limit, etc. |
DeleteDaemonSetPod | Deleta pod (opcionalmente em node específico) | pod ou node (opcional) |
UpdateDaemonSetStrategy | Altera estratégia de update | type, maxUnavailable, maxSurge |
PauseDaemonSetRollout | Pausa rollout (maxUnavailable=0) | — |
CordonAndDeleteDaemonSetPod | Cordona node + deleta pod do DaemonSet nele | node (OBRIGATÓRIO) |
| Tipo | O que Faz | Parâmetros Chave |
|---|---|---|
RetryJob | Deleta Job falhado + recria a partir do spec | — |
AdjustJobResources | Ajusta CPU/memória no template do Job | container, memory_limit, cpu_limit, etc. |
DeleteFailedJob | Limpa Job falhado e seus pods | — |
SuspendJob | Pausa Job em execução (suspend=true) | — |
ResumeJob | Retoma Job suspenso (suspend=false) | — |
AdjustJobParallelism | Altera paralelismo do Job | parallelism |
AdjustJobDeadline | Altera activeDeadlineSeconds | activeDeadlineSeconds |
AdjustJobBackoffLimit | Altera backoffLimit | backoffLimit |
ForceDeleteJobPods | Force-delete de todos os pods do Job (grace=0) | — |
| Tipo | O que Faz | Parâmetros Chave |
|---|---|---|
SuspendCronJob | Pausa agendamento do CronJob (suspend=true) | — |
ResumeCronJob | Retoma agendamento (suspend=false) | — |
TriggerCronJob | Cria Job a partir do template imediatamente | — |
AdjustCronJobResources | Ajusta CPU/memória no jobTemplate | container, memory_limit, cpu_limit, etc. |
AdjustCronJobSchedule | Altera expressão cron do schedule | schedule |
AdjustCronJobDeadline | Altera startingDeadlineSeconds | startingDeadlineSeconds |
AdjustCronJobHistory | Altera limites de histórico | successfulJobsHistoryLimit, failedJobsHistoryLimit |
AdjustCronJobConcurrency | Altera concurrencyPolicy | concurrencyPolicy (Allow|Forbid|Replace) |
DeleteCronJobActiveJobs | Mata todos os Jobs ativos do CronJob | — |
ReplaceCronJobTemplate | Substitui jobTemplate a partir de JSON em ConfigMap | configmap, key |
7. ServerClient (grpc_client.go)
Cliente gRPC compartilhado entre WatcherBridge e AIInsightReconciler.
| Método | 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 19 ações disponíveis organizadas por categoria (Workload, GitOps, Autoscaling, Infra, Storage, Security, Networking, Advanced)
- 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: 18 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 qualquer remediação resolve um Issue (standard ou agêntica), 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 |
- 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
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 130 testes (185 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 | 38 | Todos os 54 tipos de ação (Deployment + StatefulSet + DaemonSet + Job + CronJob), safety constraints, loop agêntico, rollback, verificação |
| 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+17 | Todos os 54 mapeamentos string→enum incluindo StatefulSet, DaemonSet, Job, CronJob |
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
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