Início rápido
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
/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
Runningcom IP entre os pods do recurso, emhttp://<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,
NaNe±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
metricsFilterusam*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):maxContextChars:
- Cada alvo recebe uma nota:
2com alerta crítico;1com réplicas prontas abaixo das desejadas, alerta de warning ou logs de erro;0nos demais casos. - Os alvos são ordenados pela nota e depois pela quantidade de alertas.
- Alvos com nota 1 ou 2 recebem o contexto completo; os saudáveis, um resumo de uma linha.
- Estourando o orçamento, os alvos detalhados mais saudáveis viram uma linha e depois as linhas mais saudáveis são descartadas.
/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 dochatcli 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.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 owatcher.namespacede alvo único não é o namespace do release (vazio significadefault).watcher.targets[].kindescolheDeployment(padrão),StatefulSet,DaemonSet,JobouCronJob, 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; reviserbac.*antes de instalar num cluster sensível, e userbac.additionalRulespara um plugin que precise de um Secret. - Operator: para um watcher que lê fora do namespace da Instance (por
targetsou por umwatcher.namespacelegado de alvo único), o operator vincula a ClusterRole pré-provisionadachatcli-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.
Integração com AIOps
O operator lê os alertas do watcher do servidor viaStreamAlerts (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