Pular para o conteúdo
← workspace Cosmos

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).

  1. Siga o setup de monitoramento do Cosmos end-to-end: Service Principal, role assignment RBAC, Resource ID, Cloud Credentials. Setup de monitoramento Cosmos.
  2. Verifique com az login --service-principal e az monitor metrics list que o SP consegue ler métricas da sua conta Cosmos.
  3. 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.

  1. Conecte-se à sua conta Cosmos no NoSqlStudio. Confirme que você vê a árvore de databases na sidebar.
  2. 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.
  3. 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.
  4. 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.
  5. Abra o console DevTools (F12) — NÃO deve conter ChainedTokenCredential authentication failed ou monitor client is null.
Esperado
Todos os dez panes carregam, RU Budget mostra RU/s reais em 2 minutos, sem auth errors no console. Se sim, você está production-ready.

§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.

§2.1

RU Budget

FREE TIER
Pane RU Budget: consumo ao vivo, utilização, projeção 24h, tabela per-collection
Pane RU Budget: consumo ao vivo, utilização, projeção 24h, tabela per-collection

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

  1. 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).
  2. Clique em Refresh.
  3. 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.
  4. 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.
  5. Leia o card de Recommendation. Saídas comuns: RESERVED-3Y para workloads steady, AUTOSCALE para os spiky, SERVERLESS para bursts de baixo volume.
  6. 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).
Esperado
Em um cluster ocupado: 495 RU/s consumido avg, 9.9% utilisation do budget de 5000, badge WITHIN BUDGET em verde. Recommendation: RESERVED-3Y com economia projetada de $32.9K/mo.
Troubleshoot
0 RU/s com banner AZURE MONITOR verde = cluster genuinamente ocioso na janela de 15 min OU mapping do adapter retorna métrica errada. Confirme com az monitor metrics list --metric TotalRequestUnits — se CLI mostra non-zero, abra bug no NoSqlStudio. Banner NO SOURCE = credenciais não registradas. Reload (Ctrl+R) o app, reabra Cloud Credentials, clique Save novamente.
§2.2

Query Cost Inspector

ALWAYS-ON
Pane Query Cost: ring buffer de RU costs per-query capturados do x-ms-request-charge
Pane Query Cost: ring buffer de RU costs per-query capturados do x-ms-request-charge

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

  1. Abra uma tab Shell ou Query contra a collection Cosmos.
  2. Rode uma query pesada, ex.: db.Deals.find({ status: 'closed' }).limit(100) ou db.Deals.aggregate([{$match:{}}, {$group:{_id:'$status', n:{$sum:1}}}]).
  3. Volte ao tab Query Cost. Top query shapes deve popular com o shape, RU total, RU médio, p95, max, e count.
  4. Rode o mesmo shape 5+ vezes para popular o count e p95 corretamente.
  5. Use o input de filter no topo-direito para restringir a ns ou substring de shape.
Esperado
Cada nova query aparece imediatamente (sem delay do Azure). O ring buffer fica capado em 500 entries (mais antiga é descartada) e sobrevive até o restart do app — não persiste em disco.
Troubleshoot
Queries rodam mas não aparecem: confirme que você está rodando a query pelo NoSqlStudio (não pelo mongosh em outra janela ou pelo código do app). O hook de captura só fica no DataService do NoSqlStudio.
§2.3

Hot Partition Detector

ALWAYS-ON
Pane Hot Partitions: heatmap de doc count por partition key + detecção de skew
Pane Hot Partitions: heatmap de doc count por partition key + detecção de skew

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

  1. Preencha Namespace: formato db.coll, ex.: catalog.products.
  2. Preencha Partition key path: o nome do campo que você usou como shardKey ao criar a collection, ex.: tenantId.
  3. 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.
  4. Leia o badge spread no top-right: verde = distribuição uniforme, amarelo = moderate skew, vermelho = severe skew (top partition > 40% dos docs).
  5. Use o heatmap para spotar partitions hot específicas. Hover em qualquer célula para o key value exato + doc count.
Esperado
Para uma collection tenant-sharded com centenas de tenants: spread verde (nenhum tenant domina). Para uma collection org-sharded onde um cliente grande é 60% dos dados: badge vermelho, uma célula vermelho-escuro no heatmap.
Troubleshoot
No DataService bound = conexão perdida ou plugin não carregado para esta conexão. Reconecte. Scan dá erro 16500: TooManyRequests = sua collection não tem RU suficiente para rodar a aggregation agora. Aumente RU temporariamente ou faça scan em baixa de tráfego.
§2.4

Visual Index Policy Editor

