Linhagem externa

A linhagem externa estende a linhagem nativa do Snowflake para incluir fontes de dados e destinos externos, assim você tem uma visibilidade dos fluxos de dados em todo o seu ecossistema de dados. Ela captura a linhagem de ferramentas ETL e bancos de dados de origem externos para criar uma exibição unificada da movimentação dos dados por seu pipeline.

OpenLineage é um padrão aberto para capturar e compartilhar informações de linhagem de dados por diversas ferramentas e plataformas de dados. O Snowflake aproveita essa estrutura aceitando eventos compatíveis com OpenLineage por meio de um ponto de extremidade REST. Ferramentas externas, como dbt e Apache Airflow, podem usar o ponto de extremidade para enviar metadados de linhagem ao Snowflake, que depois incorpora essas informações no gráfico de linhagem nativo exibido no Snowsight.

Ponto de extremidade REST da linhagem externa
/api/v2/lineage/external-lineage
Copy
URL base do Snowflake para pontos de extremidade REST
https://<account_identifier>.snowflakecomputing.com
Copy

Em que account-identifier é o identificador da sua conta Snowflake. Você pode usar o formato do nome ou do localizador da conta como identificador da sua conta.

Por exemplo, se o identificador da sua conta é myorg-dev_account, o URL base do ponto de extremidade da linhagem externa é: https://myorg-dev_account.snowflakecomputing.com

Fluxo de trabalho da linhagem externa

A implementação da linhagem externa para uma ferramenta de dados consiste nas seguintes tarefas:

  1. Conceder os privilégios necessários ao usuário que está se autenticando no ponto de extremidade da linhagem externa.

  2. Configurar sua ferramenta de dados para enviar eventos de OpenLineage ao ponto de extremidade REST do Snowflake.

  3. Escolher um método de autenticação que funcione com as APIs REST do Snowflake e, em seguida, configurar sua ferramenta de dados para usá-lo na autenticação de suas solicitações para o ponto de extremidade da linhagem externa.

  4. Use sua ferramenta de dados como de costume. Os eventos de OpenLineage são enviados ao Snowflake automaticamente e aparecem no gráfico da linhagem nativa no Snowsight.

Se quiser testar o ponto de extremidade da linhagem externa antes de configurar uma ferramenta de dados para emitir eventos de OpenLineage, consulte Enviar solicitações manuais para estabelecer a linhagem.

Visualizar sua linhagem de dados

Para visualizar a linhagem de dados no Snowsight, conclua as seguintes etapas:

  1. Faça login no Snowsight com o privilégios necessários.

  2. No menu de navegação, selecione Catalog » Database Explorer e, em seguida, selecione um objeto com suporte como uma tabela ou exibição.

  3. Selecione a guia Lineage.

Quando uma ferramenta de dados envia informações de linhagem ao Snowflake, os objetos externos aparecem no gráfico de linhagem do Snowsight e são rotulados como um nó externo. Por exemplo:

Gráfico de linhagem do Snowsight com objetos externos

Você pode selecionar um objeto externo ou a linha que conecta os objetos para obter informações adicionais, da mesma forma que na linhagem nativa.

Conceder privilégios do Snowflake

Depois que uma solicitação REST é autenticada, o Snowflake verifica se o usuário associado à solicitação tem autorização para usar a linhagem externa. O usuário associado à solicitação deve ter uma função que tenha recebido o privilégio INGEST LINEAGE na conta.

Por exemplo, suponha que você queira que as solicitações enviadas pelo usuário do serviço dbt_integration_user apareçam na linhagem do Snowsight. Como administrador, execute os seguintes comandos para criar uma função dedicada, conceder a ela o privilégio necessário e, em seguida, conceder a função ao usuário:

CREATE ROLE dbt_lineage_role;
GRANT INGEST LINEAGE ON ACCOUNT TO ROLE dbt_lineage_role;
GRANT ROLE dbt_lineage_role TO USER dbt_integration_user;
Copy

Configurar sua ferramenta de dados

Nota

Qualquer ferramenta de dados com uma integração de OpenLineage pode ser configurada para enviar dados de linhagem ao Snowflake. Para obter uma lista completa das ferramentas que têm uma integração, consulte Integrações de OpenLineage.

