📋 Checklist de Deployment - Solução "Model is Overloaded"¶
🔍 PRÉ-DEPLOYMENT (Verificações)¶
Configuração¶
- [x]
.env-GOOGLE_GENAI_USE_VERTEXAI=1configurado - [x]
.env-GOOGLE_API_KEYremovido - [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:
- API Requests Per Minute (RPM)
- Mostrar:
cloudrun.googleapis.com/request_count - Esperado: 10-40 RPM (nunca picos acima de 60)
-
Alerta: > 50 RPM = reduzir MAX_CONCURRENT_QUERIES para 1
-
Error Rate (429 + 503)
- Mostrar:
cloudrun.googleapis.com/request_countcom label status=429 ou 503 - Esperado: < 2%
-
Alerta: > 5% = verificar logs, considerar mais paralelismo
-
P95 Latency
- Mostrar:
cloudrun.googleapis.com/request_latenciespercentile_95 - Esperado: < 5 segundos
-
Alerta: > 10s = possível gargalo em ferramentas
-
Active Requests
- Mostrar:
cloudrun.googleapis.com/request_count(instantâneo) - Esperado: máx 2 simultâneas
-
Alerta: > 3 = semáforo não está funcionando
-
Memory Usage
- Mostrar:
cloudrun.googleapis.com/memory_allocation_bytesused - Esperado: 200-400 MB (de 512 MB alocado)
- 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?¶
-
Verificar .env
grep GOOGLE_GENAI_USE_VERTEXAI busca_produtos/.env # Deve retornar: GOOGLE_GENAI_USE_VERTEXAI=1 -
Verificar imports no slack_bot.py
grep "from google.api_core import exceptions as genai_errors" busca_produtos/slack_bot.py # Deve existir -
Verificar concorrência
gcloud run logs read agente-busca-productos-slack --region us-central1 | grep "async with global_semaphore" # Deve aparecer múltiplas vezes -
Se RPM ainda alto (> 50)
- Reduzir
MAX_CONCURRENT_QUERIESde 2 para 1 - Reduzir
MAX_QUERIES_PER_USER_PER_MINUTEde 3 para 2 - 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