ALWAYS-ON
Editor Index Policy: árvore de schema com checkboxes include/exclude + preview JSON
Editor Index Policy: árvore de schema com checkboxes include/exclude + preview JSON

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

  1. Preencha Namespace, ex.: catalog.products.
  2. Clique em Sample schema. NoSqlStudio lê 100 docs e constrói uma árvore de todos os field paths.
  3. Desmarque qualquer field que NUNCA aparece em uma cláusula WHERE / filter — pense em imageBase64, fullText, metadata.audit.*, etc.
  4. Clique em Save draft. JSON preview atualiza com a indexingPolicy proposta.
  5. Copie o JSON, aplique via shell: db.runCommand({collMod: 'products', indexingPolicy: <paste>}).
Esperado
Em uma collection de products de e-commerce típica (50+ campos, só 5 queryados) você pode dropar indexação em ~40 paths. Custo de write cai de ~50 RU/insert para ~10 RU/insert.
Troubleshoot
Sample schema retorna árvore vazia = collection está vazia (sem documentos para inferir schema). Insira um doc representativo primeiro.
§2.5

Throughput Optimizer + Bill Simulator

FREE TIER
Throughput Optimizer: classifier de workload + comparação de bill em 5 modes + quote de Reserved Capacity
Throughput Optimizer: classifier de workload + comparação de bill em 5 modes + quote de Reserved Capacity

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

  1. Clique em Refresh no topo-direito.
  2. 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).
  3. Compare os 5 cards Monthly bill. O mais barato com badge RECOMMENDED é a escolha do algoritmo.
  4. Procure o banner vermelho THROTTLED no card manual: indica que seu p95 atual excede o tier simulado e causaria 429s.
  5. Role até Reserved capacity quote: número concreto de RU/s para se comprometer + economia mensal vs manual.
Esperado
STEADY workload (CV=0.27, p95=962 RU/s) → RESERVED-3Y recomendado a $38.14/mo vs manual $58.68/mo → $134/yr de economia. Para um SaaS de 1000 tenants é margem real.
Troubleshoot
Bug conhecido (May 2026): card de autoscale às vezes mostra total misformatado (ex.: $41.9K/mo) devido a um erro de unidade no simulator. Os outros 4 cards estão corretos. Fix pendente — track no project board.
§2.6

Throttling RCA

FREE TIER
Throttling RCA: contagem de 429, peaks, sparkline + queries suspect correlacionadas
Throttling RCA: contagem de 429, peaks, sparkline + queries suspect correlacionadas

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

  1. Clique em Refresh. Leia Total 429s, 429 events, e Peak / interval.
  2. Defina o input Window ± minutos (default 5). Diminua para correlation mais apertada, aumente se nenhuma query caiu na janela.
  3. 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).
  4. Se vazio: abra o tab Query Cost Inspector e rode tráfego. Sem captures de query, o RCA não tem nada para correlacionar.
Esperado
Um cluster de produção movimentado mostrando 372.9K 429s total em 15 eventos (peak 41.7K) está significativamente throttled. Após rodar queries representativas por ~5 minutos você deve ver Suspect queries populado com confidence > 0.5 para pelo menos uma shape.
Troubleshoot
429 count alto mas Suspect queries vazio = tráfego está indo pelos servidores do app (não pelo NoSqlStudio). Ou rode a query bad-conhecida no Shell para capturá-la, OU faça upgrade para Log Analytics (PAID) para RCA per-shape completo via KQL.
§2.7

Diagnostic Logs (KQL templates)

PAID TIER
Diagnostic Logs: 10 templates KQL prontos contra a tabela MongoRequests
Diagnostic Logs: 10 templates KQL prontos contra a tabela MongoRequests

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

  1. 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.
  2. Clique em qualquer card de template (ex.: Slow queries — last 1 hour) para carregar seu KQL no editor.
  3. Clique em Edit para ajustar o KQL inline (ex.: mude ago(1h) para ago(24h)).
  4. Clique em Run in app. Tabela de resultados renderiza embaixo em 2-5 segundos.
  5. Para análise long-form, clique em Open in portal para deep-link da query no editor KQL do Azure Portal.
Esperado
Template Slow queries retorna 50 linhas dos Mongo requests mais lentos com coluna durationMs. Top entries usualmente correlacionam com as mesmas shapes no Throttling RCA.
Troubleshoot
Resultados vazios apesar de carga conhecida = Diagnostic Settings na conta Cosmos podem não ter categoria de log MongoRequests ativada, OU < 5 min de delay desde ativação. 403 Forbidden = SP precisa de role Log Analytics Reader no workspace.
§2.8

