Skip to main content
A API REST do ChatCLI AIOps Platform é servida pelo operator e dá acesso programático aos recursos de AIOps (Issues, RemediationPlans, AIInsights, Runbooks, ApprovalRequests, SLOs, PostMortems, AuditEvents, ClusterRegistrations e policies). As respostas seguem padrões Kubernetes-like (apiVersion + kind + metadata/resourceMeta + spec + status), com autenticação via API key, três roles e rate limit por cliente.

Incidents

Detecção, ack, snooze, timeline, remediação e resolução

Runbooks

CRUD completo de runbooks

Analytics

MTTD, MTTR, trends, top resources, capacity, compliance, custo

SLOs

Targets, error budget e burn rate

Federation

Status multi-cluster, correlações entre clusters

Health

Endpoints de liveness e readiness

Base URL

A API (e o dashboard web em /) escuta no pod do operator, porta 8090, exposta como porta api do Service chatcli-operator no namespace do operator (chatcli-system por padrão). Ela não é servida pelo Service de uma Instance (esse é o servidor gRPC na 50051).
A porta vem do value api.port do chart (padrão 8090), que define a variável de ambiente CHATCLI_AIOPS_PORT do operator. Para servir HTTPS (TLS 1.3 no mínimo), defina CHATCLI_AIOPS_TLS_CERT e CHATCLI_AIOPS_TLS_KEY com arquivos de certificado e chave dentro do container do operator (chart: security.apiTLS.certFile / security.apiTLS.keyFile). O chart do operator não tem value extraVolumes, então os arquivos precisam chegar por outro meio (por exemplo, um patch no Deployment); a alternativa é terminar o TLS em um Ingress ou gateway na frente do Service. Sem as duas variáveis, a API é HTTP puro.
Várias réplicas do operator. Toda réplica serve a API REST e o dashboard na 8090, então um Service com várias réplicas pode mandar a requisição para qualquer pod. Leituras são respondidas por qualquer réplica; um resolve manual aceito por uma réplica que não é a líder é concluído pelo reconciler de Issue da líder.

Fluxo de requisição


Autenticação

Toda requisição em /api/ precisa do header X-API-Key com uma chave válida:

Roles

As roles seguem a ordem viewer < operator < admin; cada endpoint exige uma role mínima (veja a tabela de endpoints). Essas três strings são as únicas roles válidas: uma chave com qualquer outra role (por exemplo superadmin ou readonly) é aceita como chave, mas recebe 403 em todos os endpoints.

viewer

Somente leitura. Todos os endpoints GET. Ideal para dashboards e ferramentas de observabilidade.

operator

Operação diária. Tudo o que viewer faz, mais as ações POST (acknowledge, snooze, resolve, approve, reject, review/close/feedback de postmortem) e criar/atualizar runbooks.

admin

Acesso total. Tudo o que operator faz, mais DELETE /runbooks/{name}.

Configurando as API keys

As chaves são lidas do namespace do operator (chatcli-system por padrão), nesta ordem:
  1. Secret chatcli-operator-secrets, chave api-keys (recomendado)
  2. ConfigMap chatcli-operator-config, chave api-keys (fallback, usado só quando o Secret não existe)
