Manual del DBA — Cosmos Optimizer paso a paso
Walkthrough de cada pane del Cosmos Optimizer con un cluster de producción real. Para cada pantalla: qué muestra, cómo probarla, qué esperar, y cómo hacer troubleshooting cuando algo está fuera.
§0 Prerrequisitos
Antes de abrir el Optimizer, termine la guía de setup. Sin credenciales, cada pane de métricas muestra NO SOURCE y cae a Local samples (solo lo que el propio NoSqlStudio querió).
- Siga el setup de monitoreo del Cosmos end-to-end: Service Principal, role assignment RBAC, Resource ID, Cloud Credentials. Setup de monitoreo Cosmos.
- Verifique con az login --service-principal y az monitor metrics list que el SP puede leer métricas de su cuenta Cosmos.
- Abra NoSqlStudio → conéctese a la cuenta Cosmos → abra Tools → Cosmos DB → Cosmos Optimizer (o Ctrl+Alt+Shift+O).
§1 Smoke test de 5 minutos — confirma que todo está conectado
Objetivo: en 5 minutos, confirmar que Azure Monitor está alimentando datos reales a NoSqlStudio. Si algún paso falla, salte a §3 Troubleshooting. §3 Troubleshooting.
- Conéctese a su cuenta Cosmos en NoSqlStudio. Confirme que ve el árbol de databases en la sidebar.
- Abra el Cosmos Optimizer. El banner de intro debe mostrar el botón CONFIGURE DATA SOURCES si las credenciales están faltando, o el contenido del pane directamente si están guardadas.
- Vaya a RU Budget. El banner de source-mode debe mostrar AZURE MONITOR — aggregate only en verde dentro de 2 segundos. Haga clic en Refresh. En 1-2 minutos debe ver Consumed (avg) diferente de cero.
- Haga clic en cada tab (Query Cost, Hot Partitions, Index Policy, Throughput Optimizer, Throttling RCA, Diagnostic Logs, Composite Index, PITR Restore, Migration Wizard). Ninguno debe mostrar error rojo.
- Abra el console DevTools (F12) — NO debe contener ChainedTokenCredential authentication failed o monitor client is null.
§2 Walkthroughs por pane
Una sección por pane. Cada una tiene: screenshot (cuando disponible), qué muestra, prueba paso a paso, resultado esperado en un cluster de producción ocupado, y notas de troubleshooting para problemas comunes.
RU Budget

Vista en vivo de RU/s consumido por su cuenta Cosmos vs el budget que definió. Forecast Holt-Winters de 24h. Card de Recommendation comparando manual / autoscale / serverless / reserved.
Pasos de la prueba
- Defina RU/s budget al throughput provisionado de su cuenta (ej.: 5000 para un provisioning de 5k RU/s a nivel de database).
- Haga clic en Refresh.
- Observe Consumed (avg): debe ser diferente de cero en un cluster activo. Compare contra el valor que ve en el Azure Portal en Metrics → NormalizedRUConsumption.
- Verifique el color del badge Utilisation: verde = bajo 65%, amarillo = 65-85%, rojo = arriba 85%. Rojo significa consideración urgente de scale-up.
- Lea el card de Recommendation. Salidas comunes: RESERVED-3Y para workloads steady, AUTOSCALE para los spiky, SERVERLESS para bursts de bajo volumen.
- Desplácese a Per collection (preview). Con solo Azure Monitor, ve una única fila de instancia agregando todo — per namespace requiere Log Analytics (PAID tier).
Query Cost Inspector

