O K8s Watcher permite que o ChatCLI monitore múltiplos deployments simultaneamente, coletando métricas de infra e aplicação, logs, eventos e status de pods. O contexto é automaticamente injetado nos prompts do LLM com gestão inteligente de budget para não estourar a janela de contexto.


Arquitetura

Single-Target (legado)

  ChatCLI → ResourceWatcher → 6 Collectors → ObservabilityStore → Summarizer → LLM
  

Multi-Target (atual)

                          ┌→ ResourceWatcher[0] → Store[0] ─┐
ChatCLI → MultiWatcher ─┼→ ResourceWatcher[1] → Store[1] ─┼→ MultiSummarizer → LLM
                        └→ ResourceWatcher[N] → Store[N] ─┘   (budget-controlled)
  

Cada ResourceWatcher possui seus próprios collectors (incluindo PrometheusCollector opcional) e todos compartilham um único clientset Kubernetes, minimizando conexões.


Modos de Uso

1. Deployment Único (legado)

  chatcli watch --deployment myapp --namespace production
chatcli watch --deployment myapp -p "O deployment está saudável?"
  

2. Multiplos Deployments (config YAML)

  chatcli watch --config targets.yaml
chatcli watch --config targets.yaml -p "Quais deployments precisam de atenção?"
  

3. Servidor com Watcher

  # Multi-target
chatcli server --watch-config targets.yaml

# Single-target (legado)
chatcli server --watch-deployment myapp --watch-namespace production
  

Clientes conectados via chatcli connect recebem o contexto K8s automaticamente.


Arquivo de Configuração Multi-Target

  # targets.yaml
interval: "30s"           # Intervalo de coleta
window: "2h"              # Janela temporal de dados mantidos
maxLogLines: 100          # Linhas de log por pod por ciclo
maxContextChars: 32000     # Budget máximo de caracteres para contexto LLM

targets:
  - deployment: api-gateway
    namespace: production
    metricsPort: 9090                                        # Porta Prometheus
    metricsFilter: ["http_requests_total", "http_request_duration_*"]

  - deployment: auth-service
    namespace: production
    metricsPort: 9090

  - deployment: worker
    namespace: batch
    # Sem metricsPort = Prometheus desabilitado para este target

  - deployment: frontend
    namespace: production
    metricsPort: 3000
    metricsPath: "/custom-metrics"                           # Path customizado
    metricsFilter: ["next_*", "react_render_*"]
  

Campos do Target

CampoDescriçãoObrigatório
deploymentNome do deploymentSim
namespaceNamespace (padrão: default)Nao
metricsPortPorta do endpoint Prometheus (0 = desabilitado)Nao
metricsPathPath HTTP das métricas (padrão: /metrics)Nao
metricsFilterFiltros glob para métricas (vazio = todas)Nao

Flags Completas

chatcli watch

FlagDescriçãoPadrãoEnv Var
--configArquivo YAML multi-target
--deploymentDeployment único (legado)CHATCLI_WATCH_DEPLOYMENT
--namespaceNamespace do deploymentdefaultCHATCLI_WATCH_NAMESPACE
--intervalIntervalo entre coletas30sCHATCLI_WATCH_INTERVAL
--windowJanela temporal de dados2hCHATCLI_WATCH_WINDOW
--max-log-linesLinhas de log por pod100CHATCLI_WATCH_MAX_LOG_LINES
--kubeconfigCaminho do kubeconfigAuto-detectadoCHATCLI_KUBECONFIG
--providerProvedor de LLM.envLLM_PROVIDER
--modelModelo de LLM.env
-p <prompt>One-shot: envia e sai
--max-tokensLimite de tokens na resposta

chatcli server (flags do watcher)

FlagDescriçãoPadrãoEnv Var
--watch-configArquivo YAML multi-targetCHATCLI_WATCH_CONFIG
--watch-deploymentDeployment único (legado)CHATCLI_WATCH_DEPLOYMENT
--watch-namespaceNamespacedefaultCHATCLI_WATCH_NAMESPACE
--watch-intervalIntervalo de coleta30sCHATCLI_WATCH_INTERVAL
--watch-windowJanela de observação2hCHATCLI_WATCH_WINDOW
--watch-max-log-linesMax linhas de log100CHATCLI_WATCH_MAX_LOG_LINES
--watch-kubeconfigCaminho do kubeconfigAuto-detectadoCHATCLI_KUBECONFIG

