Skip to content

📋 Checklist de Deployment - Solução "Model is Overloaded"

🔍 PRÉ-DEPLOYMENT (Verificações)

Configuração

  • [x] .env - GOOGLE_GENAI_USE_VERTEXAI=1 configurado
  • [x] .env - GOOGLE_API_KEY removido
  • [x] slack_bot.py - Imports adicionados (genai_errors, asyncio, defaultdict, datetime)
  • [x] slack_bot.py - check_user_rate_limit() implementada
  • [x] slack_bot.py - Try/except para ServerError e ResourceExhausted adicionado
  • [x] slack_bot.py - Semáforo global e locks per-user integrados
  • [x] Syntax validation com Pylance: ✅ SEM ERROS

Testes Locais

  • [x] test_solutions.py - Rate limit per-user: ✅ PASSOU
  • [x] test_solutions.py - Concorrência global: ✅ PASSOU
  • [x] test_solutions.py - Configuração Vertex AI: ✅ PASSOU
  • [x] test_solutions.py - Tratamento de erros: ✅ PASSOU

🚀 DEPLOYMENT NO CLOUD RUN

Opção 1: Deploy Automático via Cloud Build

# 1. Fazer commit das mudanças
cd /Users/glauberportella/Projects/ifriend/ifriend-agents
git add busca_produtos/slack_bot.py busca_produtos/.env
git commit -m "Solução para 'model is overloaded': Vertex AI + rate limiting + error handling"

# 2. Push para Google Cloud (Cloud Build dispara automaticamente)
git push origin main

Opção 2: Deploy Manual via gcloud

# 1. Autenticar
gcloud auth login
gcloud config set project ifriend-platform

# 2. Deploy apenas o serviço (sem rebuild)
gcloud run deploy agente-busca-produtos-slack \
  --source . \
  --region us-central1 \
  --platform managed \
  --memory 512Mi \
  --cpu 1 \
  --timeout 300 \
  --allow-unauthenticated

# 3. Verificar status
gcloud run services describe agente-busca-produtos-slack --region us-central1

Opção 3: Deploy via Container Registry

# 1. Build local
docker build -t gcr.io/ifriend-platform/agente-busca-produtos-slack .

# 2. Push
docker push gcr.io/ifriend-platform/agente-busca-produtos-slack

# 3. Deploy
gcloud run deploy agente-busca-produtos-slack \
  --image gcr.io/ifriend-platform/agente-busca-produtos-slack \
  --region us-central1

✅ PÓS-DEPLOYMENT (Validações)

1. Verificar Service está rodando

# Checklist de health
curl https://agente-busca-produtos-slack-XXX.a.run.app/health

# Resposta esperada:
# {
#   "status": "healthy",
#   "service": "ifriend_busca_produtos_slack",
#   "slack_configured": true
# }

2. Monitorar Logs

# Terminal 1: Tail dos logs em tempo real
gcloud run logs read agente-busca-produtos-slack --follow --region us-central1

# Terminal 2: Verificar erros específicos
gcloud run logs read agente-busca-produtos-slack --region us-central1 | grep "❌"

# Terminal 3: Verificar rate limits locais
gcloud run logs read agente-busca-produtos-slack --region us-central1 | grep "Rate limit atingido"

3. Testar com Slack (Fase 1: 1 Usuário)

Usuário de Teste: seu-usuario-slack Comando: Enviar mensagem simples ao bot

Você: "Oi, tudo bem?"
Bot: Resposta normal + status message updates + sem erros

Verificar: - ✅ Mensagem de status atualiza em tempo real (🤔 → 🔍 → 📋 → etc) - ✅ Resposta final é clara e bem formatada - ✅ Nenhum erro visível no Slack - ✅ Log mostra: "✅ Enviando resposta ao Slack"

4. Testar Rate Limit Local (Fase 2: 1 Usuário)

Teste: Enviar 4 queries rápidas seguidas do mesmo usuário

Você: "Query 1"
Bot: ✅ Resposta OK

Você: "Query 2"
Bot: ✅ Resposta OK

Você: "Query 3"
Bot: ✅ Resposta OK

Você: "Query 4" (enviada antes de 1 minuto)
Bot: ⚠️ "Você atingiu o limite de consultas"

Verificar: - ✅ Queries 1-3 processadas normalmente - ✅ Query 4 rejeitada com mensagem clara - ✅ Log mostra: "⚠️ Rate limit atingido para U123456789" - ✅ Nenhuma query é descartada (sem 503/429 errors)

5. Testar Concorrência (Fase 3: 2+ Usuários)

Teste: 2-3 usuários enviando queries simultâneas

User A: "Query A"  (t=0s)
User B: "Query B"  (t=0.1s)
User C: "Query C"  (t=0.2s)

Esperado: - Queries A e B iniciam simultaneamente - Query C aguarda A ou B terminar - Máximo 2 processadas simultâneas

Verificar: - ✅ Não há erro "model is overloaded" - ✅ Latência reasonable (<10s para cada) - ✅ Logs mostram "async with global_semaphore" para cada query

