Ir para o conteúdo

Limitações Técnicas e Conhecidas

Este documento lista as limitações técnicas da biblioteca fabricgov, incluindo restrições de APIs, performance, e casos de uso não suportados.


📡 Limitações de API

Rate Limiting - Power BI Admin APIs

APIs afetadas: - GET /admin/groups/{groupId}/users (WorkspaceAccessCollector) - GET /admin/reports/{reportId}/users (ReportAccessCollector) - GET /admin/datasets/{datasetId}/users (DatasetAccessCollector) - GET /admin/dataflows/{dataflowId}/users (DataflowAccessCollector) - GET /admin/datasets/{datasetId}/refreshes (RefreshHistoryCollector) - GET /admin/dataflows/{dataflowId}/transactions (RefreshHistoryCollector)

Limite observado: ~200 requests/hora (não documentado oficialmente pela Microsoft)

Comportamento: - Após ~200 requests, a API retorna 429 Too Many Requests - O limite parece ser uma janela deslizante, não fixo de 1 hora - Pausar 30 segundos e tentar novamente não é suficiente - Requer pausa de ~1h30min para resetar completamente

Impacto: - Tenants pequenos (<200 workspaces/reports): sem impacto - Tenants médios (200-1000): requer 2-5 execuções - Tenants grandes (1000+): requer múltiplas sessões ao longo de várias horas

Solução implementada: - Sistema de checkpoint automático — salva progresso a cada 100 itens - Coleta pode ser retomada em múltiplas execuções com fabricgov collect all --resume - Scripts param ao detectar rate limit (fail fast) e informam o progresso atual - O resumo final exibe os checkpoints pendentes com progresso e estimativa de ciclos restantes

Estimativa de tempo: | Quantidade total de itens | Tempo total | Execuções necessárias | |--------------------------|-------------|----------------------| | < 200 | ~10 min | 1 | | 500 | ~1h (com pausas) | 3 | | 1000 | ~3-5h (com pausas) | 5-7 | | 2000+ | ~8-12h (com pausas) | 10-15 |

Exemplo real: tenant com 692 reports + 412 datasets + N dataflows ≈ 1.100 requests → ~6 ciclos de ~1h cada.

Melhorias planejadas para versões futuras:

Opção Descrição Impacto
Auto-retry com sleep Ao bater rate limit, dorme automaticamente e retoma (sem intervenção humana) Alta — resolve o problema por completo
Throttle proativo Delay configurável entre requests para nunca bater o limite Alta — coleta lenta mas contínua
collect all --full Por padrão, collect all coleta apenas o que é rápido; acessos de report/dataset/dataflow são opt-in Média — separa coleta rápida da demorada

Até lá, a estratégia recomendada é rodar fabricgov collect all --resume após cada rate limit (aguardando ~1h entre execuções) e verificar o progresso no resumo final.


Personal Workspaces

Problema: Personal Workspaces (formato: "PersonalWorkspace Nome (email)") não suportam as seguintes APIs Admin: - GET /admin/groups/{groupId}/users - GET /admin/reports/{reportId}/users

Comportamento observado: - Retornam 404 Not Found ao tentar buscar usuários - Em alguns casos, retornam 429 Too Many Requests (consumindo rate limit desnecessariamente)

Solução implementada: - WorkspaceAccessCollector filtra automaticamente Personal Workspaces antes de fazer chamadas - ReportAccessCollector filtra automaticamente reports em Personal Workspaces - Reduz drasticamente quantidade de requests desnecessários

Impacto em tenants corporativos: - Tenants típicos têm 30-60% de Personal Workspaces - Exemplo: 302 workspaces totais → 186 Personal (62%) → apenas 116 precisam ser coletados


Admin Scan API - WorkspaceInventoryCollector

Limite de batching: 100 workspaces por scan request

Tempo de processamento: - Cada scan leva ~5-10 segundos - Tenants grandes (500+ workspaces) requerem múltiplos scans em sequência

Limitação de dados: - O scan retorna snapshot do momento, não é real-time - Dados podem estar levemente desatualizados (segundos/minutos) - Scan não retorna histórico ou métricas temporais

Campos não retornados pelo scan: - Histórico de refresh de datasets - Consumo de capacidade detalhado - Logs de auditoria - Queries executadas


🔒 Limitações de Permissões

Service Principal

Permissões obrigatórias: - Tenant.Read.All (Application permission) - Workspace.ReadWrite.All (Application permission) - Service Principal deve estar no grupo Fabric Administrators

O que Service Principal NÃO pode fazer: - Acessar workspaces/reports sem permissão explícita (mesmo sendo Admin) - Ver conteúdo de datasets (dados, queries) - Executar queries DAX diretamente em datasets (requer contexto de usuário) - Acessar APIs que requerem delegated permissions (user context)

Nota sobre Admin APIs: - Admin APIs permitem listar e inspecionar recursos - Não permitem executar ou modificar conteúdo de datasets/reports


Device Flow

Requisitos: - Usuário autenticando deve ter role de Fabric Administrator no tenant - Suporta MFA automaticamente - Requer interação humana (não automatizável)

Limitações: - Token expira em ~1 hora - Cache de token é local (não persiste entre máquinas) - Não recomendado para CI/CD ou automação


💾 Limitações de Checkpoint

Tamanho de dados

Checkpoint armazena: - Lista de IDs processados - Dados parciais coletados até o momento

Potencial problema em tenants muito grandes: - Checkpoint pode crescer até vários MB - Exemplo: 5000 reports com 10 acessos cada = ~50MB de checkpoint - Carregar/salvar checkpoint pode demorar alguns segundos

