kb.erickguedes.com
N8N: Automação Low-Code

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.