6. Testar Tratamento de Erros (Fase 4: Simulado)

Se receber erro 429 (Rate Limit):

Usuário vê: "⚠️ Limite de consultas temporariamente atingido"
Log mostra: "❌ Rate limit atingido (429)"
Esperado: Mensagem é enviada, sem crash

Se receber erro 503 (Servidor Sobrecarregado):

Usuário vê: "⚠️ O servidor de IA está temporariamente sobrecarregado"
Log mostra: "❌ Servidor do Gemini sobrecarregado (503)"
Esperado: Mensagem é enviada, sem crash


📊 MÉTRICAS A MONITORAR (24h após deploy)

Cloud Monitoring

# Abrir dashboard
gcloud monitoring dashboards list
gcloud monitoring dashboards create --config-from-file=monitoring-config.json

Métricas Críticas:

  1. API Requests Per Minute (RPM)
  2. Mostrar: cloudrun.googleapis.com/request_count
  3. Esperado: 10-40 RPM (nunca picos acima de 60)
  4. Alerta: > 50 RPM = reduzir MAX_CONCURRENT_QUERIES para 1

  5. Error Rate (429 + 503)

  6. Mostrar: cloudrun.googleapis.com/request_count com label status=429 ou 503
  7. Esperado: < 2%
  8. Alerta: > 5% = verificar logs, considerar mais paralelismo

  9. P95 Latency

  10. Mostrar: cloudrun.googleapis.com/request_latencies percentile_95
  11. Esperado: < 5 segundos
  12. Alerta: > 10s = possível gargalo em ferramentas

  13. Active Requests

  14. Mostrar: cloudrun.googleapis.com/request_count (instantâneo)
  15. Esperado: máx 2 simultâneas
  16. Alerta: > 3 = semáforo não está funcionando

  17. Memory Usage

  18. Mostrar: cloudrun.googleapis.com/memory_allocation_bytes used
  19. Esperado: 200-400 MB (de 512 MB alocado)
  20. Alerta: > 450 MB = possível memory leak

Logs Críticos

# Erros esperados: 0 em 24h
gcloud run logs read agente-busca-productos-slack --region us-central1 | \
  grep "❌ Erro no handle_message" | wc -l

# Rate limits locais esperados: < 10 em 24h (para 10 usuários)
gcloud run logs read agente-busca-productos-slack --region us-central1 | \
  grep "⚠️ Rate limit atingido para" | wc -l

# Erros de API esperados: < 2
gcloud run logs read agente-busca-productos-slack --region us-central1 | \
  grep "❌ Rate limit atingido (429)\|❌ Servidor do Gemini sobrecarregado (503)" | wc -l

🔄 ROLLBACK (Se algo der errado)

# 1. Reverter para versão anterior
gcloud run deploy agente-busca-produtos-slack \
  --image gcr.io/ifriend-platform/agente-busca-produtos-slack:v1-old \
  --region us-central1

# 2. Verificar logs da versão antiga
gcloud run revisions list --service agente-busca-produtos-slack --region us-central1

# 3. Restaurar tráfego para versão estável
gcloud run services update-traffic agente-busca-produtos-slack \
  --to-revisions=REVISION_NAME=100 \
  --region us-central1

📞 TROUBLESHOOTING

Ainda recebendo "model is overloaded" após deploy?

  1. Verificar .env

    grep GOOGLE_GENAI_USE_VERTEXAI busca_produtos/.env
    # Deve retornar: GOOGLE_GENAI_USE_VERTEXAI=1
    

  2. Verificar imports no slack_bot.py

    grep "from google.api_core import exceptions as genai_errors" busca_produtos/slack_bot.py
    # Deve existir
    

  3. Verificar concorrência

    gcloud run logs read agente-busca-productos-slack --region us-central1 | grep "async with global_semaphore"
    # Deve aparecer múltiplas vezes
    

  4. Se RPM ainda alto (> 50)

  5. Reduzir MAX_CONCURRENT_QUERIES de 2 para 1
  6. Reduzir MAX_QUERIES_PER_USER_PER_MINUTE de 3 para 2
  7. Fazer commit e redeploy

Erro: "Service account not found"

# Verificar credenciais
echo $GOOGLE_APPLICATION_CREDENTIALS
gcloud auth application-default print-access-token

# Se vazio, executar:
gcloud auth application-default login

Erro: "Project not set"

# Definir projeto
gcloud config set project ifriend-platform
gcloud config get-value project

✨ SUCESSO!

Se todos os testes passaram e não há erros em 24h, você resolveu o "model is overloaded"! 🎉

Próximas melhorias (Médio Prazo): 1. Implementar retry exponencial 2. Cache de resultados (30 min TTL) 3. Priority queue para diferentes tipos de queries 4. Análise preditiva de carga


Criado em: $(date) Status: PRONTO PARA DEPLOY Responsável: Você Próxima Revisão: +7 dias em produção