Skip to main content
A plataforma AIOps do ChatCLI inclui um dashboard web embutido (SPA self-contained servida pelo operator) e 4 dashboards Grafana (JSON no repositório) para observabilidade do pipeline de operações autônomas.

Web Dashboard

Visão Geral

O Web Dashboard é uma Single Page Application embutida diretamente no binário do operator via Go embed.FS — não requer Node.js, npm ou qualquer build frontend separado.
O dashboard consome a mesma API REST documentada na API Reference. Toda operação disponível no dashboard (acknowledge, snooze, resolve, approve, reject, revisão, fechamento e feedback de post-mortem e reconhecimento de ação humana) é uma chamada REST autenticada e exige pelo menos a role operator; uma chave viewer vê tudo, mas suas ações devolvem 403.

Tema e idioma

Os dois seletores ficam no cabeçalho, ao lado do controle de auto-refresh, e são acessíveis por teclado. A escolha fica guardada no navegador e é aplicada antes da primeira pintura, então um reload nunca pisca o tema errado. Os parâmetros de query ?theme= e ?lang= definem a preferência uma vez e a persistem, então um bookmark como http://localhost:8090/?lang=pt-BR&theme=dark abre o dashboard em português e escuro em todas as visitas seguintes. O atributo <html lang> acompanha o idioma, e os valores que vêm da API (severidade, estados de incidente e de plano, decisões de aprovação) mantêm o valor bruto no markup enquanto o rótulo visível é traduzido.
Os nomes de produto ficam em inglês nos dois idiomas: Issue, SLO, Runbook, PostMortem, AIInsight e RemediationPlan são os nomes dos CRDs que o operator gerencia.

Arquitetura

A página em si (/) é servida sem autenticação; toda chamada de dados que ela faz vai para /api/v1/ com a API key. No primeiro acesso o dashboard pede a chave, valida contra /api/v1/incidents e a guarda no localStorage do navegador (chatcli_api_key); Trocar a chave de API no cabeçalho a apaga.
O dashboard é servido pelo operator, na porta api (8090) do Service chatcli-operator no namespace do operator, e não pelo Service da Instance do ChatCLI. Toda réplica do operator serve o dashboard e a API, então um Service com várias réplicas pode rotear para qualquer uma delas.

Views do Dashboard

O dashboard tem 11 views acessíveis por abas. Um filtro de período no cabeçalho (Todo o período, ou De/Até) é repassado como from/to às listas que o suportam.
Visão geral da plataforma com métricas agregadas, montada a partir de /analytics/summary, /analytics/compliance, /analytics/capacity, /analytics/remediation-stats, /analytics/mttd, /analytics/mttr e da lista de incidentes.Componentes:Os painéis podem ser reorganizados arrastando o cabeçalho; a ordem fica em localStorage (panelOrder_overviewPanels).
Tabela interativa dos incidentes com filtros e ações.Funcionalidades:Ack, Adiar e Resolver exigem a role operator. Ack para a escalação do incidente no nível atual (nenhum nível a mais, nenhuma repetição) e registra quem reconheceu no status da EscalationPolicy. Adiar segura toda notificação exceto Resolved, e a escalação, até o snooze terminar; um page de escalação retido sai nesse momento e o timer do nível recomeça. Veja reconhecimento e snooze.Badges de severidade (tema escuro):Badges de estado (tema escuro):
Um card por SLO, ordenados por nome, mais uma tabela Alertas de SLO ativos com os SLOs abaixo da meta.Componentes por SLO:
Pedidos de aprovação, mais recentes primeiro, com ações de aprovar/rejeitar. O badge da aba mostra quantos estão pendentes.Funcionalidades:
Uma decisão tomada aqui é igual à chamada REST: ela fica gravada em status.decisions como <seu nome> (api-key: <identidade da chave>), e o controller de aprovação avalia então quorum e change window. Um quorum conta cada API key uma vez, então cada aprovador precisa da própria chave; um pedido que não está mais pendente, ou que a sua chave já decidiu, devolve erro. Veja Fluxo de Aprovação. Quando o pedido traz a annotation platform.chatcli.io/blast-risk-level, o card mostra um badge de blast radius colorido pelo nível.
Veja todas as análises geradas pela IA para entender como ela raciocinou sobre cada incidente.Funcionalidades:Esta view é essencial quando um incidente é escalado para ação humana — ela mostra o que a IA encontrou, por que recomendou certas ações e quais dados de enriquecimento embasaram a análise.Endpoint da API: GET /api/v1/aiinsights
Acompanhe todos os planos de remediação com detalhes de execução, tanto baseados em runbook quanto agênticos.Funcionalidades:Modos de remediação:
  • Modo Runbook: mostra a sequência de ações do runbook a partir do qual o plano foi montado
  • Modo Agentic: mostra a contagem de passos; use a API Get Remediation Plan para o histórico completo da conversa com a IA
