Pular para conteúdo

Análise de Duplicação de Código

Autor: Anderson Henrique da Silva Data de Criação: 2025-10-16 15:45:00 -03:00 Última Atualização: 2025-10-16 16:05:00 -03:00 Objetivo: Documentar código duplicado identificado no projeto para futura consolidação


✅ STATUS DA CONSOLIDAÇÃO

Data de Conclusão: 2025-10-16 16:05:00 -03:00

Fase 1: Rate Limiting Cleanup - ✅ CONCLUÍDA

Resultado: Removidas 979 linhas de código duplicado (587 arquivos + 392 testes)

Commits Realizados: 1. 6726820 - refactor(middleware): remove duplicate rate limiting middleware 2. 24e2562 - refactor(rate-limit): remove unused rate limiting implementations 3. 3333a62 - test: remove obsolete rate limiting test file

Arquivos Removidos: - src/api/middleware/rate_limiting.py (160 linhas) - src/api/middleware/rate_limit_middleware.py (120 linhas) - src/services/rate_limit_service.py (307 linhas) - tests/unit/test_rate_limiting.py (392 linhas)

Arquivos Modificados: - src/api/app.py - Removido middleware duplicado e import

Impacto: - ✅ Sem duplicação de rate limiting em cada requisição - ✅ Performance melhorada (um único middleware) - ✅ Headers de rate limit consistentes - ✅ Arquitetura mais limpa

Fase 2: Agent Pool Refactoring - ✅ CONCLUÍDA

Data de Conclusão: 2025-10-16 17:15:00 -03:00

Resultado: Refatoração arquitetural com renomeação e documentação

Commits Realizados: 1. 3ae0b44 - refactor(agents): rename agent_pool to simple_agent_pool 2. c3b43cd - refactor(infrastructure): rename agent_pool to distributed_agent_pool 3. 30bc40e - feat(agents): add agent pool interface definitions 4. 0d99e47 - docs: add comprehensive agent pool architecture guide 5. 55d5591 - fix(agents): update import in init.py for simple_agent_pool 6. 3d8f6fe - fix(tests): update imports in test_agent_pool.py

Arquivos Renomeados: - src/agents/agent_pool.pysrc/agents/simple_agent_pool.py - src/infrastructure/agent_pool.pysrc/infrastructure/distributed_agent_pool.py

Arquivos Criados: - src/agents/agent_pool_interface.py (179 linhas) - Interface comum - docs/AGENT_POOL_ARCHITECTURE.md (429 linhas) - Documentação completa

Imports Atualizados: - 15 arquivos atualizados para usar simple_agent_pool

Impacto: - ✅ Distinção clara entre simple e distributed pools - ✅ Interface comum para consistência arquitetural - ✅ Documentação abrangente de casos de uso - ✅ Sistema continua funcionando (verified import test) - ✅ Zero quebra de funcionalidade


📋 Sumário Executivo

Durante a auditoria da codebase realizada em 16/10/2025, foram identificados 2 casos principais de duplicação de código que requerem consolidação:

  1. Agent Pool - 2 implementações com propósitos diferentes mas sobrepostos
  2. Rate Limiting - 5 arquivos com funcionalidades parcialmente duplicadas

Impacto Atual: Baixo Prioridade de Consolidação: Média Esforço Estimado: 2-3 dias de desenvolvimento


1. Agent Pool Duplication

1.1. Arquivos Identificados

Arquivo Linhas Propósito Status
src/agents/agent_pool.py 376 Simple agent pooling ✅ Em uso
src/infrastructure/agent_pool.py 787 Enterprise pool manager ✅ Em uso

1.2. Análise Detalhada

src/agents/agent_pool.py

Tipo: Simple Agent Pool Complexidade: Baixa-Média Características: - Pool básico para reutilização de instâncias de agentes - Lifecycle management (acquire/release) - Cleanup automático de agentes ociosos - Lazy loading support - Memory integration - Estatísticas simples (created, reused, evicted, errors)

Classes Principais:

class AgentPoolEntry:
    """Entry in the agent pool."""
    - agent: BaseAgent
    - in_use: bool
    - last_used: datetime
    - usage_count: int
    - created_at: datetime

class AgentPool:
    """Pool manager for AI agents."""
    - min_size: int = 2
    - max_size: int = 10
    - idle_timeout: int = 300
    - max_agent_lifetime: int = 3600
    - use_lazy_loading: bool = True