Captura el response header x-ms-request-charge de cada query que corre por NoSqlStudio. Cero llamadas a la Azure API — instrumentación puramente client-side, siempre disponible.
Pasos de la prueba
- Abra una tab Shell o Query contra la collection Cosmos.
- Corra una query pesada, ej.: db.Deals.find({ status: 'closed' }).limit(100) o db.Deals.aggregate([{$match:{}}, {$group:{_id:'$status', n:{$sum:1}}}]).
- Vuelva al tab Query Cost. Top query shapes debe poblar con el shape, RU total, RU promedio, p95, max, y count.
- Corra el mismo shape 5+ veces para poblar el count y p95 correctamente.
- Use el input de filter en el top-right para restringir a ns o substring de shape.
Hot Partition Detector

Probe activo que agrupa documentos por su partition key y ranquea las partitions resultantes por doc count. Detecta skew (una partition teniendo 40%+ de los docs) antes que se vuelva tormenta de throttle 429.
Pasos de la prueba
- Complete Namespace: formato db.coll, ej.: catalog.products.
- Complete Partition key path: el nombre del campo que usó como shardKey al crear la collection, ej.: tenantId.
- Haga clic en Scan. Esto corre una aggregation $group en Cosmos — cuesta RU proporcional al tamaño de la collection. En una collection de 200 GB espere 100-500 RU.
- Lea el badge spread en el top-right: verde = distribución uniforme, amarillo = moderate skew, rojo = severe skew (top partition > 40% de los docs).
- Use el heatmap para detectar partitions hot específicas. Hover en cualquier celda para el key value exacto + doc count.
Visual Index Policy Editor

Cosmos indexa todas las propiedades por default — cada write cuesta 1 RU por propiedad indexada. Excluir paths nunca queryados puede cortar consumo de write RU en 30-70% en collections document-heavy.
Pasos de la prueba
- Complete Namespace, ej.: catalog.products.
- Haga clic en Sample schema. NoSqlStudio lee 100 docs y construye un árbol de todos los field paths.
- Desmarque cualquier field que NUNCA aparece en una cláusula WHERE / filter — piense en imageBase64, fullText, metadata.audit.*, etc.
- Haga clic en Save draft. JSON preview actualiza con la indexingPolicy propuesta.
- Copie el JSON, aplique vía shell: db.runCommand({collMod: 'products', indexingPolicy: <paste>}).
Throughput Optimizer + Bill Simulator

Clasifica su workload (STEADY / SPIKY / CYCLIC / RAMP) de los últimos 15 min de métricas, luego simula bill mensual en los 5 modes de facturación Cosmos lado-a-lado. Quote de Reserved Capacity en la base.
Pasos de la prueba
- Haga clic en Refresh en el top-right.
- Lea el card Workload classification. Salidas comunes: STEADY (low variance, CV < 0.4), SPIKY (CV > 0.8, recomienda autoscale), CYCLIC (peaks diarios predecibles, recomienda reserved con scheduled scale).
- Compare los 5 cards Monthly bill. El más barato con badge RECOMMENDED es la elección del algoritmo.
- Busque el banner rojo THROTTLED en el card manual: indica que su p95 actual excede el tier simulado y causaría 429s.
- Desplácese a Reserved capacity quote: número concreto de RU/s para comprometerse + ahorro mensual vs manual.
Throttling RCA

Cuenta respuestas 429 (rate-limited) en la ventana reciente vía Azure Monitor, luego correlaciona cada burst con queries capturadas en el ring buffer del Query Cost. Surface la query shape con mayor RU cumulativo durante la ventana de 429 — el probable culpable.
Pasos de la prueba
- Haga clic en Refresh. Lea Total 429s, 429 events, y Peak / interval.
- Defina el input Window ± minutos (default 5). Bájelo para correlation más apretada, súbalo si ninguna query cayó en la ventana.
- Desplácese a Suspect queries. Cada fila = un burst de 429 con la query shape más cara que corrió ± window minutos del burst, con un confidence score (0-1).
- Si vacío: abra el tab Query Cost Inspector y corra tráfico. Sin captures de query, el RCA no tiene nada para correlacionar.
Diagnostic Logs (KQL templates)