Endpoint da API: GET /api/v1/remediations
Veja todos os runbooks — tanto os criados manualmente quanto os gerados pela IA.Funcionalidades:RemediationPlans não agênticos são montados a partir de um runbook. Quando uma Issue é analisada e nenhum runbook que casa com o gatilho dela (tipo de sinal, severidade, tipo de recurso) é aceito, o operator gera um a partir das ações sugeridas pela IA; depois de uma remediação agêntica bem-sucedida, ele também salva as ações que funcionaram como um runbook agentic-…. Runbooks gerados levam o label platform.chatcli.io/auto-generated: "true" e são reutilizados pelo próximo incidente parecido, em vez de começar do zero.Endpoint da API: GET /api/v1/runbooks
Tabela de post-mortems com detalhes expansíveis.Funcionalidades:Revisar, Fechar, feedback e Ack Human Action exigem a role operator.
Visão geral da federação e um card por cluster registrado.Tiles de resumo (de /clusters/global-status): Total de Clusters, Saudáveis (conectados, todos os nodes Ready), Degradados (conectados, com a condition Degraded: alguns nodes não Ready), Offline.Painel de Federação:Componentes por cluster:Endpoints da API: GET /api/v1/clusters/global-status, GET /api/v1/federation/status, GET /api/v1/federation/correlations
Visão somente leitura dos quatro tipos de política que os controllers leem: ApprovalPolicy, NotificationPolicy, EscalationPolicy e IncidentSLA. As políticas são escritas via kubectl ou GitOps, onde são revisadas; a aba mostra o que está em vigor, por namespace ou em todos.Toda coluna ordena. Endpoints da API: GET /api/v1/policies/{kind}, GET /api/v1/policies/{kind}/{name}
Log de auditoria pesquisável (CRs AuditEvent) com exportação.Funcionalidades:

Grafana Dashboards

O repositório traz 4 dashboards Grafana em JSON em deploy/grafana/, prontos para importação. Painéis baseados em métricas chatcli_operator_* precisam que o endpoint de métricas do operator seja coletado; painéis com chatcli_grpc_*, chatcli_llm_*, chatcli_session_*, chatcli_server_* e chatcli_watcher_* precisam também da porta de métricas do servidor ChatCLI (9090).

1. AIOps Overview (aiops-overview.json)

2. SLO Burn Rate (slo-burn-rate.json)

Variáveis de template service e slo_name.

3. Incident Timeline (incident-timeline.json)

4. Remediation Stats (remediation-stats.json)