O valor é uma lista YAML de entradas {key, role, name, description}. O name é opcional: é a identidade registrada nas decisões de aprovação tomadas com a chave (na falta dele vale o description, e depois uma impressão digital key-<hash>), e um quorum conta cada chave uma vez, então dê a cada aprovador a sua própria chave. O chart do operator só gera o Secret com apiKeys.create: true (as chaves ficam então guardadas no release do Helm); fora isso, é você quem cria:
O operator consulta o Secret e o ConfigMap a cada 30 segundos e recarrega as chaves sem reiniciar: incluir ou remover uma entrada vale em cerca de 30 s.
Nenhuma chave configurada = toda chamada em /api/ retorna 401. Se nenhum dos dois objetos tiver uma chave válida, a API fica fechada (fail-closed). Já CHATCLI_OPERATOR_DEV_MODE=true no operator (chart: security.devMode: true) deixa toda requisição passar como admin, sem chave — só para desenvolvimento local, nunca em produção. Qualquer valor booleano verdadeiro conta (true, TRUE, 1, t, sem diferenciar maiúsculas), igualmente para a checagem de auth, o rate limiter e o log de startup.As chaves seguem a origem delas: uma lista vazia não deixa nenhuma chave válida, um Secret sem a entrada api-keys cai para o ConfigMap, e apagar o Secret e também o ConfigMap revoga todas as chaves carregadas na próxima consulta (em cerca de 30 s, 401 a partir daí). Uma entrada api-keys que não é YAML válido mantém em vigor o último conjunto de chaves válido e é registrada no log uma vez por versão. Um erro de leitura que não seja “não encontrado” também mantém as chaves em vigor, para que nem um erro de digitação nem uma instabilidade do API server tranque todo mundo do lado de fora. A inicialização aplica as mesmas regras da consulta.
Teste sem cluster. No diretório operator/ do repositório, make dash-preview serve o dashboard e esta API sobre dados sintéticos em http://127.0.0.1:8085/, com a API key preview (role admin). Troque o endereço com DASHPREVIEW_ADDR.

Rate limiting

A API aceita 30 requisições por minuto por host de cliente para requisições sem API key válida (token bucket, rajadas de até 30, reposto continuamente a 0,5 req/s), e 600 requisições por minuto por API key válida (rajadas de até 600, repostas a 10 req/s), com a chave identificada por um digest. O limite roda antes da autenticação; o limite por chave é o mesmo para todas as roles. Headers de forwarding não são honrados, então atrás de um proxy todo chamador sem chave divide o bucket do host do proxy. Buckets ociosos são descartados depois de 10 minutos. Ao estourar, o operator retorna 429 Too Many Requests com o envelope de erro padrão (rate limit exceeded: N requests per minute) e um header Retry-After com os segundos até o bucket voltar a ter um token (2 no limite por host, 1 no limite por chave). Nenhum header X-RateLimit-* é enviado. Implemente backoff nos clientes de produção e mantenha dashboards ou coletores que consultam muitos endpoints dentro do orçamento.

CORS

Requisições cross-origin de navegador são negadas por padrão: nenhum header CORS é enviado até uma origem ser configurada. Configure com variáveis de ambiente no operator (ou os values equivalentes do chart em security.*): Os headers de requisição permitidos são Content-Type, X-API-Key e Authorization; a resposta de preflight fica em cache por 1 hora. O dashboard servido pelo próprio operator é same-origin e não precisa de configuração de CORS.

Formato de resposta

Todas as respostas seguem um padrão Kubernetes-like:

Códigos de erro


Paginação

Os endpoints de lista suportam paginação via query parameters:
integer
padrão:"1"
Número da página (começa em 1)
integer
padrão:"20"
Itens por página (valores acima de 100 são limitados a 100)
A resposta inclui metadata.totalCount para você calcular o total de páginas. Valores inválidos voltam aos padrões. A maioria das listas aceita namespace (omitido = todos os namespaces). Incidents, postmortems, eventos de auditoria e os endpoints de analytics também aceitam os filtros de tempo from / to (RFC 3339, por exemplo 2026-03-19T00:00:00Z), aplicados ao horário de criação do recurso (o horário do evento, na auditoria). Datas que não fazem parse são ignoradas.

Endpoints

Todos os paths são relativos a /api/v1. /healthz e /readyz (fora de /api/v1) não exigem chave — veja Health endpoints.

Versionamento

A API usa versionamento por path (/api/v1/). Hoje só existe a v1.

Próximos passos

Visão geral do AIOps Platform

Como a plataforma detecta, analisa e remedia incidentes

Kubernetes Operator

Deploy do operator, CRDs e configuração

Ciclo de vida do incidente

Fluxo completo: detecção → análise → remediação → resolução

AIOps em produção

Cookbook: setup completo com TLS, RBAC, notificações e SLOs