Erathos + dbt Cloud: Como Orquestrar Pipelines ELT com Webhooks (Guia Completo)
Aprenda como orquestrar pipelines ELT com Erathos e dbt usando webhooks e API. Crie pipelines event-driven, reduza custos no BigQuery e ganhe rastreabilidade completa.
18 de mar. de 2026



Em projetos modernos de dados, a separação de responsabilidades entre ingestão e transformação se tornou uma prática fundamental. A Erathos resolve o problema da extração e carga de dados (EL) de diversas fontes para o data warehouse, enquanto o dbt se especializa na transformação (T) desses dados em modelos analíticos confiáveis.
Essa separação, no entanto, nos faz questionar: como orquestrar esses processos de forma eficiente? Como garantir que o dbt execute transformações apenas após a chegada de novos dados? Como fazer a Erathos reagir a falhas em transformações críticas do dbt?
A API de Orquestração da Erathos resolve esse problema ao permitir a criação de pipelines orientados a eventos. Com os webhooks, os fluxos são acionados automaticamente por acontecimentos reais como término de ingestões, falhas ou variações no volume de dados reduzindo a dependência de agendamentos fixos que nem sempre refletem o cenário atual.
A arquitetura que implementaremos neste tutorial representa um padrão moderno de engenharia de dados:
Erathos ingere dados transacionais de sistemas operacionais (PostgreSQL, MongoDB, APIs) para o BigQuery
Webhooks disparam automaticamente jobs do dbt Cloud quando novas cargas são concluídas
dbt Cloud transforma os dados brutos em modelos analíticos (facts e dimensions)
Orquestração reversa permite que o dbt também controle execuções na Erathos quando necessário
O Problema: Orquestração Desacoplada
Antes de implementar a solução, é importante entender os problemas que ela resolve:
Cenário 1: Agendamentos Fixos Desconectados
Situação: A Erathos está agendada para executar às 2h da manhã, e o dbt às 3h. Se a ingestão da Erathos falhar ou atrasar, o dbt processará dados desatualizados ou falhará por falta de dados novos.
Solução: O dbt executa somente quando a ingestão da Erathos termina com sucesso e após pelo menos 1 linha ter sido transferida.
Cenário 2: Falta de Rastreabilidade
Situação: Um dashboard apresenta dados incorretos. Não há clareza sobre qual etapa do pipeline falhou ou está desatualizada.
Solução: Cada execução do dbt recebe metadados da execução da Erathos (execution_id, número de linhas, tabelas afetadas), permitindo rastreamento completo.
Cenário 3: Desperdício de Recursos
Situação: O dbt executa periodicamente mesmo quando não há dados novos, consumindo créditos do BigQuery desnecessariamente.
Solução: Webhooks disparam apenas quando há dados novos (ROWS > 0), otimizando o uso de recursos.
Arquitetura da Solução
O fluxo implementado segue esta estrutura:
Conhecimento prévio
Este tutorial assume familiaridade com:
Conceitos básicos de dbt (models, sources, refs)
Navegação na interface do dbt
Conceitos de REST APIs e webhooks
Estrutura básica de data warehouses (facts e dimensions)
Pré-requisitos
Ambiente Erathos
Workspace ativo
Fonte de dados conectada (PostgreSQL, MongoDB, API, etc.)
Job de ingestão configurado e testado
Destino configurado para BigQuery
Ambiente dbt Cloud
Projeto dbt conectado ao BigQuery
Models já criados e testados
Job configurado no dbt Cloud
BigQuery
Projeto ativo no Google Cloud
Datasets criados:
raw_data(dados brutos da Erathos)staging(camada intermediária do dbt)analytics(camada final - facts e dimensions)
Passo 0: Coletando Informações Necessárias
Antes de começar, você precisará coletar algumas informações. Use esta tabela para organizar:
Informação | Onde Encontrar | Seu Valor |
|---|---|---|
Erathos API Key | Settings > User > API Key |
|
Erathos Workspace ID | URL do workspace: |
|
dbt Account ID | URL do dbt Cloud: |
|
dbt Personal Token | Account Settings > API Access > Create Token |
|
Erathos Job ID | Jobs > Selecionar job > Copiar ID da URL |
|
dbt Job ID | Deploy > Jobs > Selecionar job > ID na URL |
|
Passo 1: Configurar Credenciais de Autenticação
A integração via API requer autenticação em ambas as plataformas. As credenciais serão armazenadas de forma segura usando o sistema de Variables e Secrets da Erathos.
Gerar API Key da Erathos
Acesse Settings > User no Erathos
Na seção API Key, clique em Create
IMPORTANTE: A chave é exibida apenas uma vez. Copie e armazene em local seguro
Opcionalmente, defina uma data de expiração

Exemplo de API Key:
Gerando Personal Token do dbt Cloud
Acesse sua conta no dbt Cloud
Navegue até Account Settings > API Access
Clique em Create Service Token (ou Personal Token)
Copie o token gerado
Copie também o Account ID (você vai precisar)