10 queries Kusto listas contra los Cosmos Diagnostic Logs en su workspace Log Analytics. Requiere el tier PAID (Diagnostic Settings activado, workspace ID del Log Analytics configurado).
Pasos de la prueba
- Verifique si el banner AZURE MONITOR muestra upgrade available: Log Analytics. Si no enchufó el workspace ID, este pane muestra NO SOURCE y el botón Run in app queda disabled.
- Haga clic en cualquier card de template (ej.: Slow queries — last 1 hour) para cargar su KQL en el editor.
- Haga clic en Edit para ajustar el KQL inline (ej.: cambie ago(1h) a ago(24h)).
- Haga clic en Run in app. Tabla de resultados renderiza abajo en 2-5 segundos.
- Para análisis long-form, haga clic en Open in portal para deep-link de la query en el editor KQL del Azure Portal.
Composite Index Recommender

Observa el ring buffer del Query Cost, identifica query shapes que tocan 2+ campos sin un composite index correspondiente, proyecta ~60% de ahorro de RU, emite el JSON snippet para pegar en la indexingPolicy del Cosmos.
Pasos de la prueba
- Defina Min queries to consider = 5 (default). Threshold para considerar una shape valer la recomendación.
- Corra queries representativas por NoSqlStudio por ~5 minutos. Ejemplos de filter multi-campo: {tenantId: X, status: Y}, {userId: A, createdAt: {$gte: ...}}.
- Vuelva aquí. La lista Recommendations se llena con shape + RU saving proyectado + JSON snippet.
- Haga clic en Copy JSON en cualquier recomendación, pegue en la indexingPolicy de su collection Cosmos vía collMod.
Point-in-Time Restore

Wizard de disaster-recovery. Elige un punto en la ventana continuous-backup del Cosmos (7 o 30 días dependiendo de la política configurada), genera el comando CLI az cosmosdb restore, opcionalmente lo ejecuta vía host shell.
Pasos de la prueba
- Complete Account (el nombre de la cuenta Cosmos).
- Defina el Restore timestamp vía slider o input ISO-8601. Default: ahora menos 1 hora.
- Complete Target account name (debe ser nuevo — no puede sobrescribir el source) y Region.
- Haga clic en Validate plan. NoSqlStudio corre az cosmosdb show-backup-information para confirmar que un backup existe en ese timestamp. Retorna check verde o error rojo.
- Haga clic en Run via host shell (az-cli) cuando esté listo. Restore tarda 30-90 minutos para collections típicas.
Migration Wizard Atlas ↔ Cosmos

Asistente de migración bidireccional. Elige source + target (Atlas → Cosmos o Cosmos → Atlas), muestra translation matrix (features que se vuelven unsupported), proyecta bill mensual en el destino, genera el script mongosh.
Pasos de la prueba
- Elija Source y Target: Atlas → Cosmos o viceversa.
- Lea el Translation matrix: features que no sobreviven al cambio (ej.: Atlas Search → Cosmos: funciona vía engines multi-DB locales del NoSqlStudio, no nativamente; Cosmos PITR → Atlas: reemplazado por snapshots de cluster Atlas).
- Verifique Bill projection: costo mensual estimado en el target basado en su workload actual.
- Haga clic en Generate script. Salida es un script mongosh con batches insertMany y reporting de progress.
- Para migración real, haga dry-run en una collection de prueba primero (¡Cosmos cobra write RU por inserts durante la migración!).
Cloud Credentials