As seções a seguir apresentam instruções básicas para usar a linhagem externa com o dbt e o Apache AirFlow.

Configurar o dbt para enviar dados de linhagem ao Snowflake

Nota

A configuração do dbt para emitir eventos de OpenLineage não é uma exclusividade do Snowflake. A única coisa específica do Snowflake é o ponto de extremidade e o URL base da linhagem externa.

As etapas a seguir descrevem a configuração mínima necessária para definir seu ambiente dbt. Consulte a documentação sobre OpenLineage do dbt e a especificação de OpenLineage para configurar a integração entre OpenLineage e dbt.

  1. Instale a integração entre OpenLineage e dbt:

    pip3 install openlineage-dbt
    
    Copy
  2. Defina as variáveis de transporte para especificar o URL base, o ponto de extremidade e o token de segurança da linhagem externa.

    Por exemplo, se o identificador da sua conta é MYORG-DEV_ACCOUNT, defina o seguinte código no arquivo de configuração YAML:

    transport:
       type: http
       url: https://MYORG-DEV_ACCOUNT.snowflakecomputing.com
       endpoint: /api/v2/lineage/external-lineage
       auth:
          type: api_key
          apiKey: eyJ0eXAiOiJKV1QiLsecuritytoken...
       compression: gzip
    
    Copy
  3. Substitua os comandos dbt por dbt-ol. Por exemplo, altere o comando dbt run para dbt-ol run.

    Esses comandos dbt-ol são exigidos pela integração entre OpenLineage e dbt e não são exclusivos do Snowflake.

Para obter mais informações sobre as integrações entre OpenLineage e dbt, incluindo outros métodos de definição de variáveis, consulte a documentação sobre OpenLineage do dbt.

Configurar o Airflow para enviar dados de linhagem ao Snowflake

Nota

A configuração do Apache Airflow para emitir eventos de OpenLineage não é uma exclusividade do Snowflake. A única coisa específica do Snowflake é o ponto de extremidade e o URL base da linhagem externa.

As etapas a seguir descrevem a configuração mínima necessária para definir seu ambiente Airflow para a versão 2.7 ou superior, que é a versão preferida para OpenLineage. Consulte a documentação sobreOpenLineage do Airflow e a especificação de OpenLineage para configurar a integração entre OpenLineage e Airflow.

  1. Instale a integração de OpenLineage do Airflow para a versão 2.7 ou superior:

    pip install apache-airflow-providers-openlineage
    
    Copy

    Se você usa uma versão mais antiga do Airflow, instale o openlineage-airflow.

  2. Defina as variáveis de transporte para especificar o URL base, o ponto de extremidade e o token de segurança da linhagem externa.

    Por exemplo, se o identificador da sua conta é MYORG-DEV_ACCOUNT, defina o seguinte código no arquivo de configuração YAML:

    transport:
       type: http
       url: https://MYORG-DEV_ACCOUNT.snowflakecomputing.com
       endpoint: /api/v2/lineage/external-lineage
       auth:
          type: api_key
          apiKey: eyJ0eXAiOiJKV1QiLsecuritytoken...
       compression: gzip
    
    Copy

Para obter mais informações sobre as integrações entre OpenLineage e Airflow, incluindo outros métodos de definição de variáveis, consulte a documentação sobre OpenLineage do Airflow.

Escolher um método de autenticação

O Snowflake oferece vários métodos para autenticar solicitações para um ponto de extremidade REST do Snowflake, como aquele usado pela linhagem externa. Para obter uma lista completa dos métodos de autenticação, consulte Autenticando o Snowflake REST APIs com Snowflake.

Depois de selecionar seu método de autenticação preferido, você deverá gerar um token de segurança para um usuário específico. O token é usado para associar um usuário à solicitação REST para que o Snowflake possa autenticar o usuário e verificar se ele tem autorização para usar a linhagem externa.

Depois de associar com sucesso um usuário a um token de segurança no Snowflake, você precisará configurar sua ferramenta de dados para autenticar suas solicitações com esse token. Por exemplo, se você usa um arquivo de configuração YAML para definir as variáveis de transporte para OpenLineage, use o código a seguir para especificar o token de segurança que é enviado no cabeçalho da solicitação:

transport:
   auth:
      type: api_key
      apiKey: eyJ0eXAiOiJKV1QiLsecuritytoken...
Copy

Para outros métodos de especificação de token de segurança, consulte a documentação sobre OpenLineage da sua ferramenta de dados.

Enviar solicitações manuais para estabelecer a linhagem

A linhagem externa funciona aceitando cargas úteis JSON em conformidade com a especificação de OpenLineage para eventos COMPLETE. Quando integrada a uma ferramenta de dados, a ferramenta emite os eventos COMPLETE. No entanto, você também pode construir um evento COMPLETE e, em seguida, enviá-lo ao ponto de extremidade usando qualquer ferramenta ou linguagem que possa enviar solicitações POST a um ponto de extremidade.

Uma solicitação válida consiste no método, URL base e ponto de extremidade a seguir:

POST https://<account_identifier>.snowflakecomputing.com/api/v2/lineage/external-lineage
Copy

Em que account_identifier é o identificador da sua conta Snowflake.

O seguinte exemplo mostra como usar o curl para enviar informações de linhagem à linhagem externa:

curl -i -X POST \
 -H "Content-Type: application/json" \
 -H "Authorization: Bearer eyJ0eXAiOiJKV1QiLsecuritytoken..." \
 -H "Accept: application/json" \
 -H "User-Agent: myApplicationName/1.0" \
 -H "X-Snowflake-Authorization-Token-Type: KEYPAIR_JWT" \
 -d "@request_body.json" \
 "https://MYORG-DEV_ACCOUNT.snowflakecomputing.com/api/v2/lineage/external-lineage"
Copy

Em que request_body.json está em conformidade com a especificação de OpenLineage para eventos COMPLETE. Para obter mais informações sobre a carga útil JSON, consulte Requisitos de carga útil.

Autenticação e autorização de uma solicitação manual

A autenticação e a autorização de uma solicitação manual enviada ao ponto de extremidade da linhagem externa são as mesmas de uma solicitação enviada de uma ferramenta de dados.

  • O cabeçalho da solicitação deve incluir um token de segurança de uma das formas de autenticação compatíveis com os pontos de extremidade REST do Snowflake.

  • O usuário associado ao token de segurança deve ter os privilégios adequados.

Requisitos de carga útil

Quando você envia a carga útil JSON em uma solicitação manual para o ponto de extremidade da linhagem externa, a carga útil deve atender aos seguintes requisitos:

  • Estar em conformidade com a especificação de OpenLineage.

  • Ser um evento COMPLETE. Ou seja, a propriedade eventType deve ser COMPLETE. Outros tipos de eventos são ignorados.

  • As propriedades inputs e outputs devem ser uma combinação de objetos Snowflake e externos. Não é possível usar a linhagem externa para estabelecer uma linhagem entre dois objetos externos ou entre dois objetos Snowflake. Se ambas as propriedades especificarem o mesmo tipo de objeto (Snowflake ou externo), a solicitação retornará o código de status HTTP 404.

  • Incluir as seguintes propriedades:

    • inputs

    • outputs

    • eventType

    • eventTime

    • job

    Se preferir, inclua a propriedade run, que é útil na identificação do trabalho. A carga útil pode conter propriedades adicionais, mas o Snowflake as ignora.

Exemplo de carga útil mínima

O exemplo a seguir mostra uma carga útil mínima que você pode enviar ao ponto de extremidade da linhagem externa:

{
   "eventType": "COMPLETE",
   "eventTime": "2025-03-12T06:51:12.000Z",
   "job": {"namespace": "exampleNamespace", "name": "exampleJob"},
   "run": {"runId": "123e4567-e89b-12d3-a456-426614174000"},
   "producer": "https://github.com/OpenLineage/OpenLineage/blob/v1-0-0/client",
   "schemaURL": "https://openlineage.io/spec/0-0-1/OpenLineage.json",
   "inputs": [{"namespace": "snowflake://AXORG-AX_TEST_PP8", "name": "OL_TEST.OL_TEST_SCH.TEST_DEMO"}],
   "outputs": [{"namespace": "postgres://localhost:5432", "name": "PDB.SCH.OUTPUT"}]
}
Copy