Composite Index Recommender

ALWAYS-ON
Composite Index: detecta shapes de query multi-field sem compound indexes + gerador de snippet JSON
Composite Index: detecta shapes de query multi-field sem compound indexes + gerador de snippet JSON

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

  1. Defina Min queries to consider = 5 (default). Threshold para considerar uma shape valer a recomendação.
  2. Rode queries representativas pelo NoSqlStudio por ~5 minutos. Exemplos de filter multi-campo: {tenantId: X, status: Y}, {userId: A, createdAt: {$gte: ...}}.
  3. Volte aqui. A lista Recommendations enche com shape + RU saving projetado + JSON snippet.
  4. Clique Copy JSON em qualquer recomendação, cole na indexingPolicy da sua collection Cosmos via collMod.
Esperado
Para um app de e-commerce filtrando por {tenantId, status, createdAt} 5+ vezes: 1 recomendação, ~60% redução de RU por query, JSON snippet pronto para colar.
Troubleshoot
Nenhum pattern multi-field capturado ainda = ring buffer do Query Cost está vazio ou apenas shapes single-field foram capturadas. Rode queries mais diversas.
§2.9

Point-in-Time Restore

WIZARD
Wizard PITR Restore: formulário para account / timestamp / target / region + preview CLI
Wizard PITR Restore: formulário para account / timestamp / target / region + preview CLI

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

  1. Preencha Account (o nome da conta Cosmos).
  2. Defina o Restore timestamp via slider ou input ISO-8601. Default: agora menos 1 hora.
  3. Preencha Target account name (deve ser novo — não pode sobrescrever o source) e Region.
  4. 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.
  5. Clique em Run via host shell (az-cli) quando estiver pronto. Restore demora 30-90 minutos para collections típicas.
Esperado
Para um DR drill real: validate plan tem sucesso em 5 segundos, mostra confirmação de tamanho de backup + timestamp. Restore real roda async — monitore no portal.
Troubleshoot
Account does not have continuous backup enabled = você tem modo de backup periódico. PITR requer --backup-policy-type Continuous na criação da conta OU uma migração para modo continuous.
§2.10

Migration Wizard Atlas ↔ Cosmos

WIZARD
Migration Wizard: Atlas ↔ Cosmos bidirecional com translation matrix + gerador de script
Migration Wizard: Atlas ↔ Cosmos bidirecional com translation matrix + gerador de script

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

  1. Escolha Source e Target: Atlas → Cosmos ou vice-versa.
  2. 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).
  3. Verifique Bill projection: custo mensal estimado no target baseado no seu workload atual.
  4. Clique em Generate script. Saída é um script mongosh com batches insertMany e reporting de progress.
  5. Para migração real, faça dry-run em uma collection de teste primeiro (Cosmos cobra write RU por inserts durante a migração!).
Esperado
Translation matrix lista ~5-10 features com status (funciona/dropped/replaced). Bill projection dentro de ±30% do real em workloads simples.
Nota
Para migrações multi-TB, use Azure Data Factory ou a ferramenta nativa de migração do Cosmos — este wizard tem como alvo migrações menores / pontuais e cenários DR.
§2.11

Cloud Credentials

ALWAYS-ON
Cloud Credentials: AWS DocDB + Azure Service Principal + workspace ID Log Analytics
Cloud Credentials: AWS DocDB + Azure Service Principal + workspace ID Log Analytics

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

  1. Confirme que o card TIER B mostra badge CONFIGURED se você salvou as credenciais.
  2. 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.
  3. 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).
  4. Botão Clear (vermelho) limpa credenciais para esta conexão do disco + remove a bridge — tudo reverte para NO SOURCE / Local samples.
Esperado
O painel Cloud Credentials mostra bolinhas verdes ao lado de cada credencial salva, e o Operations Center consegue conversar com Log Analytics + Azure Monitor sem erros.
Nota
Credenciais são armazenadas encriptadas via Electron safeStorage (OS keychain no macOS, DPAPI no Windows, libsecret no Linux). O arquivo fica em %APPDATA%/NoSqlStudio Dev Local/CloudCredentials/&lt;connectionId&gt;.bin.

§3 Matriz de troubleshooting

SintomaCausa provávelFix
Banner NO SOURCE no RU BudgetBridge 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/sAuth 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 reloadPacotes 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-timeMismatch 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 SOURCEWorkspace 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 vaziosNenhuma 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/moBug 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údoLeafyGreen &lt;Tab&gt; 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: TooManyRequestsAggregation 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 altoTrá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.