El panel de control de qué fuentes de datos alimentan cada otro pane. Tres tiers: TIER C local (siempre on), TIER B Azure Monitor (FREE), TIER A Log Analytics (PAID).
Pasos de la prueba
- Confirme que el card TIER B muestra badge CONFIGURED si guardó las credenciales.
- Fields sensibles (Resource ID, Tenant ID, Client ID, Client Secret, Workspace ID) aparecen enmascarados como •••••••XXXX con un botón Edit. Haga clic en Edit para revelar + cambiar, luego Mask para esconder de nuevo.
- Después de Save: banner de source-mode en cada pane de métricas vira AZURE MONITOR en < 100 ms (vía evento interno), o hasta 15 s (vía poll fallback).
- Botón Clear (rojo) limpia credenciales para esta conexión del disco + remueve la bridge — todo revierte a NO SOURCE / Local samples.
§3 Matriz de troubleshooting
| Síntoma | Causa probable | Fix |
|---|---|---|
| Banner NO SOURCE en RU Budget | Bridge no registrada para esta conexión (reload del renderer después del save de la credencial). | Abra Cloud Credentials, haga clic en Save de nuevo. Lazy-register dispara automáticamente en el mount del workspace en operación normal; force vía re-save cuando necesario. |
| Banner verde AZURE MONITOR pero 0 RU/s | Auth chain falló silenciosamente (fallback DefaultAzureCredential) O bug de mapping de métrica. | Abra DevTools (F12). Busque los logs [azure-cosmos-adapter]. Si ve ChainedTokenCredential failed: Client Secret está vacío en Cloud Credentials, complete. Si ve metrics.list 401/403: SP no tiene el role Monitoring Reader. |
| Toast verde de Save en Cloud Credentials, pero RU Budget continúa mostrando NO SOURCE después del reload | Paquetes del adapter SDK (@azure/arm-monitor, @azure/monitor-query) faltando en node_modules. | Verifique con node -e "require('@azure/arm-monitor')". Si faltan, corra npm install --no-save @azure/arm-monitor @azure/monitor-query en el repo Compass (declarados como optionalDependencies, así que npm a veces los salta). |
| Error Cannot find module 'semver/preload' en build-time | Mismatch Node 24 × semver 6.x en hadron-build / @mongodb-js/devtools-github-repo. | Cree shim: node_modules/semver/preload.js con module.exports = require('./semver.js'). O haga downgrade a Node 22.21.1 (la versión contra la cual los workflows del Compass testean). |
| Diagnostic Logs (KQL) muestra NO SOURCE | Workspace ID del Log Analytics no configurado (tier PAID no conectado). | Decida: ¿necesita KQL per-shape? Si sí, active Diagnostic Settings en el Cosmos → stream a Log Analytics, pegue el GUID del workspace en Cloud Credentials. Si no, acepte que este pane está bloqueado — Throttling RCA y RU Budget aún funcionan vía Azure Monitor. |
| Query Cost / Composite Index vacíos | Ninguna query corrió por NoSqlStudio aún (o todas las queries fueron vía mongosh fuera del app). | Corra queries reales contra su collection dentro de NoSqlStudio (Shell o tab Query). El hook de cost capture vive en el DataService de NoSqlStudio — solo ve lo que pasa por él. |
| Card de Autoscale muestra número sin sentido como $41.9K/mo | Bug conocido en el cálculo de autoscale del bill simulator. | Otros 4 cards (manual / serverless / reserved-1y / reserved-3y) están correctos. Ignore el número de autoscale — fix planeado para el próximo release. |
| Todos los panes tienen scroll cortando en medio del contenido | LeafyGreen <Tab> no propaga height — era un bug de layout antes del 25 mayo 2026. | Actualice al último build de NoSqlStudio — fix está en scrollStyles con maxHeight: calc(100vh - 320px) explícito. |
| Scan de Hot Partitions retorna 16500: TooManyRequests | Aggregation throttled porque el cluster no tiene RU headroom ahora. | Aumente RU/s temporalmente, corra el scan, escale de vuelta. O programe el scan para ventana off-peak. |
| Throttling RCA "Suspect queries" vacío a pesar de 429 count alto | Tráfico viene de los app servers / otros clients, no del NoSqlStudio. | O replay queries known-bad en el shell del NoSqlStudio para poblar el ring buffer, O haga upgrade a Log Analytics (PAID) para correlation per-shape completa vía KQL. |