Métodos Principais: - async def acquire(agent_type, context) - Context manager para adquirir agente - async def _create_agent(agent_type) - Cria e inicializa novo agente - async def _cleanup_idle_agents() - Remove agentes ociosos - async def prewarm(agent_types) - Pré-aquece pool com agentes

src/infrastructure/agent_pool.py

Tipo: Enterprise Agent Pool Manager Complexidade: Alta Características: - Sistema distribuído para escalabilidade horizontal - Task queue com priorização (LOW, NORMAL, HIGH, CRITICAL) - Múltiplos modos de execução (ASYNC, THREAD, PROCESS, DISTRIBUTED) - Thread pool executor (4 workers padrão) - Process pool executor (2 workers padrão) - Auto-scaling baseado em utilização (threshold 80% up, 20% down) - Health checks automáticos - Métricas avançadas (queue time, execution time, success rate) - Retry logic com exponential backoff - Worker loop para processamento paralelo

Classes Principais:

class AgentTask:
    """Tarefa para execução por agente"""
    - id, agent_type, method, args, kwargs
    - priority: TaskPriority
    - timeout: float
    - retry_count / max_retries
    - execution_mode: ExecutionMode

class AgentInstance:
    """Instância de agente no pool"""
    - status: AgentStatus (IDLE, BUSY, ERROR, etc)
    - total_tasks, successful_tasks, failed_tasks
    - average_task_time
    - process_id, thread_id

class AgentPoolManager:
    """Gerenciador avançado de pool de agentes"""
    - Priority queue para tarefas
    - Thread/Process pool executors
    - Auto-scaling
    - Health monitoring
    - Métricas em tempo real

Métodos Principais: - async def submit_task() - Submete tarefa para execução assíncrona - async def get_task_result() - Aguarda resultado de tarefa - async def _execute_task() - Executa tarefa com retry logic - async def _scale_up_pool() / _scale_down_pool() - Auto-scaling - async def _health_check_loop() - Monitoramento contínuo

1.3. Sobreposição de Funcionalidades

Funcionalidade Simple Pool Enterprise Pool Consolidável?
Agent reuse ✅ Sim
Lifecycle management ✅ Sim
Auto cleanup ✅ Sim
Statistics ✅ Básico ✅ Avançado ⚠️ Parcial
Task queue ❌ Não
Priority system ❌ Não
Thread/Process execution ❌ Não
Auto-scaling ❌ Não
Health checks ❌ Não

1.4. Recomendações

Estratégia: Manter ambas as implementações com refatoração parcial

Justificativa: - As implementações servem propósitos fundamentalmente diferentes - Simple pool: Reutilização simples de instâncias - Enterprise pool: Sistema completo de execução distribuída - Não são duplicações verdadeiras, mas sim soluções para diferentes escalas de problema

Ações Recomendadas:

  1. Renomear para maior clareza (Prioridade: Alta)

    src/agents/agent_pool.py → src/agents/simple_agent_pool.py
    src/infrastructure/agent_pool.py → src/infrastructure/distributed_agent_pool.py
    

  2. Documentar casos de uso (Prioridade: Alta)

  3. Simple pool: Para APIs síncronas simples, desenvolvimento local
  4. Enterprise pool: Para produção com alta carga, execução distribuída

  5. Extrair interface comum (Prioridade: Média)

    class AgentPoolInterface(ABC):
        @abstractmethod
        async def acquire_agent(self, agent_type): pass
    
        @abstractmethod
        async def release_agent(self, agent): pass
    
        @abstractmethod
        def get_stats(self): pass
    

  6. Consolidar código comum (Prioridade: Baixa)

  7. Extrair lógica de lifecycle para módulo compartilhado
  8. Unificar formato de estatísticas
  9. Compartilhar constantes (timeouts, thresholds)

Estimativa de Esforço: 4-6 horas


2. Rate Limiting Duplication

2.1. Arquivos Identificados

Arquivo Linhas Propósito Status
src/infrastructure/rate_limiter.py 435 Advanced multi-strategy limiter ✅ Em uso
src/api/middleware/rate_limit.py 239 Middleware using infrastructure ✅ Em uso
src/api/middleware/rate_limiting.py 160 Simple sliding window ⚠️ Legado?
src/api/middleware/rate_limit_middleware.py 120 ? ⚠️ Desconhecido
src/services/rate_limit_service.py 307 Service layer ⚠️ Desconhecido

Total: 1,261 linhas de código relacionado a rate limiting

2.2. Análise Detalhada

