Skip to main content
O K8s Watcher consulta um ou mais workloads do Kubernetes em intervalos, guarda uma janela móvel do que viu, dispara alertas para falhas comuns e soma um resumo de tudo a cada prompt. Ele roda em três lugares:

Início rápido

Depois pergunte: O deployment está saudável?, Por que o pod myapp-7d9f-abcde está reiniciando?. One-shot:

Comandos e flags

chatcli watch

As flags de alvo único sempre observam um Deployment. StatefulSets, DaemonSets, Jobs e CronJobs são observados pelo kind de um arquivo de configuração (no Helm chart, watcher.targets[].kind).

Dentro do ChatCLI

O /watch start aceita --deployment, --namespace, --interval, --window, --max-log-lines e --kubeconfig.

chatcli server

No servidor o contexto é somado aos prompts do lado do servidor, então todo cliente chatcli connect recebe sem configurar nada, e os alertas são servidos por GetAlerts / StreamAlerts. O servidor imprime K8s watcher active: N targets (interval: 30s) ao subir; um arquivo de configuração que não carrega derruba o servidor com failed to load watch config: … (no log; veja Logs).

Arquivo de configuração multi-target

O arquivo é validado ao carregar: watch config file has no targets, target[0]: deployment (resource name) is required, target[2]: invalid kind "Pod" (must be Deployment, StatefulSet, DaemonSet, Job, or CronJob), invalid interval "30". O kubeconfig não é campo do arquivo; passe --kubeconfig / --watch-kubeconfig.

Kubeconfig e acesso ao cluster

O watcher usa o kubeconfig indicado por --kubeconfig / --watch-kubeconfig / CHATCLI_KUBECONFIG. Sem nenhum, tenta a service account in-cluster e depois ~/.kube/config, sempre com o contexto atual do arquivo. A variável KUBECONFIG não é lida.

O que é coletado

A cada intervalo, por alvo: O store guarda window / interval + 1 snapshots (no mínimo 10) e até 10 × maxLogLines linhas de log por alvo; dados mais antigos saem da janela.

Coleta Prometheus

  • Coleta de um pod: o primeiro pod Running com IP entre os pods do recurso, em http://<podIP>:<metricsPort><metricsPath> (HTTP puro, timeout de 5 s). O watcher precisa alcançar os IPs dos pods (rode-o no cluster, ou numa rede que roteie para os pods).
  • Interpreta o formato texto de exposição, ignora comentários, NaN e ±Inf.
  • Guarda um valor por nome de métrica: os labels são descartados e a última amostra de um nome vence, então http_requests_total{code="200"} e {code="500"} viram um número só. Filtre métricas que façam sentido sem label, ou exponha agregados.
  • Os globs de metricsFilter usam * como único curinga: http_*, *_errors_total, go_goroutines.

Alertas

Um alerta com o mesmo tipo e objeto de outro já na janela não é disparado de novo. Os alertas aparecem no contexto (## Active Alerts), guiam o orçamento de contexto e, no servidor, alimentam GetAlerts / StreamAlerts.

Contexto e orçamento

Com um alvo, vai o contexto completo (status do recurso, pods, HPA, nodes, eventos recentes, métricas da aplicação, alertas ativos, logs de erro recentes):
Com vários alvos, o contexto respeita o orçamento de maxContextChars:
  1. Cada alvo recebe uma nota: 2 com alerta crítico; 1 com réplicas prontas abaixo das desejadas, alerta de warning ou logs de erro; 0 nos demais casos.
  2. Os alvos são ordenados pela nota e depois pela quantidade de alertas.
  3. Alvos com nota 1 ou 2 recebem o contexto completo; os saudáveis, um resumo de uma linha.
  4. Estourando o orçamento, os alvos detalhados mais saudáveis viram uma linha e depois as linhas mais saudáveis são descartadas.
O /watch status no chatcli watch mostra K8s Watcher: Watching 12 targets: 10 healthy, 1 warning, 1 critical.

Métricas Prometheus do watcher

Quando o watcher roda dentro do chatcli server com métricas ligadas (--metrics-port, padrão 9090): chatcli_watcher_alerts_total conta um alerta quando o watcher o guarda como novo. Uma condição que persiste é vista a cada coleta, mas a repetição do mesmo tipo no mesmo objeto é descartada enquanto o alerta anterior ainda está na janela (--watch-window), então um problema contínuo conta uma vez, não uma por coleta. É um counter: use increase() ou rate() sobre um intervalo.

RBAC

Acesso somente leitura que o watcher usa. A parte de nodes (escopo de cluster) é opcional: sem ela faltam os dados e alertas de node, e o resto funciona.
Vincule-as à identidade com que o watcher roda: seu usuário no chatcli watch, a ServiceAccount do pod no servidor.
  • Helm chart: rbac.create: true (padrão) cria o RBAC; ele vira ClusterRole automaticamente quando há alvos fora do namespace do release ou em vários namespaces, ou quando o watcher.namespace de alvo único não é o namespace do release (vazio significa default). watcher.targets[].kind escolhe Deployment (padrão), StatefulSet, DaemonSet, Job ou CronJob, como no arquivo de configuração. As regras do chart são mais amplas do que o watcher precisa (cobrem também os recursos de remediação do AIOps), mas não dão acesso a Secrets; revise rbac.* antes de instalar num cluster sensível, e use rbac.additionalRules para um plugin que precise de um Secret.
  • Operator: para um watcher que lê fora do namespace da Instance (por targets ou por um watcher.namespace legado de alvo único), o operator vincula a ClusterRole pré-provisionada chatcli-watcher; no namespace da Instance ele cria uma Role namespaced. As duas leem Jobs e CronJobs além dos outros tipos de workload; veja K8s Operator.
Confira seu acesso antes de começar:

Integração com AIOps

O operator lê os alertas do watcher do servidor via StreamAlerts (caindo para polling de GetAlerts num servidor sem o stream) e os transforma em recursos Anomaly, que ele correlaciona em Issues, analisa (AIInsight) e remedia (RemediationPlan). Veja Plataforma AIOps.

Solução de problemas

Próximos passos

Modo Servidor

Compartilhe o watcher com o time

Receita de monitoramento K8s

Passo a passo

K8s Operator

Instances gerenciadas e AIOps

Docker e Kubernetes

Faça o deploy do servidor