Mitigação: - Checkpoint salva apenas IDs e dados parciais, não duplica inventory - Formato JSON compacto


Invalidação de checkpoint

Checkpoint é invalidado se: - Você re-executa collect_inventory.py (gera novos IDs) - Workspaces/reports são deletados entre execuções - Estrutura do inventory_result muda

Sintomas: - Checkpoint detectado mas nenhum item pulado - Coleta processa itens que parecem duplicados

Solução: - Delete manualmente o checkpoint: rm output/checkpoint_*.json - Re-execute a coleta do zero


📊 Limitações de Performance

Inventário (WorkspaceInventoryCollector)

Performance esperada: - ~100 workspaces: 5-10 segundos - ~500 workspaces: 30-60 segundos - ~1000 workspaces: 1-2 minutos

Gargalo principal: tempo de scan da API (não controlável)


Access Collectors

Performance esperada (COM checkpoint): - ~200 itens: 3-5 minutos - ~500 itens: ~1h (com pausas de rate limit) - ~1000 itens: ~3-5h (com pausas)

Performance esperada (SEM checkpoint): - Inviável para >200 itens (terminal preso por horas)


Export (FileExporter)

Performance esperada: - JSON: rápido até 100MB - CSV: pode demorar com datasets grandes (achatamento de objetos)

Limitações de CSV: - Arrays aninhados viram strings JSON (requer parsing manual) - Objetos profundos geram nomes de colunas longos - Excel tem limite de ~1M linhas


🚫 Funcionalidades Não Suportadas

Coleta de métricas de consumo

Não implementado (fora do escopo do projeto): - Consumo de CU por workspace/dataset - Queries executadas e performance de queries

Motivo: - Requer acesso ao dataset do Capacity Metrics App via DAX - Foco do fabricgov é governança (permissões, inventário, refresh) — não monitoramento de performance


Modificação de recursos

fabricgov é READ-ONLY: - Não modifica workspaces, reports, datasets - Não cria, deleta, ou altera permissões - Não executa refreshes ou queries

Motivo: foco em governança e assessment, não automação operacional


Coleta em tempo real

Limitações: - Todos os dados são snapshots pontuais - Não há streaming ou websockets - Não há detecção de mudanças em tempo real

Casos de uso não suportados: - Monitoramento contínuo - Alertas em tempo real - Dashboards ao vivo


Multi-tenancy

Limitação atual: - Coleta um tenant por vez - Não há suporte para agregar dados de múltiplos tenants - Service Principal é específico por tenant

Workaround: - Execute a coleta separadamente para cada tenant - Agregue os resultados manualmente após export


🐛 Problemas Conhecidos

Issue #1: Checkpoint não detectado após timeout longo

Cenário: - Checkpoint salvo - Aguarda >24 horas - Próxima execução não detecta checkpoint

Causa: inventory_result.json pode estar desatualizado

Solução: - Re-execute collect_inventory.py - Delete checkpoints antigos antes de retomar


Issue #2: Caracteres especiais em nomes de workspaces/reports

Cenário: - Workspaces/reports com emojis, caracteres unicode raros - CSV pode não renderizar corretamente no Excel

Solução: - Use formato JSON ao invés de CSV - Ou importe CSV com encoding UTF-8 explícito


Issue #3: Service Principal sem permissões retorna erro genérico

Cenário: - SP não está no grupo Fabric Administrators - Erro retornado: 403 Forbidden com mensagem genérica

Solução: - Valide permissões seguindo docs/authentication.md - Aguarde até 15 minutos após adicionar ao grupo (propagação de permissões)


📝 Limitações Documentadas pela Microsoft

APIs Admin podem mudar sem aviso

Microsoft não garante: - Estabilidade de APIs Admin (podem mudar a qualquer momento) - Backward compatibility em mudanças de schema - Disponibilidade SLA para Admin APIs

Impacto: - fabricgov pode quebrar após atualizações da Microsoft - Sempre teste em ambiente não-produtivo primeiro


Throttling dinâmico

Microsoft pode ajustar limites dinamicamente: - Rate limits podem variar por tenant - Horários de pico podem ter limites mais agressivos - Tenants com histórico de abuso podem ter limites reduzidos

Impacto: - Timing de checkpoint pode variar entre execuções - Pausas de 1h30min podem não ser suficientes em alguns casos


🔮 Limitações Planejadas para Remoção

v0.7.0

Planejado: - Report HTML gerado automaticamente a partir dos dados coletados

v0.8.0

Planejado: - fabricgov analyze — findings automáticos de governança (datasets sem dono, usuários externos, workspaces sem refresh)

v0.9.0

Planejado: - Integração com Azure Key Vault para gerenciamento de credenciais - fabricgov diff — comparação entre snapshots de coletas distintas

v1.0.0

Planejado: - Documentação completa via MkDocs


💡 Workarounds e Soluções

Para tenants muito grandes (2000+ itens)

Opção 1: Coleta agendada - Configure cron job ou Task Scheduler - Execute overnight - Resultados disponíveis pela manhã

Opção 2: Coleta distribuída - Use múltiplos Service Principals (não documentado/suportado oficialmente) - Cada SP coleta subset de workspaces - Agregue resultados manualmente

Opção 3: Sample mode (planejado v0.3) - Coleta apenas amostra estatística - Rápido (~15 min) para qualquer tamanho - Precisão ~95%


📞 Reportar Limitações

Se você encontrou uma limitação não documentada:

  1. Verifique se já está listada neste documento
  2. Abra uma Issue no GitHub
  3. Inclua:
  4. Descrição da limitação
  5. Ambiente (tamanho do tenant, tipo de coleta)
  6. Output/erro completo
  7. Passos para reproduzir

← Voltar ao README