Todo painel consulta apenas métricas, labels e valores que o operator ou o servidor exporta; um teste no repositório garante isso nos quatro arquivos. Alguns painéis que vale conhecer:
  • Expired Approvals (24h) conta chatcli_operator_approvals_total{result="expired"}. Para as aprovações pendentes agora, use o tile de Aprovações Pendentes do dashboard ou /api/v1/approvals?state=Pending.
  • Auto-Approved (24h) e Auto-Approve Rate leem mode="auto", result="approved"; Notification Success Rate lê result="success".
  • Notification Latency by Channel lê chatcli_operator_notification_duration_seconds (p50/p95 por channel_type).
  • Clusters by Status / Connected Clusters leem chatcli_operator_federation_clusters_total, um gauge definido por estado (connected, degraded, disconnected) a partir das registrations que existem.
  • Critical Issues Detected (24h) conta as Issues críticas que entraram em Analyzing nas últimas 24 horas.

Instalação dos Dashboards Grafana

Via Grafana Sidecar (Recomendado)

Se você usa o Helm chart do Grafana com o sidecar de dashboards habilitado, crie um ConfigMap com os quatro arquivos e o label grafana_dashboard: "1", a partir de um checkout do repositório:
O sidecar do Grafana detecta ConfigMaps com o label grafana_dashboard: "1" e importa os dashboards sem restart. deploy/grafana/dashboards-configmap.yaml traz só os dois ServiceMonitors que o Prometheus precisa para coletar o operator e o servidor (o do servidor seleciona app.kubernetes.io/name: chatcli, o label que os Services das Instances e o chart do servidor têm), com esses mesmos comandos nos comentários; ele não carrega ConfigMap de dashboards, então aplicá-lo nunca sobrescreve o criado acima. Nomeie cada arquivo JSON: apontar --from-file para o diretório também colocaria esse YAML dentro do ConfigMap.
Os painéis referenciam o datasource como ${DS_PROMETHEUS}, que só a tela de importação resolve; o provisionamento pelo sidecar não resolve, e os painéis mostram Datasource ${DS_PROMETHEUS} was not found. Substitua o UID do seu datasource Prometheus nos arquivos antes de criar o ConfigMap, por exemplo sed 's/\${DS_PROMETHEUS}/prometheus/g' em cada JSON (veja o setup de produção).

Via Importação Manual

  1. Vá em Grafana > Dashboards > Import
  2. Faça upload do arquivo JSON ou cole o conteúdo
  3. Selecione o datasource Prometheus
  4. Clique em Import

ServiceMonitor para Prometheus Operator

Com o Helm chart do operator, defina serviceMonitor.enabled: true (mais serviceMonitor.interval, scrapeTimeout e labels conforme necessário); o chart gera um ServiceMonitor para a porta metrics (8080, path /metrics). Escrito à mão, para um release chamado chatcli-operator:
O endpoint de métricas é HTTP simples, sem autenticação.

Referência de Métricas Prometheus

O operator expõe estas métricas (além das padrão do controller-runtime) na sua porta de métricas: O operator não exporta métricas de tokens de LLM, custo ou capacidade; o custo de LLM por incidente está em GET /api/v1/analytics/cost e as previsões de capacidade em GET /api/v1/analytics/capacity. Métricas de requisições e tokens de LLM (chatcli_llm_*) vêm do servidor ChatCLI.

Queries Prometheus Úteis

Exemplos de queries PromQL para dashboards ou alertas:

Acessar e publicar o dashboard

1

Verificar o operator

Confirme que o operator está rodando:
2

Preview local (sem cluster)

Para revisar o próprio dashboard, ou testar uma mudança nele, sirva-o sobre um client fake com dados sintéticos:
Abra http://127.0.0.1:8085/ e entre com a API key preview, que carrega o papel admin para que aprovações, revisões e feedback de post-mortem possam ser exercitados. O seed cobre todas as abas: issues em todos os estados, um AI insight, planos de remediação, uma aprovação pendente, um post-mortem, SLOs, clusters, eventos de auditoria e runbooks com passos. Defina DASHPREVIEW_ADDR para trocar o endereço. A ferramenta vive em operator/hack/dashpreview e nunca faz parte da imagem do operator.
3

Configurar as API Keys

