Manual do DBA — Cosmos Optimizer passo a passo
Walkthrough de cada pane do Cosmos Optimizer com um cluster de produção real. Para cada tela: o que ela mostra, como testá-la, o que esperar, e como fazer troubleshooting quando algo está fora.
§0 Pré-requisitos
Antes de abrir o Optimizer, conclua o guia de setup. Sem credenciais, cada pane de métricas mostra NO SOURCE e cai para Local samples (só o que o próprio NoSqlStudio queryou).
- Siga o setup de monitoramento do Cosmos end-to-end: Service Principal, role assignment RBAC, Resource ID, Cloud Credentials. Setup de monitoramento Cosmos.
- Verifique com az login --service-principal e az monitor metrics list que o SP consegue ler métricas da sua conta Cosmos.
- Abra o NoSqlStudio → conecte-se à conta Cosmos → abra Tools → Cosmos DB → Cosmos Optimizer (ou Ctrl+Alt+Shift+O).
§1 Smoke test de 5 minutos — confirma que tudo está conectado
Objetivo: em 5 minutos, confirmar que o Azure Monitor está alimentando dados reais ao NoSqlStudio. Se algum passo falhar, vá para §3 Troubleshooting. §3 Troubleshooting.
- Conecte-se à sua conta Cosmos no NoSqlStudio. Confirme que você vê a árvore de databases na sidebar.
- Abra o Cosmos Optimizer. O banner de intro deve mostrar o botão CONFIGURE DATA SOURCES se credenciais estiverem faltando, ou o conteúdo do pane diretamente se elas estiverem salvas.
- Vá para RU Budget. O banner de source-mode deve mostrar AZURE MONITOR — aggregate only em verde dentro de 2 segundos. Clique em Refresh. Em 1-2 minutos você deve ver Consumed (avg) diferente de zero.
- Clique em cada tab (Query Cost, Hot Partitions, Index Policy, Throughput Optimizer, Throttling RCA, Diagnostic Logs, Composite Index, PITR Restore, Migration Wizard). Nenhum deve mostrar erro vermelho.
- Abra o console DevTools (F12) — NÃO deve conter ChainedTokenCredential authentication failed ou monitor client is null.
§2 Walkthroughs por pane
Uma seção por pane. Cada uma tem: screenshot (quando disponível), o que mostra, teste passo a passo, resultado esperado em um cluster de produção movimentado, e notas de troubleshooting para problemas comuns.
RU Budget

Vista ao vivo de RU/s consumido pela sua conta Cosmos vs o budget que você definiu. Forecast Holt-Winters de 24h. Card de Recommendation comparando manual / autoscale / serverless / reserved.
Passos do teste
- Defina RU/s budget para o throughput provisionado da sua conta (ex.: 5000 para um provisioning de 5k RU/s a nível de database).
- Clique em Refresh.
- Observe Consumed (avg): deve ser diferente de zero em um cluster ativo. Compare com o valor que você vê no Azure Portal em Metrics → NormalizedRUConsumption.
- Verifique a cor do badge Utilisation: verde = abaixo de 65%, amarelo = 65-85%, vermelho = acima de 85%. Vermelho significa consideração urgente de scale-up.
- Leia o card de Recommendation. Saídas comuns: RESERVED-3Y para workloads steady, AUTOSCALE para os spiky, SERVERLESS para bursts de baixo volume.
- Role até Per collection (preview). Com apenas Azure Monitor, você vê uma única linha de instância agregando tudo — per namespace requer Log Analytics (PAID tier).
Query Cost Inspector

Captura o response header x-ms-request-charge de cada query que você roda pelo NoSqlStudio. Zero chamadas à Azure API — instrumentação puramente client-side, sempre disponível.
Passos do teste
- Abra uma tab Shell ou Query contra a collection Cosmos.
- Rode uma query pesada, ex.: db.Deals.find({ status: 'closed' }).limit(100) ou db.Deals.aggregate([{$match:{}}, {$group:{_id:'$status', n:{$sum:1}}}]).
- Volte ao tab Query Cost. Top query shapes deve popular com o shape, RU total, RU médio, p95, max, e count.
- Rode o mesmo shape 5+ vezes para popular o count e p95 corretamente.
- Use o input de filter no topo-direito para restringir a ns ou substring de shape.
Hot Partition Detector

Probe ativo que agrupa documentos pela sua partition key e ranqueia as partitions resultantes por doc count. Pega skew (uma partition tendo 40%+ dos docs) antes que vire tempestade de throttle 429.
Passos do teste
- Preencha Namespace: formato db.coll, ex.: catalog.products.
- Preencha Partition key path: o nome do campo que você usou como shardKey ao criar a collection, ex.: tenantId.
- Clique em Scan. Isso roda uma aggregation $group no Cosmos — custa RU proporcional ao tamanho da collection. Em uma collection de 200 GB espere 100-500 RU.
- Leia o badge spread no top-right: verde = distribuição uniforme, amarelo = moderate skew, vermelho = severe skew (top partition > 40% dos docs).
- Use o heatmap para spotar partitions hot específicas. Hover em qualquer célula para o key value exato + doc count.
Visual Index Policy Editor

