Erros e Producao
Aula 5 de 6
Error Handling
Workflows em producao inevitavelmente encontrarao erros. O N8N oferece varias camadas de tratamento.
echo "=== Estrategias de Error Handling ==="
echo ""
echo "1. Error Trigger"
echo " - Workflow especial para erros"
echo " - Recebe dados completos do erro"
echo " - Acao: notificar, logar, retentar"
echo ""
echo "2. Continue on Fail"
echo " - Node nao interrompe o workflow"
echo " - Erro fica disponivel como output"
echo " - IF Node pode verificar se houve erro"
echo ""
echo "3. Retry on Fail"
echo " - Workflow tenta novamente"
echo " - Configuravel: vezes, intervalo, backoff"
echo ""
echo "4. Error Output"
echo " - Node com saida de erro explicita"
echo " - HTTP Request: 4xx/5xx vao para saida de erro"
Configuracao de Retry
echo "=== Configuracao de Retry ==="
echo ""
echo "Por node:"
echo " - Continuar on Fail: Sim/Nao"
echo " - Max Retries: 0-10"
echo " - Retry Interval: 1s - 1h"
echo ""
echo "Por workflow (Settings):"
echo " - Error Workflow: Workflow a executar em caso de erro"
echo " - Timeout: Tempo maximo de execucao (1min - 24h)"
echo " - Save Data on Error: All / None / Selected"
echo "=== Boas Praticas de Error Handling ==="
echo ""
echo "Sempre configurar Error Workflow em producao"
echo ""
echo "No Error Workflow, fazer:"
echo " 1. Logar erro detalhado (console, arquivo)"
echo " 2. Notificar equipe (Slack, email)"
echo " 3. Decidir se retenta ou nao"
echo " 4. Se for critico, acionar on-call"
echo ""
echo "Para nodes criticos (pagamento, ERP):"
echo " - Usar Retry on Fail com backoff"
echo " - NUNCA usar Continue on Fail"
echo ""
echo "Para nodes nao-criticos (notificacao):"
echo " - Continue on Fail e aceitavel"
echo " - Melhor notificacao falhar que travar o pedido"
Logging
echo "=== Estrategias de Logging ==="
echo ""
echo "Interno (Execution Data):"
echo " - Historico automatico de execucoes"
echo " - Detalhes por node (input, output, erro)"
echo " - Retencao configuravel (dias/execucoes)"
echo ""
echo "Console (Code Node):"
echo " console.log('debug info')"
echo " console.error('error info')"
echo " Visivel no execution details"
echo ""
echo "Externo (HTTP/File):"
echo " - Enviar logs para servico externo"
echo " - HTTP Request: POST para Logstash/Elastic"
echo " - File: Escrever em arquivo (se montado)"
echo " - Slack: Notificar erros em canal dedicado"
Concurrency: Producao vs Dev
echo "=== Concurrency Settings ==="
echo ""
echo "Dev:"
echo " - Execucao manual"
echo " - Trigger manual"
echo " - Sem concorrencia"
echo " - Dados de teste"
echo ""
echo "Producao:"
echo " - Execucao automatica"
echo " - Webhook / Cron triggers ativos"
echo " - Concorrencia: 1-10 execucoes paralelas"
echo " - Dados reais"
echo ""
echo "Settings de Producao:"
echo " - Production Mode: On/Off"
echo " - Max Executions: 1-50 simultaneas"
echo " - Queue Mode: Bull/Bee (escalabilidade)"
Sub-Workflows
echo "=== Sub-Workflows ==="
echo ""
echo "Funcao: Workflow principal chama outros workflows"
echo ""
echo "Vantagens:"
echo " - Reuso: Logica compartilhada entre workflows"
echo " - Organizacao: Workflows menores e focados"
echo " - Manutencao: Alterar uma vez, reflete em todos"
echo ""
echo "Execute Workflow Node:"
echo " - Workflow ID: ID do sub-workflow"
echo " - Mode: JSON / Form data"
echo " - Data: Dados a passar para o sub-workflow"
echo ""
echo "Exemplo:"
echo " Workflow Pai: Processar pedido"
echo " -> Sub-workflow: Validar dados"
echo " -> Sub-workflow: Calcular frete"
echo " -> Sub-workflow: Notificar cliente"
Filas (Queue Mode)
echo "=== Queue Mode ==="
echo ""
echo "Arquitetura:"
echo " - N8N Server: Recebe requisicoes, enfileira"
echo " - Redis/Bull: Fila de execucao"
echo " - Workers: Processam as filas"
echo ""
echo "Beneficios:"
echo " - Escalabilidade: Workers podem ser adicionados"
echo " - Residencia: Se worker falha, task volta para fila"
echo " - Prioridade: Filas com prioridade diferente"
echo ""
echo "Configuracao:"
echo " EXECUTIONS_MODE=queue"
echo " QUEUE_BULL_REDIS_HOST=localhost"
echo " QUEUE_BULL_REDIS_PORT=6379"
echo " N8N_PAYLOAD_SIZE_MAX=16"
Variaveis de Ambiente
echo "=== Principais Environment Variables ==="
echo ""
echo "N8N_PORT=5678"
echo "N8N_HOST=n8n.exemplo.com"
echo "N8N_PROTOCOL=https"
echo ""
echo "WEBHOOK_URL=https://n8n.exemplo.com/"
echo "EXECUTIONS_DATA_PRUNE=true"
echo "EXECUTIONS_DATA_MAX_AGE=168" # 7 dias
echo ""
echo "DB_TYPE=postgresdb"
echo "DB_POSTGRESDB_DATABASE=n8n"
echo "DB_POSTGRESDB_USER=n8n"
echo "DB_POSTGRESDB_PASSWORD=secret"
echo ""
echo "N8N_ENCRYPTION_KEY=my-secret-key-32-chars"
echo "N8N_USER_MANAGEMENT_DISABLED=false"
Lab: Error Workflow Completo
cat > error_workflow_lab.sh << 'EOF'
echo "=== Lab: Error Workflow ==="
echo ""
echo "Workflow Principal: processar_pagamento"
echo " Trigger: Webhook POST /pagamento"
echo " HTTP Request: API de pagamento"
echo " Set: Atualizar status"
echo " Error Workflow: notificar_erro"
echo ""
echo "Workflow de Erro: notificar_erro"
echo ""
echo "1. Trigger: Error Trigger (automatico)"
echo ""
echo "2. Code Node: Extrair dados do erro"
echo " const error = $json;"
echo " const msg = 'Falha no workflow: '"
echo " + error.workflowId"
echo " + ' | Exec: ' + error.executionId"
echo " + ' | Erro: ' + error.errorMessage;"
echo " return [{ json: { message: msg, error } }];"
echo ""
echo "3. Slack Node: Notificar equipe"
echo " Channel: #erros-producao"
echo " Text: '🚨 {{ \$json.message }}'"
echo ""
echo "4. Gmail Node: Email para suporte"
echo " To: [email protected]"
echo " Subject: '[URGENTE] Erro no workflow'"
echo " Body: (include error details)"
echo ""
EOF
Erros em producao sao inevitaveis. A diferenca entre uma automacao profissional e uma amadora e como os erros sao tratados.