Especificando os tipos de objeto

Na matriz outputs da carga útil, você pode usar o campo facets para especificar o tipo do objeto, que pode ser qualquer cadeia de caracteres definida pelo usuário. Por exemplo, o seguinte trecho da carga útil especifica que o objeto é do tipo VIEW:

"outputs": [
    {
        "namespace": "postgres://db.company.com:5432",
        "name": "db.schema.view",
        "facets": {"datasetType": {"datasetType": "VIEW"}},
    },
],
Copy

Se você não especificar um campo facets, o tipo de objeto será definido como o padrão External Node.

Especificando várias entradas

Se uma carga útil incluir mais de uma entrada, a linhagem resultante mostrará a saída como um objeto downstream de ambas as entradas. Por exemplo, se uma carga útil tiver uma entrada A e B junto com uma saída C, a linhagem mostrará tanto A-C quanto B-C.

Enviar solicitações para remover a linhagem

Você pode enviar uma solicitação DELETE ao ponto de extremidade da linhagem externa para remover a linhagem estabelecida entre um objeto Snowflake e um objeto externo.

  • Para separar a linhagem entre o objeto de origem e o objeto de destino, use parâmetros de consulta URL para especificar os detalhes sobre os dois objetos.

  • Para separar a linhagem entre um objeto e todos os respectivos objetos downstream, especifique o objeto de origem sem especificar um objeto de destino.

  • Para remover um objeto de destino do gráfico de linhagem, independentemente de quantos objetos estejam acima dele, especifique o objeto de destino sem especificar um objeto de origem.

Uma solicitação válida para remover a linhagem consiste no método, no URL base e no ponto de extremidade a seguir:

DELETE https://<account_identifier>.snowflakecomputing.com/api/v2/lineage/external-lineage
Copy

Parâmetro de consulta

Descrição

sourceNamespace={namespace}

Namespace do conjunto de dados de origem.

sourceName={FQN}

Nome totalmente qualificado do conjunto de dados de origem.

sourceDatasetType={dataset type}

Tipo do conjunto de dados de origem (por exemplo, TABLE, VIEW, DATASET). Por padrão, o valor deve ser o nó externo. Se você inseriu um valor no campo facets da carga útil quando enviou uma solicitação para estabelecer a linhagem, especifique o valor enviado na carga útil, e não o nó externo.

targetNamespace={namespace}

Namespace do conjunto de dados de destino.

targetName={FQN}

Nome totalmente qualificado do conjunto de dados de destino.

targetDatasetType={dataset type}

Tipo do conjunto de dados de destino (por exemplo, TABLE, VIEW, DATASET). Por padrão, o valor deve ser o nó externo. Se você inseriu um valor no campo facets da carga útil quando enviou uma solicitação para estabelecer a linhagem, especifique o valor enviado na carga útil, e não o nó externo.

Controle de acesso para remoção de linhagem

O usuário que envia uma solicitação para remover a linhagem entre objetos deve ter o privilégio DELETE LINEAGE na conta.

Limitações e considerações

  • Um objeto Snowflake deve ser INPUT ou OUTPUT de um evento COMPLETE. Ou seja, a linhagem externa não ingere eventos de linhagem quando nem os dados de entrada nem os dados de saída são um objeto Snowflake.

  • O Snowflake não oferece suporte a OpenLineage versão 2.

  • O período de retenção para eventos de linhagem externa é de um ano.

  • O Snowflake reconhece apenas eventos de linhagem COMPLETE. Todos os outros eventos emitidos por uma ferramenta de dados são ignorados.

  • A linhagem de fontes externas não aparece na saída da função GET_LINEAGE.

  • A linhagem externa não oferece suporte à linhagem de colunas.

  • O nome totalmente qualificado de um conjunto de dados, ou seja, a entrada ou a saída, não pode exceder 1.000 caracteres.

  • Não é possível armazenar mais de 10.000 eventos na mesma conta. Se atingir esse limite, você terá que excluir eventos antes de adicionar novos.