Cosmos indexa todas as propriedades por default — cada write custa 1 RU por propriedade indexada. Excluir paths nunca queryados pode cortar consumo de write RU em 30-70% em collections document-heavy.
Passos do teste
- Preencha Namespace, ex.: catalog.products.
- Clique em Sample schema. NoSqlStudio lê 100 docs e constrói uma árvore de todos os field paths.
- Desmarque qualquer field que NUNCA aparece em uma cláusula WHERE / filter — pense em imageBase64, fullText, metadata.audit.*, etc.
- Clique em Save draft. JSON preview atualiza com a indexingPolicy proposta.
- Copie o JSON, aplique via shell: db.runCommand({collMod: 'products', indexingPolicy: <paste>}).
Throughput Optimizer + Bill Simulator

Classifica seu workload (STEADY / SPIKY / CYCLIC / RAMP) dos últimos 15 min de métricas, depois simula bill mensal nos 5 modes de cobrança Cosmos lado-a-lado. Quote de Reserved Capacity na base.
Passos do teste
- Clique em Refresh no topo-direito.
- Leia o card Workload classification. Saídas comuns: STEADY (low variance, CV < 0.4), SPIKY (CV > 0.8, recomenda autoscale), CYCLIC (peaks diários previsíveis, recomenda reserved com scheduled scale).
- Compare os 5 cards Monthly bill. O mais barato com badge RECOMMENDED é a escolha do algoritmo.
- Procure o banner vermelho THROTTLED no card manual: indica que seu p95 atual excede o tier simulado e causaria 429s.
- Role até Reserved capacity quote: número concreto de RU/s para se comprometer + economia mensal vs manual.
Throttling RCA

Conta respostas 429 (rate-limited) na janela recente via Azure Monitor, depois correlaciona cada burst com queries capturadas no ring buffer do Query Cost. Surface a query shape com maior RU cumulativo durante a janela de 429 — o provável culpado.
Passos do teste
- Clique em Refresh. Leia Total 429s, 429 events, e Peak / interval.
- Defina o input Window ± minutos (default 5). Diminua para correlation mais apertada, aumente se nenhuma query caiu na janela.
- Role até Suspect queries. Cada linha = um burst de 429 com a query shape mais cara que rodou ± window minutos do burst, com um confidence score (0-1).
- Se vazio: abra o tab Query Cost Inspector e rode tráfego. Sem captures de query, o RCA não tem nada para correlacionar.
Diagnostic Logs (KQL templates)

10 queries Kusto prontas contra os Cosmos Diagnostic Logs no seu workspace Log Analytics. Requer o tier PAID (Diagnostic Settings ativado, workspace ID do Log Analytics configurado).
Passos do teste
- Verifique se o banner AZURE MONITOR mostra upgrade available: Log Analytics. Se você não plugou o workspace ID, este pane mostra NO SOURCE e o botão Run in app fica disabled.
- Clique em qualquer card de template (ex.: Slow queries — last 1 hour) para carregar seu KQL no editor.
- Clique em Edit para ajustar o KQL inline (ex.: mude ago(1h) para ago(24h)).
- Clique em Run in app. Tabela de resultados renderiza embaixo em 2-5 segundos.
- Para análise long-form, clique em Open in portal para deep-link da query no editor KQL do Azure Portal.
Composite Index Recommender

Observa o ring buffer do Query Cost, identifica query shapes que tocam 2+ campos sem um composite index correspondente, projeta ~60% de economia de RU, emite o JSON snippet para colar na indexingPolicy do Cosmos.
Passos do teste
- Defina Min queries to consider = 5 (default). Threshold para considerar uma shape valer a recomendação.
- Rode queries representativas pelo NoSqlStudio por ~5 minutos. Exemplos de filter multi-campo: {tenantId: X, status: Y}, {userId: A, createdAt: {$gte: ...}}.
- Volte aqui. A lista Recommendations enche com shape + RU saving projetado + JSON snippet.
- Clique Copy JSON em qualquer recomendação, cole na indexingPolicy da sua collection Cosmos via collMod.
Point-in-Time Restore

Wizard de disaster-recovery. Escolhe um ponto na janela continuous-backup do Cosmos (7 ou 30 dias dependendo da política configurada), gera o comando CLI az cosmosdb restore, opcionalmente o executa via host shell.
Passos do teste
- Preencha Account (o nome da conta Cosmos).
- Defina o Restore timestamp via slider ou input ISO-8601. Default: agora menos 1 hora.
- Preencha Target account name (deve ser novo — não pode sobrescrever o source) e Region.
- Clique em Validate plan. NoSqlStudio roda az cosmosdb show-backup-information para confirmar que um backup existe naquele timestamp. Retorna check verde ou erro vermelho.
- Clique em Run via host shell (az-cli) quando estiver pronto. Restore demora 30-90 minutos para collections típicas.
Migration Wizard Atlas ↔ Cosmos