O que e Coletado

Collectors por Target

CollectorDados Coletados
DeploymentReplicas (ready/available/updated), strategy, conditions
Pod StatusFase, readiness, restarts, termination info, container status
EventsEventos K8s (Warning/Normal), mensagem, razao, timestamp
LogsUltimas N linhas por container por pod
MetricsCPU e memória por pod (via metrics-server)
HPAMin/max replicas, métricas atuais, replicas desejadas
PrometheusMétricas de aplicação do endpoint /metrics dos pods

Prometheus Collector (Novo)

O PrometheusCollector scrapa métricas Prometheus diretamente dos pods:

  • Descobre pods do deployment e seleciona 1 pod Ready
  • Faz HTTP GET em http://podIP:port/path (timeout: 5s)
  • Parseia o formato Prometheus text exposition (stdlib, sem dependencias)
  • Filtra por glob patterns configurados
  • Ignora NaN, Inf e linhas de comentario

Exemplos de filtros glob:

  metricsFilter:
  - "http_requests_*"          # Todas as métricas HTTP
  - "process_*"                # Métricas de processo
  - "go_goroutines"            # Métrica específica
  - "*_duration_seconds_*"     # Qualquer métrica de duração
  

Gestão de Budget de Contexto (MultiSummarizer)

Com múltiplos targets, o MultiSummarizer garante que o contexto não estoure a janela do LLM:

Algoritmo

  1. Pontua cada target: 0 = healthy, 1 = warning, 2 = critical
    • Critical: CrashLoopBackOff, OOMKilled, alerts criticos
    • Warning: replicas < desired, error logs, alerts warning
    • Healthy: tudo ok
  2. Ordena: critical primeiro, depois warning, depois healthy
  3. Aloca contexto:
    • Score >= 1 → contexto completo (~1-3 KB por target)
    • Score == 0 → one-liner compacto (~80 chars por target)
  4. Se excede maxContextChars → comprime targets saudáveis primeiro
  5. Se ainda excede → omite targets saudáveis

Exemplo com 20 Targets (2 com problemas)

  [K8s Multi-Watcher: 20 targets monitored]

--- Targets Requiring Attention ---

[K8s Context: deployment/api-gateway in namespace/production]
Collected at: 2026-02-15T10:30:00Z

## Deployment Status
  Replicas: 2/3 ready, 3 updated, 2 available
  Strategy: RollingUpdate

## Pods (3 total)
  Total restarts: 12 (delta in window: 8)
  - api-gateway-abc12: Running [Ready] restarts=0 cpu=45m mem=128Mi
  - api-gateway-def34: Running [Ready] restarts=0 cpu=52m mem=135Mi
  - api-gateway-ghi56: Running [NOT READY] restarts=8 cpu=12m mem=95Mi
    Last terminated: OOMKilled (exit code 137) at 2026-02-15T10:28:00Z

## Application Metrics (4)
  http_request_duration_seconds_sum: 8453
  http_requests_total: 1.542e+06
  process_resident_memory_bytes: 1.34e+08
  go_goroutines: 245

## Active Alerts (2)
  [CRITICAL] CrashLoopBackOff: pod/api-gateway-ghi56
  [CRITICAL] OOMKilled: pod/api-gateway-ghi56

## Recent Error Logs (3)
  [10:27:45] api-gateway-ghi56/app: OutOfMemoryError: heap space
  [10:27:46] api-gateway-ghi56/app: Shutting down...
  [10:28:00] api-gateway-ghi56/app: Process exited with code 137

--- Healthy Targets ---
- production/auth-service: 3/3 pods ready | healthy | 0 alerts | 42 snapshots
- production/frontend: 2/2 pods ready | healthy | 0 alerts | 42 snapshots
- production/backend: 5/5 pods ready | healthy | 0 alerts | 42 snapshots
- batch/worker: 3/3 pods ready | healthy | 0 alerts | 42 snapshots
... (16 targets compactos)
  