src/infrastructure/rate_limiter.py (435 linhas)

Tipo: Advanced Rate Limiting Core Complexidade: Alta Características: - 4 estratégias de rate limiting: - FIXED_WINDOW - SLIDING_WINDOW (Redis sorted sets) - TOKEN_BUCKET (with Lua script) - LEAKY_BUCKET - 5 tiers de rate limit: - FREE: 1/s, 10/min, 100/h, 1K/day - BASIC: 5/s, 30/min, 500/h, 5K/day - PRO: 10/s, 60/min, 2K/h, 20K/day - ENTERPRISE: 50/s, 300/min, 10K/h, 100K/day - UNLIMITED: 9999/s, 99999/min, etc - Endpoint-specific limits com patterns (wildcards) - Redis + local fallback - Burst support - Cost tracking

Classes:

class RateLimitStrategy(Enum)
class RateLimitTier(Enum)
class RateLimitConfig
class RateLimiter:
    async def check_rate_limit(key, endpoint, tier, custom_limits)
    async def _check_fixed_window()
    async def _check_sliding_window()
    async def _check_token_bucket()
    async def _check_leaky_bucket()

src/api/middleware/rate_limit.py (239 linhas)

Tipo: FastAPI Middleware Wrapper Complexidade: Média Características: - Wrapper em torno de rate_limiter de infrastructure - Extrai identificadores (API Key > User ID > IP) - Integração com APIKey model - Skip paths (/health, /metrics, /docs, etc) - Response headers com rate limit info - High usage warnings (quando <10% remaining) - Fallback gracioso em caso de erro

Integração:

from src.infrastructure.rate_limiter import (
    RateLimitStrategy,
    RateLimitTier,
    rate_limiter,  # singleton instance
)

NÃO é duplicação - é o uso correto do rate limiter!

src/api/middleware/rate_limiting.py (160 linhas)

Tipo: Simple Sliding Window (Self-contained) Complexidade: Baixa Características: - Implementação standalone de sliding window - Apenas in-memory (dict + lists) - Apenas 3 time windows: minute, hour, day - Apenas identificação por IP - NÃO usa src/infrastructure/rate_limiter.py

Potencial Problema: Duplicação de lógica!

class RateLimitMiddleware(BaseHTTPMiddleware):
    def __init__(self, app, calls=60, period=60,
                 per_minute=60, per_hour=1000, per_day=10000):
        # Self-contained implementation
        self.clients: dict[str, dict[str, list]] = defaultdict(...)

Status: ⚠️ LEGADO - CANDIDATO PARA REMOÇÃO

2.3. Sobreposição de Funcionalidades

Funcionalidade infrastructure/rate_limiter middleware/rate_limit middleware/rate_limiting
Sliding window ✅ (Redis + local) ✅ (via infrastructure) ✅ (in-memory)
Multiple tiers ✅ 5 tiers ✅ (via infrastructure)
API Key support
IP-based
Endpoint patterns
Redis support
Token bucket
Custom limits

2.4. Recomendações

Estratégia: Consolidar eliminando código legado

Ações Recomendadas:

  1. Investigar uso dos arquivos legados (Prioridade: CRÍTICA)

    # Verificar se rate_limiting.py ainda está em uso
    grep -r "from src.api.middleware.rate_limiting" src/
    grep -r "import rate_limiting" src/
    
    # Verificar rate_limit_middleware.py
    grep -r "rate_limit_middleware" src/
    
    # Verificar rate_limit_service.py
    grep -r "rate_limit_service" src/
    

  2. Se NÃO estão em uso - REMOVER (Prioridade: Alta)

    # Candidatos para remoção:
    git rm src/api/middleware/rate_limiting.py
    git rm src/api/middleware/rate_limit_middleware.py  # se não usado
    git rm src/services/rate_limit_service.py  # se não usado
    

  3. Se ESTÃO em uso - MIGRAR (Prioridade: Alta)

  4. Migrar código usando rate_limiting.py para usar rate_limit.py
  5. Atualizar imports
  6. Remover arquivo antigo

  7. Documentar arquitetura final (Prioridade: Média)

    ARQUITETURA FINAL DE RATE LIMITING:
    
    src/infrastructure/rate_limiter.py
    └─ Core logic (4 strategies, 5 tiers, Redis + local)
    
    src/api/middleware/rate_limit.py
    └─ FastAPI middleware wrapper
       └─ Uses rate_limiter singleton
    
    Usage in app:
    app.add_middleware(RateLimitMiddleware,
                       default_tier=RateLimitTier.FREE,
                       strategy=RateLimitStrategy.SLIDING_WINDOW)
    