O operator lê as API keys do Secret chatcli-operator-secrets (chave api-keys) no próprio namespace, com fallback para o ConfigMap chatcli-operator-config (mesma chave). Crie-o você mesmo como abaixo, ou deixe o chart do operator renderizá-lo (apiKeys.create: true com apiKeys.entries; as keys ficam então guardadas na release do Helm, então não faça os dois). O valor é uma lista YAML; as roles são viewer, operator e admin (qualquer outra role é negada):
Mudanças são aplicadas em cerca de 30 segundos, sem restart. Uma edição que deixa YAML inválido mantém em vigor o último conjunto de chaves válido (o operator registra o erro no log). Sem nenhuma chave configurada, toda chamada a /api/ devolve 401 (a página carrega, mas não consegue entrar).Para ler as keys de volta, por exemplo para entrar a partir de um navegador novo:
4

Port-forward (desenvolvimento)

Para acesso local durante desenvolvimento:
Acesse: http://localhost:8090/
5

Publicar com um Ingress (produção)

Sirva o dashboard na raiz de um host só dele. A página chama /api/v1/... e /healthz com caminhos absolutos, então sob um sub-path (/chatcli com rewrite ou strip-path) a página carrega mas todos os painéis falham; rotear /api/v1 à parte no host compartilhado só esconde o problema e publica a API em todos os hosts daquele controller.
  • Qualquer controller: a regra acima não precisa de anotação do controller. Não adicione reescrita de caminho (nginx.ingress.kubernetes.io/rewrite-target, konghq.com/strip-path, um middleware StripPrefix do Traefik): com path: / não há nada a remover.
  • TLS: termine no Ingress como acima, ou sirva HTTPS (TLS 1.3) direto do operator com security.apiTLS.certFile/keyFile do chart (CHATCLI_AIOPS_TLS_CERT/CHATCLI_AIOPS_TLS_KEY), montando o certificado com extraVolumes/extraVolumeMounts. Um backend que serve TLS precisa da configuração de protocolo de backend do controller (no ingress-nginx, nginx.ingress.kubernetes.io/backend-protocol: "HTTPS").
  • Cluster local (kind, k3d, Docker Desktop): quando o ingress controller atende em localhost, use um nome sob .localhost, por exemplo host: aiops.localhost, e tire o bloco tls. Navegadores, curl, macOS e systemd-resolved mandam todo nome *.localhost para o endereço de loopback, então não é preciso DNS nem entrada no /etc/hosts.
  • Métricas: não publique a porta de métricas (8080) pelo mesmo Ingress: ela é HTTP puro, sem autenticação.
  • Rate limit: 30 requisições por minuto por host de cliente para requisições sem API key válida, 600 por minuto por key válida. Atrás de um Ingress toda requisição sem key vem do controller, então elas dividem uma cota só; o tráfego do dashboard carrega a key, então navegadores logados não dividem.
  • CORS: chamadas cross-origin são negadas a menos que liberadas com security.corsAllowedOrigins (CHATCLI_CORS_ALLOWED_ORIGINS); o dashboard em si é same-origin e não precisa de configuração de CORS.
Confira: curl -s https://aiops.example.com/healthz responde {"status":"ok",...}, e curl -s -o /dev/null -w '%{http_code}' https://aiops.example.com/api/v1/incidents responde 401 sem key.
Nunca exponha o dashboard sem API keys em produção. O modo dev (CHATCLI_OPERATOR_DEV_MODE=true, ou TRUE, 1, t; chart security.devMode) sem chaves configuradas dá a role admin a qualquer chamador sem chave, incluindo operações de escrita como acknowledge, resolve, approve e reject. Use só localmente.

Próximo Passo

API REST Reference

Referência completa de todos os endpoints consumidos pelo dashboard.

Capacity & Custos

Detalhes do Capacity Planner, Noise Reducer e Cost Tracker.

AIOps Platform

Arquitetura completa do pipeline de operações autônomas.

K8s Operator

Configuração e deployment do operator Kubernetes.