Assistente de migração bidirecional. Escolhe source + target (Atlas → Cosmos ou Cosmos → Atlas), mostra translation matrix (features que se tornam unsupported), projeta bill mensal no destino, gera o script mongosh.
Passos do teste
- Escolha Source e Target: Atlas → Cosmos ou vice-versa.
- Leia o Translation matrix: features que não sobrevivem à mudança (ex.: Atlas Search → Cosmos: funciona via engines multi-DB locais do NoSqlStudio, não nativamente; Cosmos PITR → Atlas: substituído por snapshots de cluster Atlas).
- Verifique Bill projection: custo mensal estimado no target baseado no seu workload atual.
- Clique em Generate script. Saída é um script mongosh com batches insertMany e reporting de progress.
- Para migração real, faça dry-run em uma collection de teste primeiro (Cosmos cobra write RU por inserts durante a migração!).
Cloud Credentials

O painel de controle de quais fontes de dados alimentam cada outro pane. Três tiers: TIER C local (sempre on), TIER B Azure Monitor (FREE), TIER A Log Analytics (PAID).
Passos do teste
- Confirme que o card TIER B mostra badge CONFIGURED se você salvou as credenciais.
- Fields sensíveis (Resource ID, Tenant ID, Client ID, Client Secret, Workspace ID) aparecem mascarados como •••••••XXXX com um botão Edit. Clique em Edit para revelar + alterar, depois Mask para esconder novamente.
- Após Save: banner de source-mode em cada pane de métricas vira AZURE MONITOR em < 100 ms (via evento interno), ou até 15 s (via poll fallback).
- Botão Clear (vermelho) limpa credenciais para esta conexão do disco + remove a bridge — tudo reverte para NO SOURCE / Local samples.
§3 Matriz de troubleshooting
| Sintoma | Causa provável | Fix |
|---|---|---|
| Banner NO SOURCE no RU Budget | Bridge não registrada para esta conexão (reload do renderer após save da credencial). | Abra Cloud Credentials, clique em Save novamente. Lazy-register dispara automaticamente no mount do workspace em operação normal; force via re-save quando necessário. |
| Banner verde AZURE MONITOR mas 0 RU/s | Auth chain falhou silenciosamente (fallback DefaultAzureCredential) OU bug de mapping de métrica. | Abra DevTools (F12). Procure pelos logs [azure-cosmos-adapter]. Se você vir ChainedTokenCredential failed: Client Secret está vazio em Cloud Credentials, preencha. Se você vir metrics.list 401/403: SP não tem a role Monitoring Reader. |
| Toast verde de Save em Cloud Credentials, mas RU Budget continua mostrando NO SOURCE após reload | Pacotes do adapter SDK (@azure/arm-monitor, @azure/monitor-query) faltando em node_modules. | Verifique com node -e "require('@azure/arm-monitor')". Se faltando, rode npm install --no-save @azure/arm-monitor @azure/monitor-query no repo Compass (declarados como optionalDependencies, então npm às vezes pula). |
| Erro Cannot find module 'semver/preload' em build-time | Mismatch Node 24 × semver 6.x em hadron-build / @mongodb-js/devtools-github-repo. | Crie shim: node_modules/semver/preload.js com module.exports = require('./semver.js'). Ou faça downgrade para Node 22.21.1 (a versão contra a qual os workflows do Compass testam). |
| Diagnostic Logs (KQL) mostra NO SOURCE | Workspace ID do Log Analytics não configurado (tier PAID não conectado). | Decida: você precisa de KQL per-shape? Se sim, ative Diagnostic Settings no Cosmos → stream para Log Analytics, cole o GUID do workspace em Cloud Credentials. Se não, aceite que este pane está bloqueado — Throttling RCA e RU Budget ainda funcionam via Azure Monitor. |
| Query Cost / Composite Index vazios | Nenhuma query rodou pelo NoSqlStudio ainda (ou todas as queries foram via mongosh fora do app). | Rode queries reais contra sua collection dentro do NoSqlStudio (Shell ou tab Query). O hook de cost capture vive no DataService do NoSqlStudio — só vê o que passa por ele. |
| Card de Autoscale mostra número sem sentido tipo $41.9K/mo | Bug conhecido no cálculo de autoscale do bill simulator. | Outros 4 cards (manual / serverless / reserved-1y / reserved-3y) estão corretos. Ignore o número de autoscale — fix planejado para o próximo release. |
| Todos os panes têm scroll cortando no meio do conteúdo | LeafyGreen <Tab> não propaga height — era um bug de layout antes de 25 May 2026. | Atualize para o build mais recente do NoSqlStudio — fix está em scrollStyles com maxHeight: calc(100vh - 320px) explícito. |
| Scan de Hot Partitions retorna 16500: TooManyRequests | Aggregation throttled porque o cluster não tem RU headroom agora. | Aumente RU/s temporariamente, rode o scan, escale de volta. OU agende o scan para janela off-peak. |
| Throttling RCA "Suspect queries" vazio apesar de 429 count alto | Tráfego vem dos app servers / outros clients, não do NoSqlStudio. | Ou replay queries known-bad no shell do NoSqlStudio para popular o ring buffer, OU faça upgrade para Log Analytics (PAID) para correlation per-shape completa via KQL. |