Estimativa de Esforço: 2-4 horas


3. Outros Possíveis Duplicações (A Investigar)

3.1. API Clients

Verificar se há duplicação em clientes de APIs externas: - Portal da Transparência - IBGE, DataSUS, INEP - Outros serviços governamentais

3.2. Cache Implementations

Verificar implementações de cache: - In-memory cache - Redis cache - Agent-specific caches

3.3. Logging/Monitoring

Verificar se há código duplicado em: - Structured logging - Metrics collection - Error tracking


4. Plano de Consolidação

Fase 1: Investigação (1 dia)

  • Executar grep/rg para encontrar todos os usos dos arquivos identificados
  • Criar mapa de dependências
  • Identificar código "morto" (não usado)
  • Documentar imports e usages

Fase 2: Rate Limiting Cleanup (1 dia)

  • Remover rate_limiting.py se não usado
  • Investigar rate_limit_middleware.py e rate_limit_service.py
  • Migrar código se necessário
  • Atualizar imports em todos os arquivos
  • Executar todos os testes
  • Atualizar documentação

Fase 3: Agent Pool Refactoring (1-2 dias)

  • Renomear arquivos para maior clareza
  • Extrair interface comum AgentPoolInterface
  • Criar módulo compartilhado para código comum
  • Documentar casos de uso de cada pool
  • Atualizar imports
  • Executar todos os testes

Fase 4: Documentação (0.5 dia)

  • Atualizar architecture docs
  • Criar decision records (ADRs)
  • Atualizar CLAUDE.md e README.md
  • Code review e aprovação

5. Riscos e Mitigações

Riscos Identificados

  1. Quebrar código em produção
  2. Mitigação: Testes extensivos antes de merge
  3. Mitigação: Feature flags para rollback rápido

  4. Performance degradation

  5. Mitigação: Benchmarks antes/depois
  6. Mitigação: Load testing

  7. Complexidade aumentada

  8. Mitigação: Manter simplicidade
  9. Mitigação: Documentação clara

6. Métricas de Sucesso

Antes da Consolidação

  • 5 arquivos de rate limiting (1,261 linhas)
  • 2 arquivos de agent pool (1,163 linhas)
  • Total: 2,424 linhas de código potencialmente duplicado

Metas Após Consolidação

  • 2-3 arquivos de rate limiting (<800 linhas)
  • 2 arquivos de agent pool com interface comum (<1,200 linhas)
  • Redução: 20-30% de código
  • Cobertura de testes: Manter 80%+
  • Performance: Sem degradação

7. Decisões Arquiteturais

ADR-001: Manter Dois Agent Pools

Context: Encontrados dois pools de agentes com funcionalidades sobrepostas

Decision: Manter ambas as implementações com refatoração parcial

Rationale: - Servem escalas diferentes de problema - Simple pool: Desenvolvimento local, APIs simples - Enterprise pool: Produção distribuída, alta carga - Consolidação total criaria complexidade desnecessária

Consequences: - Positive: Flexibility, separation of concerns - Negative: Maintenance overhead de 2 implementações - Mitigation: Interface comum, código compartilhado

ADR-002: Consolidar Rate Limiting

Context: 5 arquivos com lógica de rate limiting sobreposta

Decision: Manter apenas 2 arquivos (core + middleware)

Rationale: - rate_limiting.py é versão simplificada legada - rate_limiter.py + rate_limit.py são arquitetura correta - Outros arquivos não identificados em uso

Consequences: - Positive: Codebase mais limpo, manutenção mais fácil - Negative: Possível quebra se código legado ainda usado - Mitigation: Investigação detalhada antes de remover


8. Conclusão

A análise identificou duplicação controlável no projeto:

Agent Pools: Não é duplicação verdadeira - manter ambos ⚠️ Rate Limiting: Duplicação real - consolidar removendo código legado

Próximos Passos: 1. Executar Fase 1 (Investigação) para confirmar usos 2. Consolidar rate limiting (Quick win) 3. Refatorar agent pools (Médio prazo)

Impacto no Projeto: - Melhoria de ~500-700 linhas de código - Manutenibilidade aumentada - Arquitetura mais clara - Sem impacto em funcionalidade


Documento vivo: Este documento deve ser atualizado conforme o trabalho de consolidação progride.