Budget total: ~2 KB (detail) + 18 x 80 chars (compact) = ~3.5 KB, dentro do limite de 8 KB.


Detecção de Anomalias

AnomaliaCondiçãoSeveridade
CrashLoopBackOffPod com mais de 5 restartsCritical
OOMKilledContainer terminado por falta de memóriaCritical
PodNotReadyPod não está no estado ReadyWarning
DeploymentFailingDeployment com Available=FalseCritical

Os alertas sao incluidos no contexto enviado ao LLM e influenciam a prioridade de budget do MultiSummarizer.


Observability Store

Os dados coletados sao armazenados em um ring buffer por target com janela temporal configuravel:

  • Snapshots: Estado completo periodico (pods, deployment, HPA, events, metrics, app metrics)
  • Logs: Logs recentes de cada pod com classificação (info/warning/error)
  • Alertas: Anomalias detectadas com severidade e timestamps

Rotação Automática

Dados mais antigos que a janela temporal (--window) sao automaticamente descartados, mantendo o uso de memória constante independente do número de targets.


Comando /watch

Dentro do ChatCLI interativo (local ou remoto), use /watch para ver o estado:

Single-Target

  /watch
K8s Watcher Active
  Deployment:  myapp
  Namespace:   production
  Snapshots:   42
  Pods:        3
  Alerts:      1
  

Multi-Target

  /watch
K8s Multi-Watcher Active
  Watching 20 targets: 18 healthy, 1 warning, 1 critical
  

One-Shot com Contexto K8s

  # Deployment unico
chatcli watch --deployment myapp -p "O deployment está saudável?"

# Multi-target
chatcli watch --config targets.yaml -p "Resuma o status de todos os deployments"

# Via servidor remoto
chatcli connect meuservidor:50051 -p "Por que os pods estão reiniciando?"
  

Exemplos de Perguntas

  > O deployment está saudável?
> Quais deployments precisam de atenção?
> Por que o pod xyz está reiniciando?
> Analise as métricas HTTP do api-gateway. O latency está aceitável?
> Compare o estado do auth-service com 30 minutos atrás
> Quais eventos de warning ocorreram na última hora?
> Baseado nas métricas Prometheus, preciso escalar algum deployment?
> Resuma o status de todos os targets para um report de equipe
  

Requisitos

  • Kubernetes Cluster: Acesso via kubeconfig ou in-cluster config
  • Permissões RBAC: Leitura de pods, eventos, logs, deployments, HPA, ingresses
  • metrics-server (opcional): Para coleta de CPU/memória
  • Prometheus endpoints (opcional): Apps que expoe /metrics no formato Prometheus text

RBAC

Single-namespace: Use Role + RoleBinding:

  apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: chatcli-watcher
  namespace: production
rules:
  - apiGroups: [""]
    resources: ["pods", "pods/log", "events", "services", "endpoints"]
    verbs: ["get", "list", "watch"]
  - apiGroups: ["apps"]
    resources: ["deployments", "replicasets", "statefulsets", "daemonsets"]
    verbs: ["get", "list", "watch"]
  - apiGroups: ["autoscaling"]
    resources: ["horizontalpodautoscalers"]
    verbs: ["get", "list", "watch"]
  - apiGroups: ["networking.k8s.io"]
    resources: ["ingresses"]
    verbs: ["get", "list"]
  - apiGroups: ["metrics.k8s.io"]
    resources: ["pods"]
    verbs: ["get", "list"]
  

Multi-namespace: Quando os targets estão em namespaces diferentes, use ClusterRole + ClusterRoleBinding com as mesmas regras. O Operator faz isso automaticamente.


Integração com AIOps

Os alertas do K8s Watcher alimentam automaticamente o pipeline AIOps do Operator. Quando o Operator detecta alertas via GetAlerts RPC, ele cria Anomaly CRs que são correlacionados em Issues, analisados por IA e remediados automaticamente.

Alertas detectados pelo Watcher → Anomaly → Issue → AIInsight → RemediationPlan → Resolução

Veja AIOps Platform para o fluxo completo.


Próximo Passo