Pular para o conteúdo principal

Serviços

Diagrama de Fluxo

Resumo de Fluxos por Trigger

TriggerFila de entradaPipelineQuem cria o run
schedule / manualrunsitemscollect → process (transform interno)Scheduler / API
webhookitems diretoprocess (transform interno)Webhook Service
queue (externa)items diretoprocess (transform interno)Consumer

Rastreabilidade — O que cada trigger grava

Cada tipo de trigger grava registros diferentes no banco. A tabela abaixo explicita o que é persistido por tipo de integração:

Registros de execução

RegistroStandard (pulling)GatewayWebhook (listener)Fila externa (consumer)
execution_runSimSim (agregador)SimSim
execution_itemsSim (N por run)NãoSim (1 por request)Sim (1 por mensagem)
  • Gateway não cria execution_items — o execution_run funciona como agregador (correlation ID) para os http_logs.
  • Standard cria N items via fan-out no collect. Cada item tem input_payload, output_payload, status, attempts.
  • Webhook e Consumer criam 1 item por request/mensagem recebida, processado pelo Item Worker.

HTTP logs (http_logs)

Tipo de logDescriçãoStandardGatewayWebhookConsumer
internalPlataforma → serviço de integração (collect)Sim
internalPlataforma → serviço de integração (execute)Sim
externalIntegração → API externaSimSimSimSim
incomingRequest recebido pelo webhookSim
incoming_rejectedRequest rejeitado (HMAC inválido)Sim
  • Logs internal do process não são gravados — o resultado já está no execution_item (output_payload, status, error).
  • Logs external são a única forma de rastrear as chamadas HTTP feitas à API do parceiro — sempre gravados.
  • Todos os logs são enfileirados no BullMQ (logs) e persistidos de forma assíncrona pelo Log Writer.

Queue logs (queue_logs)

TipoDescriçãoStandardGatewayWebhookConsumer
queue-logMensagem recebida de fila externaSim
  • Apenas o Consumer grava queue_logs — registra a mensagem original da fila externa para auditoria.

Fluxo Detalhado — Schedule (Fan-out)

Fluxo Detalhado — Webhook (Item Único)

Fluxo Detalhado — Consumer de Fila Externa


Tabela de Responsabilidades

ServiçoPortaConhece DBConhece FilaChama Outros
API:3100SimSim (publica)Não
SchedulerSim (lê configs)Sim (publica)Não
Webhook:3002Sim (grava run)Sim (publica)Não
RunnerSimSim (consome)Sim (integrações via HTTP)
Monitor:3010Sim (leitura)Sim (leitura)Não
Integração X:401xNãoNãoApenas sistema externo

API (:3100)

MétodoRotaDescrição
GET/healthHealth check
GET/runsLista runs do tenant
GET/runs/:idDetalhes de um run
GET/runs/:id/itemsItems de um run
POST/runs/:id/reprocessReprocessa items falhos
GET/configsLista configs do tenant
PUT/configs/:idAtualiza config
POST/configs/:id/pausePausa/despausa handler
GET/admin/queuesBull Board (dashboard de filas)

Headers obrigatórios: x-tenant-id (exceto /health e /admin).

Contrato HTTP, Triggers, Schedule e Direção

Detalhes sobre o contrato HTTP das integrações (collect/process, gateway/execute), modos de trigger (pulling/listener/gateway), formatos de schedule e direção (inbound/outbound) estão documentados no Blueprint.

Runner — Orquestrador Central

O Runner é o coração da plataforma. Roda 3 workers:

WorkerFilaResponsabilidade
Run WorkerrunsConsome run jobs, chama collect, faz fan-out
Item WorkeritemsProcessa cada item (POST /process, transform é interno), gerencia retry
Log WriterlogsPersiste http_logs e queue_logs de forma assíncrona

Controles por handler:

  • concurrency — máximo de jobs simultâneos
  • rate_limit_per_minute — limite de chamadas à API externa
  • Pausa/resume individual sem afetar outros handlers

Lifecycle — Ativo / Pausado / Inativo

O estado operacional de uma integração é controlado por duas colunas booleanas na tabela configs:

ColunaDefaultDescrição
enabledfalseIntegração configurada e ativada pelo tenant
pausedfalseSuspensão temporária sem perder config nem credenciais

A combinação dessas colunas resulta em três estados:

                    ┌──────────────────┐
│ enabled? │
└────┬────────┬────┘
Não │ │ Sim
▼ ▼
┌─────────┐ ┌──────────────┐
│ Inativo │ │ paused? │
│ (off) │ └──┬────────┬──┘
└─────────┘ Não│ │Sim
▼ ▼
┌─────────┐ ┌─────────┐
│ Ativo │ │ Pausado │
│ (ok) │ │(paused) │
└─────────┘ └─────────┘
EstadoenabledpausedCorÍcone
Ativotruefalsesuccess-softcheck-circle
Pausadotruetruewarning-softpause-circle
Inativofalsegray-softx-circle