Exemplo de configuração:
Criar Variables e Secrets na Erathos
A Erathos permite centralizar valores usados com frequência (como URLs e credenciais) no formato chave → valor.
Variables: para valores não sensíveis, que podem ser reutilizados em webhooks e outros processos.
Secrets: para dados sensíveis, como credenciais, que não podem ser visualizados após a criação, garantindo mais segurança.
Criando a Variable dbt_account_id
Via API:
curl -X POST <https://api.erathos.com/developers/workspaces/{workspace_id}/variables/> \\ -H "Authorization: Api-Key {sua_api_key_erathos}" \\ -H "Content-Type: application/json" \\ -d '{ "name": "dbt_account_id", "value": "12345" }'
Criando o Secret dbt_personal_token
Via API:
curl -X POST <https://api.erathos.com/developers/workspaces/{workspace_id}/secrets/> \\ -H "Authorization: Api-Key {sua_api_key_erathos}" \\ -H "Content-Type: application/json" \\ -d '{ "name": "dbt_personal_token", "value": "dbt_a1b2c3d4e5f6..." }'
Passo 2: Identificar IDs Necessários
Antes de criar webhooks, precisamos coletar os identificadores únicos dos recursos que vamos orquestrar.
Obtendo Job ID da Erathos
Cada conexão de dados na Erathos é representada por um Job. O UUID deste job é necessário para configuração.
Via Interface:
Navegue até Jobs
Localize o job desejado (ex:
ordersvindo do PostgreSQL)Copie o Job ID da URL ou da interface
Via API:
curl -X GET "<https://api.erathos.com/developers/workspaces/{workspace_id}/jobs/>" \\ -H "Authorization: Api-Key {sua_api_key_erathos}"
Resposta (exemplo):
{ "count": 3, "results": [ { "_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "name": "orders", "schema_name": "raw_data", "connector_name": "PostgreSQL", "is_active": true }, { "_id": "b2c3d4e5-f6a7-8901-bcde-f12345678901", "name": "products", "schema_name": "raw_data", "connector_name": "PostgreSQL", "is_active": true } ] }
Anote os IDs:
Job
orders:a1b2c3d4-e5f6-7890-abcd-ef1234567890Job
products:b2c3d4e5-f6a7-8901-bcde-f12345678901
Obtendo Job ID do dbt Cloud
No dbt Cloud, cada execução agendada ou ad-hoc é configurada como um Job. Precisamos do ID numérico desse job.
Via Interface:
No dbt Cloud, navegue até Deploy > Jobs
Clique no job que você quer triggerar (ex: "Daily Analytics Refresh")
O Job ID estará na URL:
https://cloud.getdbt.com/deploy/{account_id}/projects/{project_id}/jobs/{job_id}
Via API:
curl -X GET "<https://cloud.getdbt.com/api/v2/accounts/{account_id}/jobs/>" \\ -H "Authorization: Bearer {dbt_personal_token}"
Exemplo de Job ID: 54321
Passo 3: Erathos Disparando dbt Cloud
Após a Erathos terminar de ingerir dados no BigQuery, dispara automaticamente um job no dbt Cloud para transformá-los.
Entendendo o Fluxo
Anatomia do Webhook
Um webhook no Erathos contém:
description: Descrição para identificar o webhook
is_active: Se está ativo ou não
jobs: Lista de Job IDs do Erathos que devem triggerar o webhook
method: Tipo de requisição HTTP (POST, GET, DELETE, etc.)
url: Endpoint de destino (dbt Cloud API)
header: Headers HTTP (autenticação, content-type)
body: Corpo da requisição (dados enviados para o dbt)
rules: Condições que devem ser satisfeitas para o webhook disparar
Criando o Webhook: Erathos → dbt Cloud
curl -X POST "<https://api.erathos.com/developers/workspaces/{workspace_id}/orchestration/webhooks/>" \\ -H "Authorization: Api-Key {sua_api_key_erathos}" \\ -H "Content-Type: application/json" \\ -d '{ "description": "Trigger dbt Cloud job after successful orders ingestion", "is_active": true, "method": "POST", "url": "<https://cloud.getdbt.com/api/v2/accounts/${{variables.dbt_account_id}>}/jobs/54321/run/", "header": { "Content-Type": "application/json", "Accept": "application/json", "Authorization": "Bearer ${{secrets.dbt_personal_token}}" }, "body": { "cause": "Triggered by Erathos after successful ingestion of ${{erathos.TABLE_NAME}} | Execution ID: ${{erathos.EXECUTION_ID}} | Rows: ${{erathos.ROWS}}" }, "rules": [ { "variable_name": "STATUS", "operation": "EQUAL", "value": "FINISHED" }, { "variable_name": "ROWS", "operation": "GREATER_THAN", "value": "0" }, { "variable_name": "NESTED_TABLE", "operation": "EQUAL", "value": "false" } ], "jobs": [ "a1b2c3d4-e5f6-7890-abcd-ef1234567890" ] }'
Detalhando os Componentes
URL Dinâmica
"url": "<https://cloud.getdbt.com/api/v2/accounts/${{variables.dbt_account_id}>}/jobs/54321/run/"
${{variables.dbt_account_id}}: Substituído automaticamente pelo valor da variable criada no Passo 154321: ID do job do dbt Cloud obtido no Passo 2/run/: Endpoint da API do dbt Cloud para iniciar execuções
Headers de Autenticação
"header": { "Authorization": "Bearer ${{secrets.dbt_personal_token}}" }
O token é referenciado de forma segura através do sistema de Secrets.
Body com Metadados
"body": { "cause": "Triggered by Erathos after successful ingestion of ${{erathos.TABLE_NAME}}" }
${{erathos.TABLE_NAME}}: Nome da tabela ingerida (ex: "orders")${{erathos.EXECUTION_ID}}: UUID único da execução do Erathos${{erathos.ROWS}}: Número de linhas transferidas
Resultado no dbt Cloud: Quando o job do dbt rodar, você verá na interface:
Esta informação facilita o troubleshooting, permitindo rastrear qual execução do Erathos disparou cada execução do dbt.
Rules: Condições Inteligentes
As rules determinam quando o webhook deve disparar.
"rules": [ { "variable_name": "STATUS", "operation": "EQUAL", "value": "FINISHED" }, { "variable_name": "ROWS", "operation": "GREATER_THAN", "value": "0" }, { "variable_name": "NESTED_TABLE", "operation": "EQUAL", "value": "false" } ]
Traduzindo para lógica:
Por que essas regras?
STATUS == "FINISHED": Só dispara se a ingestão foi bem-sucedida (não dispara em caso de falha)
ROWS > 0: Evita processar execuções vazias (economiza créditos do BigQuery)
NESTED_TABLE == false: Para conectores de APIs que têm múltiplas tabelas aninhadas, garante que só a tabela principal dispare o webhook (evita múltiplos triggers)
Testando o Webhook
Após criar o webhook, teste manualmente:
Na Erathos: Execute manualmente o job
ordersAcompanhe: A execução deve terminar com sucesso e transferir pelo menos 1 linha
Verifique no dbt Cloud: Navegue até Deploy > Run History
Valide: Você deve ver uma nova execução com a causa personalizada
Exemplo de log esperado:
Passo 4: Monitoramento e Troubleshooting
Visualizando Webhooks Criados
Para listar todos os webhooks configurados no workspace:
curl -X GET "<https://api.erathos.com/developers/workspaces/{workspace_id}/orchestration/webhooks/>" \\ -H "Authorization: Api-Key {erathos_api_key}"
Resposta:
{ "count": 2, "results": [ { "_id": "webhook-uuid-123", "description": "Trigger dbt Cloud job after successful orders ingestion", "is_active": true, "method": "POST", "url": "<https://cloud.getdbt.com/api/v2/accounts/12345/jobs/54321/run/>", "jobs": ["a1b2c3d4-e5f6-7890-abcd-ef1234567890"] }, { "_id": "webhook-uuid-456", "description": "Run job_b after job_a completes successfully", "is_active": true, "method": "POST", "jobs": ["{job_a_id}"] } ] }
Desativando Temporariamente um Webhook
Se você precisa pausar temporariamente a orquestração (ex: durante manutenção do dbt Cloud):
curl -X PUT "<https://api.erathos.com/developers/workspaces/{workspace_id}/orchestration/webhooks/{webhook_id}/>" \\ -H "Authorization: Api-Key {erathos_api_key}" \\ -H "Content-Type: application/json" \\ -d '{ "is_active": false }'
Conclusão
Você implementou com sucesso uma arquitetura de orquestração entre Erathos e dbt Cloud, criando pipelines de dados verdadeiramente event-driven e inteligentes.
Automação Declarativa: Webhooks que reagem automaticamente a eventos reais (conclusão de ingestões, volumes de dados, horários), eliminando a necessidade de orquestradores complexos.
Rastreabilidade Completa: Metadados da Erathos fluem para o dbt Cloud, permitindo debugar falhas e entender o histórico de cada execução.
Eficiência Operacional: Rules garantem que transformações só rodam quando realmente necessário, economizando créditos do BigQuery e tempo de processamento.
Flexibilidade Arquitetural: A mesma API suporta integrações com Airflow, Prefect, sistemas customizados e orquestração interna da própria Erathos.
Referências
Documentação Oficial da API Erathos: https://docs.erathos.com/api
Documentação da API do dbt Cloud: https://docs.getdbt.com/dbt-cloud/api-v2
Erathos - Integração com dbt Cloud: https://docs.erathos.com/orchestration/dbt-cloud
Erathos - Variables e Secrets: https://docs.erathos.com/platform/variables-and-secrets
dbt Cloud - Webhooks (Outbound): https://docs.getdbt.com/docs/deploy/webhooks
Em projetos modernos de dados, a separação de responsabilidades entre ingestão e transformação se tornou uma prática fundamental. A Erathos resolve o problema da extração e carga de dados (EL) de diversas fontes para o data warehouse, enquanto o dbt se especializa na transformação (T) desses dados em modelos analíticos confiáveis.
Essa separação, no entanto, nos faz questionar: como orquestrar esses processos de forma eficiente? Como garantir que o dbt execute transformações apenas após a chegada de novos dados? Como fazer a Erathos reagir a falhas em transformações críticas do dbt?
A API de Orquestração da Erathos resolve esse problema ao permitir a criação de pipelines orientados a eventos. Com os webhooks, os fluxos são acionados automaticamente por acontecimentos reais como término de ingestões, falhas ou variações no volume de dados reduzindo a dependência de agendamentos fixos que nem sempre refletem o cenário atual.
A arquitetura que implementaremos neste tutorial representa um padrão moderno de engenharia de dados:
Erathos ingere dados transacionais de sistemas operacionais (PostgreSQL, MongoDB, APIs) para o BigQuery
Webhooks disparam automaticamente jobs do dbt Cloud quando novas cargas são concluídas
dbt Cloud transforma os dados brutos em modelos analíticos (facts e dimensions)
Orquestração reversa permite que o dbt também controle execuções na Erathos quando necessário
O Problema: Orquestração Desacoplada
Antes de implementar a solução, é importante entender os problemas que ela resolve:
Cenário 1: Agendamentos Fixos Desconectados
Situação: A Erathos está agendada para executar às 2h da manhã, e o dbt às 3h. Se a ingestão da Erathos falhar ou atrasar, o dbt processará dados desatualizados ou falhará por falta de dados novos.
Solução: O dbt executa somente quando a ingestão da Erathos termina com sucesso e após pelo menos 1 linha ter sido transferida.
Cenário 2: Falta de Rastreabilidade
Situação: Um dashboard apresenta dados incorretos. Não há clareza sobre qual etapa do pipeline falhou ou está desatualizada.
Solução: Cada execução do dbt recebe metadados da execução da Erathos (execution_id, número de linhas, tabelas afetadas), permitindo rastreamento completo.
Cenário 3: Desperdício de Recursos
Situação: O dbt executa periodicamente mesmo quando não há dados novos, consumindo créditos do BigQuery desnecessariamente.
Solução: Webhooks disparam apenas quando há dados novos (ROWS > 0), otimizando o uso de recursos.
Arquitetura da Solução
O fluxo implementado segue esta estrutura:
Conhecimento prévio
Este tutorial assume familiaridade com:
Conceitos básicos de dbt (models, sources, refs)
Navegação na interface do dbt
Conceitos de REST APIs e webhooks
Estrutura básica de data warehouses (facts e dimensions)
Pré-requisitos
Ambiente Erathos
Workspace ativo
Fonte de dados conectada (PostgreSQL, MongoDB, API, etc.)
Job de ingestão configurado e testado
Destino configurado para BigQuery
Ambiente dbt Cloud
Projeto dbt conectado ao BigQuery
Models já criados e testados
Job configurado no dbt Cloud
BigQuery
Projeto ativo no Google Cloud
Datasets criados:
raw_data(dados brutos da Erathos)staging(camada intermediária do dbt)analytics(camada final - facts e dimensions)
Passo 0: Coletando Informações Necessárias
Antes de começar, você precisará coletar algumas informações. Use esta tabela para organizar:
Informação | Onde Encontrar | Seu Valor |
|---|---|---|
Erathos API Key | Settings > User > API Key |
|
Erathos Workspace ID | URL do workspace: |
|
dbt Account ID | URL do dbt Cloud: |
|
dbt Personal Token | Account Settings > API Access > Create Token |
|
Erathos Job ID | Jobs > Selecionar job > Copiar ID da URL |
|
dbt Job ID | Deploy > Jobs > Selecionar job > ID na URL |
|
Passo 1: Configurar Credenciais de Autenticação
A integração via API requer autenticação em ambas as plataformas. As credenciais serão armazenadas de forma segura usando o sistema de Variables e Secrets da Erathos.
Gerar API Key da Erathos
Acesse Settings > User no Erathos
Na seção API Key, clique em Create
IMPORTANTE: A chave é exibida apenas uma vez. Copie e armazene em local seguro
Opcionalmente, defina uma data de expiração

Exemplo de API Key:
Gerando Personal Token do dbt Cloud
Acesse sua conta no dbt Cloud
Navegue até Account Settings > API Access
Clique em Create Service Token (ou Personal Token)
Copie o token gerado
Copie também o Account ID (você vai precisar)

Exemplo de configuração:
Criar Variables e Secrets na Erathos
A Erathos permite centralizar valores usados com frequência (como URLs e credenciais) no formato chave → valor.
Variables: para valores não sensíveis, que podem ser reutilizados em webhooks e outros processos.
Secrets: para dados sensíveis, como credenciais, que não podem ser visualizados após a criação, garantindo mais segurança.
Criando a Variable dbt_account_id
Via API:
curl -X POST <https://api.erathos.com/developers/workspaces/{workspace_id}/variables/> \\ -H "Authorization: Api-Key {sua_api_key_erathos}" \\ -H "Content-Type: application/json" \\ -d '{ "name": "dbt_account_id", "value": "12345" }'
Criando o Secret dbt_personal_token
Via API:
curl -X POST <https://api.erathos.com/developers/workspaces/{workspace_id}/secrets/> \\ -H "Authorization: Api-Key {sua_api_key_erathos}" \\ -H "Content-Type: application/json" \\ -d '{ "name": "dbt_personal_token", "value": "dbt_a1b2c3d4e5f6..." }'
Passo 2: Identificar IDs Necessários
Antes de criar webhooks, precisamos coletar os identificadores únicos dos recursos que vamos orquestrar.
Obtendo Job ID da Erathos
Cada conexão de dados na Erathos é representada por um Job. O UUID deste job é necessário para configuração.
Via Interface:
Navegue até Jobs
Localize o job desejado (ex:
ordersvindo do PostgreSQL)Copie o Job ID da URL ou da interface
Via API:
curl -X GET "<https://api.erathos.com/developers/workspaces/{workspace_id}/jobs/>" \\ -H "Authorization: Api-Key {sua_api_key_erathos}"
Resposta (exemplo):
{ "count": 3, "results": [ { "_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "name": "orders", "schema_name": "raw_data", "connector_name": "PostgreSQL", "is_active": true }, { "_id": "b2c3d4e5-f6a7-8901-bcde-f12345678901", "name": "products", "schema_name": "raw_data", "connector_name": "PostgreSQL", "is_active": true } ] }
Anote os IDs:
Job
orders:a1b2c3d4-e5f6-7890-abcd-ef1234567890Job
products:b2c3d4e5-f6a7-8901-bcde-f12345678901
Obtendo Job ID do dbt Cloud
No dbt Cloud, cada execução agendada ou ad-hoc é configurada como um Job. Precisamos do ID numérico desse job.
Via Interface:
No dbt Cloud, navegue até Deploy > Jobs
Clique no job que você quer triggerar (ex: "Daily Analytics Refresh")
O Job ID estará na URL:
https://cloud.getdbt.com/deploy/{account_id}/projects/{project_id}/jobs/{job_id}
Via API:
curl -X GET "<https://cloud.getdbt.com/api/v2/accounts/{account_id}/jobs/>" \\ -H "Authorization: Bearer {dbt_personal_token}"
Exemplo de Job ID: 54321
Passo 3: Erathos Disparando dbt Cloud
Após a Erathos terminar de ingerir dados no BigQuery, dispara automaticamente um job no dbt Cloud para transformá-los.
Entendendo o Fluxo
Anatomia do Webhook
Um webhook no Erathos contém:
description: Descrição para identificar o webhook
is_active: Se está ativo ou não
jobs: Lista de Job IDs do Erathos que devem triggerar o webhook
method: Tipo de requisição HTTP (POST, GET, DELETE, etc.)
url: Endpoint de destino (dbt Cloud API)
header: Headers HTTP (autenticação, content-type)
body: Corpo da requisição (dados enviados para o dbt)
rules: Condições que devem ser satisfeitas para o webhook disparar
Criando o Webhook: Erathos → dbt Cloud
curl -X POST "<https://api.erathos.com/developers/workspaces/{workspace_id}/orchestration/webhooks/>" \\ -H "Authorization: Api-Key {sua_api_key_erathos}" \\ -H "Content-Type: application/json" \\ -d '{ "description": "Trigger dbt Cloud job after successful orders ingestion", "is_active": true, "method": "POST", "url": "<https://cloud.getdbt.com/api/v2/accounts/${{variables.dbt_account_id}>}/jobs/54321/run/", "header": { "Content-Type": "application/json", "Accept": "application/json", "Authorization": "Bearer ${{secrets.dbt_personal_token}}" }, "body": { "cause": "Triggered by Erathos after successful ingestion of ${{erathos.TABLE_NAME}} | Execution ID: ${{erathos.EXECUTION_ID}} | Rows: ${{erathos.ROWS}}" }, "rules": [ { "variable_name": "STATUS", "operation": "EQUAL", "value": "FINISHED" }, { "variable_name": "ROWS", "operation": "GREATER_THAN", "value": "0" }, { "variable_name": "NESTED_TABLE", "operation": "EQUAL", "value": "false" } ], "jobs": [ "a1b2c3d4-e5f6-7890-abcd-ef1234567890" ] }'
Detalhando os Componentes
URL Dinâmica
"url": "<https://cloud.getdbt.com/api/v2/accounts/${{variables.dbt_account_id}>}/jobs/54321/run/"
${{variables.dbt_account_id}}: Substituído automaticamente pelo valor da variable criada no Passo 154321: ID do job do dbt Cloud obtido no Passo 2/run/: Endpoint da API do dbt Cloud para iniciar execuções
Headers de Autenticação
"header": { "Authorization": "Bearer ${{secrets.dbt_personal_token}}" }
O token é referenciado de forma segura através do sistema de Secrets.
Body com Metadados
"body": { "cause": "Triggered by Erathos after successful ingestion of ${{erathos.TABLE_NAME}}" }
${{erathos.TABLE_NAME}}: Nome da tabela ingerida (ex: "orders")${{erathos.EXECUTION_ID}}: UUID único da execução do Erathos${{erathos.ROWS}}: Número de linhas transferidas
Resultado no dbt Cloud: Quando o job do dbt rodar, você verá na interface:
Esta informação facilita o troubleshooting, permitindo rastrear qual execução do Erathos disparou cada execução do dbt.
Rules: Condições Inteligentes
As rules determinam quando o webhook deve disparar.
"rules": [ { "variable_name": "STATUS", "operation": "EQUAL", "value": "FINISHED" }, { "variable_name": "ROWS", "operation": "GREATER_THAN", "value": "0" }, { "variable_name": "NESTED_TABLE", "operation": "EQUAL", "value": "false" } ]
Traduzindo para lógica:
Por que essas regras?
STATUS == "FINISHED": Só dispara se a ingestão foi bem-sucedida (não dispara em caso de falha)
ROWS > 0: Evita processar execuções vazias (economiza créditos do BigQuery)
NESTED_TABLE == false: Para conectores de APIs que têm múltiplas tabelas aninhadas, garante que só a tabela principal dispare o webhook (evita múltiplos triggers)
Testando o Webhook
Após criar o webhook, teste manualmente:
Na Erathos: Execute manualmente o job
ordersAcompanhe: A execução deve terminar com sucesso e transferir pelo menos 1 linha
Verifique no dbt Cloud: Navegue até Deploy > Run History
Valide: Você deve ver uma nova execução com a causa personalizada
Exemplo de log esperado:
Passo 4: Monitoramento e Troubleshooting
Visualizando Webhooks Criados
Para listar todos os webhooks configurados no workspace:
curl -X GET "<https://api.erathos.com/developers/workspaces/{workspace_id}/orchestration/webhooks/>" \\ -H "Authorization: Api-Key {erathos_api_key}"
Resposta:
{ "count": 2, "results": [ { "_id": "webhook-uuid-123", "description": "Trigger dbt Cloud job after successful orders ingestion", "is_active": true, "method": "POST", "url": "<https://cloud.getdbt.com/api/v2/accounts/12345/jobs/54321/run/>", "jobs": ["a1b2c3d4-e5f6-7890-abcd-ef1234567890"] }, { "_id": "webhook-uuid-456", "description": "Run job_b after job_a completes successfully", "is_active": true, "method": "POST", "jobs": ["{job_a_id}"] } ] }
Desativando Temporariamente um Webhook
Se você precisa pausar temporariamente a orquestração (ex: durante manutenção do dbt Cloud):
curl -X PUT "<https://api.erathos.com/developers/workspaces/{workspace_id}/orchestration/webhooks/{webhook_id}/>" \\ -H "Authorization: Api-Key {erathos_api_key}" \\ -H "Content-Type: application/json" \\ -d '{ "is_active": false }'
Conclusão
Você implementou com sucesso uma arquitetura de orquestração entre Erathos e dbt Cloud, criando pipelines de dados verdadeiramente event-driven e inteligentes.
Automação Declarativa: Webhooks que reagem automaticamente a eventos reais (conclusão de ingestões, volumes de dados, horários), eliminando a necessidade de orquestradores complexos.
Rastreabilidade Completa: Metadados da Erathos fluem para o dbt Cloud, permitindo debugar falhas e entender o histórico de cada execução.
Eficiência Operacional: Rules garantem que transformações só rodam quando realmente necessário, economizando créditos do BigQuery e tempo de processamento.
Flexibilidade Arquitetural: A mesma API suporta integrações com Airflow, Prefect, sistemas customizados e orquestração interna da própria Erathos.
Referências
Documentação Oficial da API Erathos: https://docs.erathos.com/api
Documentação da API do dbt Cloud: https://docs.getdbt.com/dbt-cloud/api-v2
Erathos - Integração com dbt Cloud: https://docs.erathos.com/orchestration/dbt-cloud
Erathos - Variables e Secrets: https://docs.erathos.com/platform/variables-and-secrets
dbt Cloud - Webhooks (Outbound): https://docs.getdbt.com/docs/deploy/webhooks
Em projetos modernos de dados, a separação de responsabilidades entre ingestão e transformação se tornou uma prática fundamental. A Erathos resolve o problema da extração e carga de dados (EL) de diversas fontes para o data warehouse, enquanto o dbt se especializa na transformação (T) desses dados em modelos analíticos confiáveis.
Essa separação, no entanto, nos faz questionar: como orquestrar esses processos de forma eficiente? Como garantir que o dbt execute transformações apenas após a chegada de novos dados? Como fazer a Erathos reagir a falhas em transformações críticas do dbt?
A API de Orquestração da Erathos resolve esse problema ao permitir a criação de pipelines orientados a eventos. Com os webhooks, os fluxos são acionados automaticamente por acontecimentos reais como término de ingestões, falhas ou variações no volume de dados reduzindo a dependência de agendamentos fixos que nem sempre refletem o cenário atual.
A arquitetura que implementaremos neste tutorial representa um padrão moderno de engenharia de dados:
Erathos ingere dados transacionais de sistemas operacionais (PostgreSQL, MongoDB, APIs) para o BigQuery
Webhooks disparam automaticamente jobs do dbt Cloud quando novas cargas são concluídas
dbt Cloud transforma os dados brutos em modelos analíticos (facts e dimensions)
Orquestração reversa permite que o dbt também controle execuções na Erathos quando necessário
O Problema: Orquestração Desacoplada
Antes de implementar a solução, é importante entender os problemas que ela resolve:
Cenário 1: Agendamentos Fixos Desconectados
Situação: A Erathos está agendada para executar às 2h da manhã, e o dbt às 3h. Se a ingestão da Erathos falhar ou atrasar, o dbt processará dados desatualizados ou falhará por falta de dados novos.
Solução: O dbt executa somente quando a ingestão da Erathos termina com sucesso e após pelo menos 1 linha ter sido transferida.
Cenário 2: Falta de Rastreabilidade
Situação: Um dashboard apresenta dados incorretos. Não há clareza sobre qual etapa do pipeline falhou ou está desatualizada.
Solução: Cada execução do dbt recebe metadados da execução da Erathos (execution_id, número de linhas, tabelas afetadas), permitindo rastreamento completo.
Cenário 3: Desperdício de Recursos
Situação: O dbt executa periodicamente mesmo quando não há dados novos, consumindo créditos do BigQuery desnecessariamente.
Solução: Webhooks disparam apenas quando há dados novos (ROWS > 0), otimizando o uso de recursos.
Arquitetura da Solução
O fluxo implementado segue esta estrutura:
Conhecimento prévio
Este tutorial assume familiaridade com:
Conceitos básicos de dbt (models, sources, refs)
Navegação na interface do dbt
Conceitos de REST APIs e webhooks
Estrutura básica de data warehouses (facts e dimensions)
Pré-requisitos
Ambiente Erathos
Workspace ativo
Fonte de dados conectada (PostgreSQL, MongoDB, API, etc.)
Job de ingestão configurado e testado
Destino configurado para BigQuery
Ambiente dbt Cloud
Projeto dbt conectado ao BigQuery
Models já criados e testados
Job configurado no dbt Cloud
BigQuery
Projeto ativo no Google Cloud
Datasets criados:
raw_data(dados brutos da Erathos)staging(camada intermediária do dbt)analytics(camada final - facts e dimensions)
Passo 0: Coletando Informações Necessárias
Antes de começar, você precisará coletar algumas informações. Use esta tabela para organizar:
Informação | Onde Encontrar | Seu Valor |
|---|---|---|
Erathos API Key | Settings > User > API Key |
|
Erathos Workspace ID | URL do workspace: |
|
dbt Account ID | URL do dbt Cloud: |
|
dbt Personal Token | Account Settings > API Access > Create Token |
|
Erathos Job ID | Jobs > Selecionar job > Copiar ID da URL |
|
dbt Job ID | Deploy > Jobs > Selecionar job > ID na URL |
|
Passo 1: Configurar Credenciais de Autenticação
A integração via API requer autenticação em ambas as plataformas. As credenciais serão armazenadas de forma segura usando o sistema de Variables e Secrets da Erathos.
Gerar API Key da Erathos
Acesse Settings > User no Erathos
Na seção API Key, clique em Create
IMPORTANTE: A chave é exibida apenas uma vez. Copie e armazene em local seguro
Opcionalmente, defina uma data de expiração

Exemplo de API Key:
Gerando Personal Token do dbt Cloud
Acesse sua conta no dbt Cloud
Navegue até Account Settings > API Access
Clique em Create Service Token (ou Personal Token)
Copie o token gerado
Copie também o Account ID (você vai precisar)

Exemplo de configuração:
Criar Variables e Secrets na Erathos
A Erathos permite centralizar valores usados com frequência (como URLs e credenciais) no formato chave → valor.
Variables: para valores não sensíveis, que podem ser reutilizados em webhooks e outros processos.
Secrets: para dados sensíveis, como credenciais, que não podem ser visualizados após a criação, garantindo mais segurança.
Criando a Variable dbt_account_id
Via API:
curl -X POST <https://api.erathos.com/developers/workspaces/{workspace_id}/variables/> \\ -H "Authorization: Api-Key {sua_api_key_erathos}" \\ -H "Content-Type: application/json" \\ -d '{ "name": "dbt_account_id", "value": "12345" }'
Criando o Secret dbt_personal_token
Via API:
curl -X POST <https://api.erathos.com/developers/workspaces/{workspace_id}/secrets/> \\ -H "Authorization: Api-Key {sua_api_key_erathos}" \\ -H "Content-Type: application/json" \\ -d '{ "name": "dbt_personal_token", "value": "dbt_a1b2c3d4e5f6..." }'
Passo 2: Identificar IDs Necessários
Antes de criar webhooks, precisamos coletar os identificadores únicos dos recursos que vamos orquestrar.
Obtendo Job ID da Erathos
Cada conexão de dados na Erathos é representada por um Job. O UUID deste job é necessário para configuração.
Via Interface:
Navegue até Jobs
Localize o job desejado (ex:
ordersvindo do PostgreSQL)Copie o Job ID da URL ou da interface
Via API:
curl -X GET "<https://api.erathos.com/developers/workspaces/{workspace_id}/jobs/>" \\ -H "Authorization: Api-Key {sua_api_key_erathos}"
Resposta (exemplo):
{ "count": 3, "results": [ { "_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "name": "orders", "schema_name": "raw_data", "connector_name": "PostgreSQL", "is_active": true }, { "_id": "b2c3d4e5-f6a7-8901-bcde-f12345678901", "name": "products", "schema_name": "raw_data", "connector_name": "PostgreSQL", "is_active": true } ] }
Anote os IDs:
Job
orders:a1b2c3d4-e5f6-7890-abcd-ef1234567890Job
products:b2c3d4e5-f6a7-8901-bcde-f12345678901
Obtendo Job ID do dbt Cloud
No dbt Cloud, cada execução agendada ou ad-hoc é configurada como um Job. Precisamos do ID numérico desse job.
Via Interface:
No dbt Cloud, navegue até Deploy > Jobs
Clique no job que você quer triggerar (ex: "Daily Analytics Refresh")
O Job ID estará na URL:
https://cloud.getdbt.com/deploy/{account_id}/projects/{project_id}/jobs/{job_id}
Via API:
curl -X GET "<https://cloud.getdbt.com/api/v2/accounts/{account_id}/jobs/>" \\ -H "Authorization: Bearer {dbt_personal_token}"
Exemplo de Job ID: 54321
Passo 3: Erathos Disparando dbt Cloud
Após a Erathos terminar de ingerir dados no BigQuery, dispara automaticamente um job no dbt Cloud para transformá-los.
Entendendo o Fluxo
Anatomia do Webhook
Um webhook no Erathos contém:
description: Descrição para identificar o webhook
is_active: Se está ativo ou não
jobs: Lista de Job IDs do Erathos que devem triggerar o webhook
method: Tipo de requisição HTTP (POST, GET, DELETE, etc.)
url: Endpoint de destino (dbt Cloud API)
header: Headers HTTP (autenticação, content-type)
body: Corpo da requisição (dados enviados para o dbt)
rules: Condições que devem ser satisfeitas para o webhook disparar
Criando o Webhook: Erathos → dbt Cloud
curl -X POST "<https://api.erathos.com/developers/workspaces/{workspace_id}/orchestration/webhooks/>" \\ -H "Authorization: Api-Key {sua_api_key_erathos}" \\ -H "Content-Type: application/json" \\ -d '{ "description": "Trigger dbt Cloud job after successful orders ingestion", "is_active": true, "method": "POST", "url": "<https://cloud.getdbt.com/api/v2/accounts/${{variables.dbt_account_id}>}/jobs/54321/run/", "header": { "Content-Type": "application/json", "Accept": "application/json", "Authorization": "Bearer ${{secrets.dbt_personal_token}}" }, "body": { "cause": "Triggered by Erathos after successful ingestion of ${{erathos.TABLE_NAME}} | Execution ID: ${{erathos.EXECUTION_ID}} | Rows: ${{erathos.ROWS}}" }, "rules": [ { "variable_name": "STATUS", "operation": "EQUAL", "value": "FINISHED" }, { "variable_name": "ROWS", "operation": "GREATER_THAN", "value": "0" }, { "variable_name": "NESTED_TABLE", "operation": "EQUAL", "value": "false" } ], "jobs": [ "a1b2c3d4-e5f6-7890-abcd-ef1234567890" ] }'
Detalhando os Componentes
URL Dinâmica
"url": "<https://cloud.getdbt.com/api/v2/accounts/${{variables.dbt_account_id}>}/jobs/54321/run/"
${{variables.dbt_account_id}}: Substituído automaticamente pelo valor da variable criada no Passo 154321: ID do job do dbt Cloud obtido no Passo 2/run/: Endpoint da API do dbt Cloud para iniciar execuções
Headers de Autenticação
"header": { "Authorization": "Bearer ${{secrets.dbt_personal_token}}" }
O token é referenciado de forma segura através do sistema de Secrets.
Body com Metadados
"body": { "cause": "Triggered by Erathos after successful ingestion of ${{erathos.TABLE_NAME}}" }
${{erathos.TABLE_NAME}}: Nome da tabela ingerida (ex: "orders")${{erathos.EXECUTION_ID}}: UUID único da execução do Erathos${{erathos.ROWS}}: Número de linhas transferidas
Resultado no dbt Cloud: Quando o job do dbt rodar, você verá na interface:
Esta informação facilita o troubleshooting, permitindo rastrear qual execução do Erathos disparou cada execução do dbt.
Rules: Condições Inteligentes
As rules determinam quando o webhook deve disparar.
"rules": [ { "variable_name": "STATUS", "operation": "EQUAL", "value": "FINISHED" }, { "variable_name": "ROWS", "operation": "GREATER_THAN", "value": "0" }, { "variable_name": "NESTED_TABLE", "operation": "EQUAL", "value": "false" } ]
Traduzindo para lógica:
Por que essas regras?
STATUS == "FINISHED": Só dispara se a ingestão foi bem-sucedida (não dispara em caso de falha)
ROWS > 0: Evita processar execuções vazias (economiza créditos do BigQuery)
NESTED_TABLE == false: Para conectores de APIs que têm múltiplas tabelas aninhadas, garante que só a tabela principal dispare o webhook (evita múltiplos triggers)
Testando o Webhook
Após criar o webhook, teste manualmente:
Na Erathos: Execute manualmente o job
ordersAcompanhe: A execução deve terminar com sucesso e transferir pelo menos 1 linha
Verifique no dbt Cloud: Navegue até Deploy > Run History
Valide: Você deve ver uma nova execução com a causa personalizada
Exemplo de log esperado:
Passo 4: Monitoramento e Troubleshooting
Visualizando Webhooks Criados
Para listar todos os webhooks configurados no workspace:
curl -X GET "<https://api.erathos.com/developers/workspaces/{workspace_id}/orchestration/webhooks/>" \\ -H "Authorization: Api-Key {erathos_api_key}"
Resposta:
{ "count": 2, "results": [ { "_id": "webhook-uuid-123", "description": "Trigger dbt Cloud job after successful orders ingestion", "is_active": true, "method": "POST", "url": "<https://cloud.getdbt.com/api/v2/accounts/12345/jobs/54321/run/>", "jobs": ["a1b2c3d4-e5f6-7890-abcd-ef1234567890"] }, { "_id": "webhook-uuid-456", "description": "Run job_b after job_a completes successfully", "is_active": true, "method": "POST", "jobs": ["{job_a_id}"] } ] }
Desativando Temporariamente um Webhook
Se você precisa pausar temporariamente a orquestração (ex: durante manutenção do dbt Cloud):
curl -X PUT "<https://api.erathos.com/developers/workspaces/{workspace_id}/orchestration/webhooks/{webhook_id}/>" \\ -H "Authorization: Api-Key {erathos_api_key}" \\ -H "Content-Type: application/json" \\ -d '{ "is_active": false }'
Conclusão
Você implementou com sucesso uma arquitetura de orquestração entre Erathos e dbt Cloud, criando pipelines de dados verdadeiramente event-driven e inteligentes.
Automação Declarativa: Webhooks que reagem automaticamente a eventos reais (conclusão de ingestões, volumes de dados, horários), eliminando a necessidade de orquestradores complexos.
Rastreabilidade Completa: Metadados da Erathos fluem para o dbt Cloud, permitindo debugar falhas e entender o histórico de cada execução.
Eficiência Operacional: Rules garantem que transformações só rodam quando realmente necessário, economizando créditos do BigQuery e tempo de processamento.
Flexibilidade Arquitetural: A mesma API suporta integrações com Airflow, Prefect, sistemas customizados e orquestração interna da própria Erathos.
Referências
Documentação Oficial da API Erathos: https://docs.erathos.com/api
Documentação da API do dbt Cloud: https://docs.getdbt.com/dbt-cloud/api-v2
Erathos - Integração com dbt Cloud: https://docs.erathos.com/orchestration/dbt-cloud
Erathos - Variables e Secrets: https://docs.erathos.com/platform/variables-and-secrets
dbt Cloud - Webhooks (Outbound): https://docs.getdbt.com/docs/deploy/webhooks
Em projetos modernos de dados, a separação de responsabilidades entre ingestão e transformação se tornou uma prática fundamental. A Erathos resolve o problema da extração e carga de dados (EL) de diversas fontes para o data warehouse, enquanto o dbt se especializa na transformação (T) desses dados em modelos analíticos confiáveis.
Essa separação, no entanto, nos faz questionar: como orquestrar esses processos de forma eficiente? Como garantir que o dbt execute transformações apenas após a chegada de novos dados? Como fazer a Erathos reagir a falhas em transformações críticas do dbt?
A API de Orquestração da Erathos resolve esse problema ao permitir a criação de pipelines orientados a eventos. Com os webhooks, os fluxos são acionados automaticamente por acontecimentos reais como término de ingestões, falhas ou variações no volume de dados reduzindo a dependência de agendamentos fixos que nem sempre refletem o cenário atual.
A arquitetura que implementaremos neste tutorial representa um padrão moderno de engenharia de dados:
Erathos ingere dados transacionais de sistemas operacionais (PostgreSQL, MongoDB, APIs) para o BigQuery
Webhooks disparam automaticamente jobs do dbt Cloud quando novas cargas são concluídas
dbt Cloud transforma os dados brutos em modelos analíticos (facts e dimensions)
Orquestração reversa permite que o dbt também controle execuções na Erathos quando necessário
O Problema: Orquestração Desacoplada
Antes de implementar a solução, é importante entender os problemas que ela resolve:
Cenário 1: Agendamentos Fixos Desconectados
Situação: A Erathos está agendada para executar às 2h da manhã, e o dbt às 3h. Se a ingestão da Erathos falhar ou atrasar, o dbt processará dados desatualizados ou falhará por falta de dados novos.
Solução: O dbt executa somente quando a ingestão da Erathos termina com sucesso e após pelo menos 1 linha ter sido transferida.
Cenário 2: Falta de Rastreabilidade
Situação: Um dashboard apresenta dados incorretos. Não há clareza sobre qual etapa do pipeline falhou ou está desatualizada.
Solução: Cada execução do dbt recebe metadados da execução da Erathos (execution_id, número de linhas, tabelas afetadas), permitindo rastreamento completo.
Cenário 3: Desperdício de Recursos
Situação: O dbt executa periodicamente mesmo quando não há dados novos, consumindo créditos do BigQuery desnecessariamente.
Solução: Webhooks disparam apenas quando há dados novos (ROWS > 0), otimizando o uso de recursos.
Arquitetura da Solução
O fluxo implementado segue esta estrutura:
Conhecimento prévio
Este tutorial assume familiaridade com:
Conceitos básicos de dbt (models, sources, refs)
Navegação na interface do dbt
Conceitos de REST APIs e webhooks
Estrutura básica de data warehouses (facts e dimensions)
Pré-requisitos
Ambiente Erathos
Workspace ativo
Fonte de dados conectada (PostgreSQL, MongoDB, API, etc.)
Job de ingestão configurado e testado
Destino configurado para BigQuery
Ambiente dbt Cloud
Projeto dbt conectado ao BigQuery
Models já criados e testados
Job configurado no dbt Cloud
BigQuery
Projeto ativo no Google Cloud
Datasets criados:
raw_data(dados brutos da Erathos)staging(camada intermediária do dbt)analytics(camada final - facts e dimensions)
Passo 0: Coletando Informações Necessárias
Antes de começar, você precisará coletar algumas informações. Use esta tabela para organizar:
Informação | Onde Encontrar | Seu Valor |
|---|---|---|
Erathos API Key | Settings > User > API Key |
|
Erathos Workspace ID | URL do workspace: |
|
dbt Account ID | URL do dbt Cloud: |
|
dbt Personal Token | Account Settings > API Access > Create Token |
|
Erathos Job ID | Jobs > Selecionar job > Copiar ID da URL |
|
dbt Job ID | Deploy > Jobs > Selecionar job > ID na URL |
|
Passo 1: Configurar Credenciais de Autenticação
A integração via API requer autenticação em ambas as plataformas. As credenciais serão armazenadas de forma segura usando o sistema de Variables e Secrets da Erathos.
Gerar API Key da Erathos
Acesse Settings > User no Erathos
Na seção API Key, clique em Create
IMPORTANTE: A chave é exibida apenas uma vez. Copie e armazene em local seguro
Opcionalmente, defina uma data de expiração

Exemplo de API Key:
Gerando Personal Token do dbt Cloud
Acesse sua conta no dbt Cloud
Navegue até Account Settings > API Access
Clique em Create Service Token (ou Personal Token)
Copie o token gerado
Copie também o Account ID (você vai precisar)

Exemplo de configuração:
Criar Variables e Secrets na Erathos
A Erathos permite centralizar valores usados com frequência (como URLs e credenciais) no formato chave → valor.
Variables: para valores não sensíveis, que podem ser reutilizados em webhooks e outros processos.
Secrets: para dados sensíveis, como credenciais, que não podem ser visualizados após a criação, garantindo mais segurança.
Criando a Variable dbt_account_id
Via API:
curl -X POST <https://api.erathos.com/developers/workspaces/{workspace_id}/variables/> \\ -H "Authorization: Api-Key {sua_api_key_erathos}" \\ -H "Content-Type: application/json" \\ -d '{ "name": "dbt_account_id", "value": "12345" }'
Criando o Secret dbt_personal_token
Via API:
curl -X POST <https://api.erathos.com/developers/workspaces/{workspace_id}/secrets/> \\ -H "Authorization: Api-Key {sua_api_key_erathos}" \\ -H "Content-Type: application/json" \\ -d '{ "name": "dbt_personal_token", "value": "dbt_a1b2c3d4e5f6..." }'
Passo 2: Identificar IDs Necessários
Antes de criar webhooks, precisamos coletar os identificadores únicos dos recursos que vamos orquestrar.
Obtendo Job ID da Erathos
Cada conexão de dados na Erathos é representada por um Job. O UUID deste job é necessário para configuração.
Via Interface:
Navegue até Jobs
Localize o job desejado (ex:
ordersvindo do PostgreSQL)Copie o Job ID da URL ou da interface
Via API:
curl -X GET "<https://api.erathos.com/developers/workspaces/{workspace_id}/jobs/>" \\ -H "Authorization: Api-Key {sua_api_key_erathos}"
Resposta (exemplo):
{ "count": 3, "results": [ { "_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "name": "orders", "schema_name": "raw_data", "connector_name": "PostgreSQL", "is_active": true }, { "_id": "b2c3d4e5-f6a7-8901-bcde-f12345678901", "name": "products", "schema_name": "raw_data", "connector_name": "PostgreSQL", "is_active": true } ] }
Anote os IDs:
Job
orders:a1b2c3d4-e5f6-7890-abcd-ef1234567890Job
products:b2c3d4e5-f6a7-8901-bcde-f12345678901
Obtendo Job ID do dbt Cloud
No dbt Cloud, cada execução agendada ou ad-hoc é configurada como um Job. Precisamos do ID numérico desse job.
Via Interface:
No dbt Cloud, navegue até Deploy > Jobs
Clique no job que você quer triggerar (ex: "Daily Analytics Refresh")
O Job ID estará na URL:
https://cloud.getdbt.com/deploy/{account_id}/projects/{project_id}/jobs/{job_id}
Via API:
curl -X GET "<https://cloud.getdbt.com/api/v2/accounts/{account_id}/jobs/>" \\ -H "Authorization: Bearer {dbt_personal_token}"
Exemplo de Job ID: 54321
Passo 3: Erathos Disparando dbt Cloud
Após a Erathos terminar de ingerir dados no BigQuery, dispara automaticamente um job no dbt Cloud para transformá-los.
Entendendo o Fluxo
Anatomia do Webhook
Um webhook no Erathos contém:
description: Descrição para identificar o webhook
is_active: Se está ativo ou não
jobs: Lista de Job IDs do Erathos que devem triggerar o webhook
method: Tipo de requisição HTTP (POST, GET, DELETE, etc.)
url: Endpoint de destino (dbt Cloud API)
header: Headers HTTP (autenticação, content-type)
body: Corpo da requisição (dados enviados para o dbt)
rules: Condições que devem ser satisfeitas para o webhook disparar
Criando o Webhook: Erathos → dbt Cloud
curl -X POST "<https://api.erathos.com/developers/workspaces/{workspace_id}/orchestration/webhooks/>" \\ -H "Authorization: Api-Key {sua_api_key_erathos}" \\ -H "Content-Type: application/json" \\ -d '{ "description": "Trigger dbt Cloud job after successful orders ingestion", "is_active": true, "method": "POST", "url": "<https://cloud.getdbt.com/api/v2/accounts/${{variables.dbt_account_id}>}/jobs/54321/run/", "header": { "Content-Type": "application/json", "Accept": "application/json", "Authorization": "Bearer ${{secrets.dbt_personal_token}}" }, "body": { "cause": "Triggered by Erathos after successful ingestion of ${{erathos.TABLE_NAME}} | Execution ID: ${{erathos.EXECUTION_ID}} | Rows: ${{erathos.ROWS}}" }, "rules": [ { "variable_name": "STATUS", "operation": "EQUAL", "value": "FINISHED" }, { "variable_name": "ROWS", "operation": "GREATER_THAN", "value": "0" }, { "variable_name": "NESTED_TABLE", "operation": "EQUAL", "value": "false" } ], "jobs": [ "a1b2c3d4-e5f6-7890-abcd-ef1234567890" ] }'
Detalhando os Componentes
URL Dinâmica
"url": "<https://cloud.getdbt.com/api/v2/accounts/${{variables.dbt_account_id}>}/jobs/54321/run/"
${{variables.dbt_account_id}}: Substituído automaticamente pelo valor da variable criada no Passo 154321: ID do job do dbt Cloud obtido no Passo 2/run/: Endpoint da API do dbt Cloud para iniciar execuções
Headers de Autenticação
"header": { "Authorization": "Bearer ${{secrets.dbt_personal_token}}" }
O token é referenciado de forma segura através do sistema de Secrets.
Body com Metadados
"body": { "cause": "Triggered by Erathos after successful ingestion of ${{erathos.TABLE_NAME}}" }
${{erathos.TABLE_NAME}}: Nome da tabela ingerida (ex: "orders")${{erathos.EXECUTION_ID}}: UUID único da execução do Erathos${{erathos.ROWS}}: Número de linhas transferidas
Resultado no dbt Cloud: Quando o job do dbt rodar, você verá na interface:
Esta informação facilita o troubleshooting, permitindo rastrear qual execução do Erathos disparou cada execução do dbt.
Rules: Condições Inteligentes
As rules determinam quando o webhook deve disparar.
"rules": [ { "variable_name": "STATUS", "operation": "EQUAL", "value": "FINISHED" }, { "variable_name": "ROWS", "operation": "GREATER_THAN", "value": "0" }, { "variable_name": "NESTED_TABLE", "operation": "EQUAL", "value": "false" } ]
Traduzindo para lógica:
Por que essas regras?
STATUS == "FINISHED": Só dispara se a ingestão foi bem-sucedida (não dispara em caso de falha)
ROWS > 0: Evita processar execuções vazias (economiza créditos do BigQuery)
NESTED_TABLE == false: Para conectores de APIs que têm múltiplas tabelas aninhadas, garante que só a tabela principal dispare o webhook (evita múltiplos triggers)
Testando o Webhook
Após criar o webhook, teste manualmente:
Na Erathos: Execute manualmente o job
ordersAcompanhe: A execução deve terminar com sucesso e transferir pelo menos 1 linha
Verifique no dbt Cloud: Navegue até Deploy > Run History
Valide: Você deve ver uma nova execução com a causa personalizada
Exemplo de log esperado:
Passo 4: Monitoramento e Troubleshooting
Visualizando Webhooks Criados
Para listar todos os webhooks configurados no workspace:
curl -X GET "<https://api.erathos.com/developers/workspaces/{workspace_id}/orchestration/webhooks/>" \\ -H "Authorization: Api-Key {erathos_api_key}"
Resposta:
{ "count": 2, "results": [ { "_id": "webhook-uuid-123", "description": "Trigger dbt Cloud job after successful orders ingestion", "is_active": true, "method": "POST", "url": "<https://cloud.getdbt.com/api/v2/accounts/12345/jobs/54321/run/>", "jobs": ["a1b2c3d4-e5f6-7890-abcd-ef1234567890"] }, { "_id": "webhook-uuid-456", "description": "Run job_b after job_a completes successfully", "is_active": true, "method": "POST", "jobs": ["{job_a_id}"] } ] }
Desativando Temporariamente um Webhook
Se você precisa pausar temporariamente a orquestração (ex: durante manutenção do dbt Cloud):
curl -X PUT "<https://api.erathos.com/developers/workspaces/{workspace_id}/orchestration/webhooks/{webhook_id}/>" \\ -H "Authorization: Api-Key {erathos_api_key}" \\ -H "Content-Type: application/json" \\ -d '{ "is_active": false }'
Conclusão
Você implementou com sucesso uma arquitetura de orquestração entre Erathos e dbt Cloud, criando pipelines de dados verdadeiramente event-driven e inteligentes.
Automação Declarativa: Webhooks que reagem automaticamente a eventos reais (conclusão de ingestões, volumes de dados, horários), eliminando a necessidade de orquestradores complexos.
Rastreabilidade Completa: Metadados da Erathos fluem para o dbt Cloud, permitindo debugar falhas e entender o histórico de cada execução.
Eficiência Operacional: Rules garantem que transformações só rodam quando realmente necessário, economizando créditos do BigQuery e tempo de processamento.
Flexibilidade Arquitetural: A mesma API suporta integrações com Airflow, Prefect, sistemas customizados e orquestração interna da própria Erathos.
Referências
Documentação Oficial da API Erathos: https://docs.erathos.com/api
Documentação da API do dbt Cloud: https://docs.getdbt.com/dbt-cloud/api-v2
Erathos - Integração com dbt Cloud: https://docs.erathos.com/orchestration/dbt-cloud
Erathos - Variables e Secrets: https://docs.erathos.com/platform/variables-and-secrets
dbt Cloud - Webhooks (Outbound): https://docs.getdbt.com/docs/deploy/webhooks