Resolução: resolveOperatingStatus() em @hg/shared.

O que cada serviço faz por estado:

ServiçoInativo (enabled=false)Pausado (paused=true)Ativo
SchedulerNão agenda (reload a cada 60s)Não agenda (reload a cada 60s)Cria cron jobs
API Gateway404 — config not found or disabled409 — integration is pausedExecuta normalmente
Webhook404 — config not found or disabledProcessa normalmente*Processa normalmente
ConsumerErro — não processa mensagemProcessa normalmente*Processa normalmente
Run WorkerProcessa normalmente*skipped — marca run como skippedProcessa normalmente
Item WorkerProcessa normalmente*Processa normalmente*Processa normalmente

* Campos marcados indicam que o serviço não checa esse estado atualmente — jobs já enfileirados serão processados.

Endpoint de controle:

  • POST /configs/:id/pause com body { paused: boolean } — alterna entre pausado e ativo.

Observações:

  • O Scheduler recarrega configs a cada 60 segundos. Mudanças de estado levam até 1 minuto para refletir no agendamento.
  • Pausar é mais eficaz para jobs em fila: o Run Worker respeita paused e marca como skipped. O campo enabled não é checado pelos workers.
  • Desativar (enabled=false) bloqueia imediatamente as bordas (API Gateway, Webhook), mas jobs já no BullMQ continuam sendo processados.

Logging de Aplicação (Pino)

Todos os serviços usam um logger centralizado via createLogger(name) de @hg/core. Ele retorna uma instância de Pino com dual output:

DestinoQuandoFormato
stdoutSemprepino-pretty (dev, se disponível) ou JSON
ArquivoLOG_FILE_ENABLED !== 'false' (padrão: ativo)JSON (pino-roll, rotação diária)

Arquivos de log ficam em logs/<service>/ na raiz do projeto (ou relativo a LOG_FILE_DIR):

logs/
├── api/
│ ├── api.2026-03-30.log
│ └── api.1 ← arquivo corrente (renomeado na rotação)
├── runner/
├── scheduler/
└── monitor/

Limpeza automática: no boot de cada serviço, arquivos .log mais antigos que LOG_FILE_RETENTION dias são removidos.

Uso nos serviços:

  • Fastify services (API, Monitor, Webhook, integrações): Fastify({ logger: createLogger('nome') }) — o Fastify usa a instância Pino diretamente.
  • Runner: logger principal + child loggers por worker (log.child({ worker: 'run' })).
  • Scheduler, Consumer: logger standalone (createLogger('scheduler')).

Variáveis de ambiente:

VariávelDefaultDescrição
LOG_LEVELdebug (dev) / info (prod)Nível mínimo de log
LOG_FILE_ENABLEDtruefalse para desativar escrita em arquivo
LOG_FILE_RETENTION7Dias de retenção dos arquivos de log
LOG_FILE_DIR./logsDiretório base dos logs

Importante: Este logger é para logs de aplicação (startup, shutdown, erros internos, debug). Os logs de HTTP (request/response das integrações) continuam sendo gravados de forma assíncrona via fila logshttp_logs/queue_logs no banco.

Monitor — APM Interno

Serviço standalone de monitoramento, deployável em servidor separado. Funciona como APM interno, oferecendo visibilidade centralizada de todo o sistema.

Porta: 3010 (configurável via PORT)

O que monitora:

CollectorFonteDados
Service HealthRedis (heartbeat)Status up/down de cada serviço, uptime, PID
Queue MetricsBullMQWaiting, active, completed, failed, delayed por fila
Execution StatsPostgreSQLRuns/items por status, taxa de sucesso, throughput/hora
Circuit BreakersRedisEstado e falhas de cada circuit breaker
Error RatesPostgreSQLDLQ total/por integração, últimas falhas, trend 24h
System MetricsRedis INFO + pg_statMemória Redis, conexões DB

Mecanismo:

  • Polling a cada 15s (configurável via POLL_INTERVAL_MS) coleta dados de todos os collectors
  • Snapshot cacheado no Redis (TTL 30s) e publicado via pub/sub para SSE
  • Cross-tenant (sem RLS) — visão sistêmica, não por tenant
  • Heartbeat: todos os serviços publicam heartbeat:<nome> no Redis com TTL auto-expire. Se o serviço morrer, a key expira e o monitor detecta como offline.

Rotas:

MétodoPathDescrição
GET/healthHealth do próprio monitor
GET/snapshotSnapshot completo do sistema
GET/servicesStatus dos serviços
GET/queuesMétricas das filas
GET/executionStats de execução
GET/circuit-breakersEstado dos circuit breakers
GET/errorsErros e DLQ
GET/systemMétricas de infraestrutura
GET/eventsSSE com push de snapshots