From 0963eac48e14f52cc00c600ccc4178775d680657 Mon Sep 17 00:00:00 2001 From: Pere Miquel Brull Date: Sat, 10 Dec 2022 19:54:41 +0100 Subject: [PATCH] Fix #9182 - Airflow Lineage Operator & Airflow lineage state (#9206) --- .../airflow/dags/airflow_lineage_operator.py | 118 ++++++ .../airflow_provider_openmetadata/README.md | 67 ++++ .../airflow_provider_openmetadata/__init__.py | 11 +- .../hooks/__init__.py | 0 .../hooks/openmetadata.py | 99 +++++ .../lineage/{openmetadata.py => backend.py} | 28 +- .../lineage/callback.py | 32 +- .../lineage/config/loader.py | 8 + .../lineage/operator.py | 73 ++++ .../lineage/runner.py | 376 ++++++++++++++++++ .../lineage/utils.py | 282 +------------ .../provider.yaml | 9 + .../ingestion/ometa/mixins/lineage_mixin.py | 14 + .../lineage/airflow/test_airflow_lineage.py | 4 +- .../pipeline/airflow/lineage-backend.md | 103 ++--- .../pipeline/airflow/lineage-operator.md | 213 ++++++++++ .../deployment/upgrade/versions/012-to-013.md | 11 +- openmetadata-docs/content/menu.md | 2 + .../connectors/airflow/airflow-connection.png | Bin 0 -> 180752 bytes 19 files changed, 1066 insertions(+), 384 deletions(-) create mode 100644 ingestion/examples/airflow/dags/airflow_lineage_operator.py create mode 100644 ingestion/src/airflow_provider_openmetadata/README.md create mode 100644 ingestion/src/airflow_provider_openmetadata/hooks/__init__.py create mode 100644 ingestion/src/airflow_provider_openmetadata/hooks/openmetadata.py rename ingestion/src/airflow_provider_openmetadata/lineage/{openmetadata.py => backend.py} (80%) create mode 100644 ingestion/src/airflow_provider_openmetadata/lineage/operator.py create mode 100644 ingestion/src/airflow_provider_openmetadata/lineage/runner.py create mode 100644 openmetadata-docs/content/connectors/pipeline/airflow/lineage-operator.md create mode 100644 openmetadata-docs/images/openmetadata/connectors/airflow/airflow-connection.png diff --git a/ingestion/examples/airflow/dags/airflow_lineage_operator.py b/ingestion/examples/airflow/dags/airflow_lineage_operator.py new file mode 100644 index 00000000000..dfae8f4a2d2 --- /dev/null +++ b/ingestion/examples/airflow/dags/airflow_lineage_operator.py @@ -0,0 +1,118 @@ +# Copyright 2021 Collate +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" +You can run this DAG from the default OM installation +""" + +from datetime import datetime, timedelta +from textwrap import dedent + +# The DAG object; we'll need this to instantiate a DAG +from airflow import DAG + +# Operators; we need this to operate! +from airflow.operators.bash import BashOperator +from airflow.operators.python import PythonOperator + +# These args will get passed on to each operator +# You can override them on a per-task basis during operator initialization +from airflow_provider_openmetadata.lineage.operator import OpenMetadataLineageOperator +from metadata.generated.schema.entity.services.connections.metadata.openMetadataConnection import ( + OpenMetadataConnection, +) +from metadata.generated.schema.security.client.openMetadataJWTClientConfig import ( + OpenMetadataJWTClientConfig, +) + +default_args = { + "retries": 1, + "retry_delay": timedelta(minutes=5), +} + + +def explode(): + raise Exception("Oh no!") + + +with DAG( + "lineage_tutorial_operator", + default_args=default_args, + description="A simple tutorial DAG", + schedule_interval=timedelta(days=1), + start_date=datetime(2021, 1, 1), + catchup=False, + tags=["example"], +) as dag: + + # t1, t2 and t3 are examples of tasks created by instantiating operators + t1 = BashOperator( + task_id="print_date", + bash_command="date", + outlets={"tables": ["sample_data.ecommerce_db.shopify.dim_address"]}, + ) + + t2 = BashOperator( + task_id="sleep", + depends_on_past=False, + bash_command="sleep 1", + retries=3, + inlets={"tables": ["sample_data.ecommerce_db.shopify.dim_customer"]}, + ) + + risen = PythonOperator( + task_id="explode", + provide_context=True, + python_callable=explode, + retries=0, + ) + + dag.doc_md = ( + __doc__ # providing that you have a docstring at the beginning of the DAG + ) + dag.doc_md = """ + This is a documentation placed anywhere + """ # otherwise, type it like this + templated_command = dedent( + """ + {% for i in range(5) %} + echo "{{ ds }}" + echo "{{ macros.ds_add(ds, 7)}}" + echo "{{ params.my_param }}" + {% endfor %} + """ + ) + + t3 = BashOperator( + task_id="templated", + depends_on_past=False, + bash_command=templated_command, + params={"my_param": "Parameter I passed in"}, + ) + + t1 >> [t2, t3] + + server_config = OpenMetadataConnection( + hostPort="http://localhost:8585/api", + authProvider="openmetadata", + securityConfig=OpenMetadataJWTClientConfig( + jwtToken="eyJraWQiOiJHYjM4OWEtOWY3Ni1nZGpzLWE5MmotMDI0MmJrOTQzNTYiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsImlzQm90IjpmYWxzZSwiaXNzIjoib3Blbi1tZXRhZGF0YS5vcmciLCJpYXQiOjE2NjM5Mzg0NjIsImVtYWlsIjoiYWRtaW5Ab3Blbm1ldGFkYXRhLm9yZyJ9.tS8um_5DKu7HgzGBzS1VTA5uUjKWOCU0B_j08WXBiEC0mr0zNREkqVfwFDD-d24HlNEbrqioLsBuFRiwIWKc1m_ZlVQbG7P36RUxhuv2vbSp80FKyNM-Tj93FDzq91jsyNmsQhyNv_fNr3TXfzzSPjHt8Go0FMMP66weoKMgW2PbXlhVKwEuXUHyakLLzewm9UMeQaEiRzhiTMU3UkLXcKbYEJJvfNFcLwSl9W8JCO_l0Yj3ud-qt_nQYEZwqW6u5nfdQllN133iikV4fM5QZsMCnm8Rq1mvLR0y9bmJiD7fwM1tmJ791TUWqmKaTnP49U493VanKpUAfzIiOiIbhg" + ), + ) + + t4 = OpenMetadataLineageOperator( + task_id="lineage_op", + depends_on_past=False, + server_config=server_config, + service_name="airflow_lineage_op_service", + only_keep_dag_lineage=True, + ) + + t1 >> t4 diff --git a/ingestion/src/airflow_provider_openmetadata/README.md b/ingestion/src/airflow_provider_openmetadata/README.md new file mode 100644 index 00000000000..bbe0e7578b1 --- /dev/null +++ b/ingestion/src/airflow_provider_openmetadata/README.md @@ -0,0 +1,67 @@ +# OpenMetadata Airflow Provider + +This package brings: +- Lineage Backend +- Lineage Operator +- OpenMetadata Hook + +Note that this is configured as an entrypoint in the `setup.py`: + +```python +entry_points={ + "apache_airflow_provider": [ + "provider_info = airflow_provider_openmetadata:get_provider_config" + ], +}, +``` + +Therefore, any metadata changes that should be discoverable by Airflow need to be passed in `get_provider_config`. + +More information about that on Airflow's [docs](https://airflow.apache.org/docs/apache-airflow-providers/index.html?utm_cta=website-events-featured-summit#creating-your-own-providers). + +## How to use the OpenMetadataHook + +In the Airflow UI you can create a new OpenMetadata connection. + +Then, load it as follows: + +```python +from airflow_provider_openmetadata.hooks.openmetadata import OpenMetadataHook + +openmetadata_hook = OpenMetadataHook(openmetadata_conn_id="om_id") # The ID you provided +server_config = openmetadata_hook.get_conn() +``` + +## How to use the OpenMetadataLineageOperator + +```python +from airflow_provider_openmetadata.lineage.operator import OpenMetadataLineageOperator + +OpenMetadataLineageOperator( + task_id='lineage_op', + depends_on_past=False, + server_config=server_config, + service_name="your-airflow-service", + only_keep_dag_lineage=True, +) +``` + +You can get the `server_config` variable using the `OpenMetadataHook` as shown above, or create it +directly: + +```python +from metadata.generated.schema.entity.services.connections.metadata.openMetadataConnection import ( + OpenMetadataConnection, +) +from metadata.generated.schema.security.client.openMetadataJWTClientConfig import ( + OpenMetadataJWTClientConfig, +) + +server_config = OpenMetadataConnection( + hostPort="http://localhost:8585/api", + authProvider="openmetadata", + securityConfig=OpenMetadataJWTClientConfig( + jwtToken="" + ), +) +``` diff --git a/ingestion/src/airflow_provider_openmetadata/__init__.py b/ingestion/src/airflow_provider_openmetadata/__init__.py index 768579e0d91..bf670a6845a 100644 --- a/ingestion/src/airflow_provider_openmetadata/__init__.py +++ b/ingestion/src/airflow_provider_openmetadata/__init__.py @@ -22,7 +22,16 @@ def get_provider_config(): """ return { "name": "OpenMetadata", - "description": "OpenMetadata ", + "description": "`OpenMetadata `__", "package-name": "openmetadata-ingestion", "version": "0.4.1", + "connection-types": [ + { + "connection-type": "openmetadata", + "hook-class-name": "airflow_provider_openmetadata.hooks.openmetadata.OpenMetadataHook", + } + ], + "hook-class-names": [ + "airflow_provider_openmetadata.hooks.openmetadata.OpenMetadataHook", + ], } diff --git a/ingestion/src/airflow_provider_openmetadata/hooks/__init__.py b/ingestion/src/airflow_provider_openmetadata/hooks/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/ingestion/src/airflow_provider_openmetadata/hooks/openmetadata.py b/ingestion/src/airflow_provider_openmetadata/hooks/openmetadata.py new file mode 100644 index 00000000000..7d167864589 --- /dev/null +++ b/ingestion/src/airflow_provider_openmetadata/hooks/openmetadata.py @@ -0,0 +1,99 @@ +# Copyright 2021 Collate +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" +This hook allows storing the connection to +an OpenMetadata server and use it for your +operators. +""" +from typing import Any + +from airflow.hooks.base import BaseHook +from airflow.models import Connection + +from metadata.generated.schema.entity.services.connections.metadata.openMetadataConnection import ( + AuthProvider, + OpenMetadataConnection, + VerifySSL, +) +from metadata.generated.schema.security.client.openMetadataJWTClientConfig import ( + OpenMetadataJWTClientConfig, +) +from metadata.generated.schema.security.ssl.validateSSLClientConfig import ( + ValidateSSLClientConfig, +) +from metadata.ingestion.ometa.ometa_api import OpenMetadata + + +class OpenMetadataHook(BaseHook): + """ + Airflow hook to store and use an `OpenMetadataConnection` + """ + + conn_name_attr: str = "openmetadata_conn_id" + default_conn_name = "openmetadata_default" + conn_type = "openmetadata" + hook_name = "OpenMetadata" + + def __init__(self, openmetadata_conn_id: str = default_conn_name) -> None: + super().__init__() + self.openmetadata_conn_id = openmetadata_conn_id + # Add defaults + self.default_schema = "http" + self.default_port = 8585 + self.default_verify_ssl = VerifySSL.no_ssl + self.default_ssl_config = None + + def get_conn(self) -> OpenMetadataConnection: + + conn: Connection = self.get_connection(self.openmetadata_conn_id) + jwt_token = conn.get_password() + if not jwt_token: + raise ValueError("JWT Token should be informed.") + + if not conn.host: + raise ValueError("Host should be informed.") + + port = conn.port if conn.port else self.default_port + schema = conn.schema if conn.schema else self.default_schema + + extra = conn.extra_dejson if conn.get_extra() else {} + verify_ssl = extra.get("verifySSL") or self.default_verify_ssl + ssl_config = ( + ValidateSSLClientConfig(certificatePath=extra["sslConfig"]) + if extra.get("sslConfig") + else self.default_ssl_config + ) + + om_conn = OpenMetadataConnection( + hostPort=f"{schema}://{conn.host}:{port}/api", + authProvider=AuthProvider.openmetadata, + securityConfig=OpenMetadataJWTClientConfig(jwtToken=jwt_token), + verifySSL=verify_ssl, + sslConfig=ssl_config, + ) + + return om_conn + + def test_connection(self): + """Test that we can instantiate the ometa client with the given connection""" + try: + OpenMetadata(self.get_conn()) + return True, "Connection successful" + except Exception as err: + return False, str(err) + + @staticmethod + def get_ui_field_behaviour() -> dict[str, Any]: + """Returns custom field behaviour""" + return { + "hidden_fields": ["login"], + "relabeling": {"password": "JWT Token"}, + } diff --git a/ingestion/src/airflow_provider_openmetadata/lineage/openmetadata.py b/ingestion/src/airflow_provider_openmetadata/lineage/backend.py similarity index 80% rename from ingestion/src/airflow_provider_openmetadata/lineage/openmetadata.py rename to ingestion/src/airflow_provider_openmetadata/lineage/backend.py index d2f65f2fa04..83871e6c579 100644 --- a/ingestion/src/airflow_provider_openmetadata/lineage/openmetadata.py +++ b/ingestion/src/airflow_provider_openmetadata/lineage/backend.py @@ -14,7 +14,7 @@ OpenMetadata Airflow Lineage Backend """ import traceback -from typing import TYPE_CHECKING, Dict, List, Optional +from typing import Dict, List, Optional from airflow.lineage.backend import LineageBackend @@ -22,12 +22,9 @@ from airflow_provider_openmetadata.lineage.config.loader import ( AirflowLineageConfig, get_lineage_config, ) -from airflow_provider_openmetadata.lineage.utils import get_xlets, parse_lineage +from airflow_provider_openmetadata.lineage.runner import AirflowLineageRunner from metadata.ingestion.ometa.ometa_api import OpenMetadata -if TYPE_CHECKING: - from airflow.models.baseoperator import BaseOperator - # pylint: disable=too-few-public-methods class OpenMetadataLineageBackend(LineageBackend): @@ -50,16 +47,9 @@ class OpenMetadataLineageBackend(LineageBackend): only if you are using google as SSO """ - def __init__(self) -> None: - """ - Instantiate a superclass object and run lineage config function - """ - super().__init__() - _ = get_lineage_config() - # pylint: disable=protected-access - @staticmethod # needed for Airflow 1.10.x def send_lineage( + self, operator: "BaseOperator", inlets: Optional[List] = None, outlets: Optional[List] = None, @@ -81,10 +71,16 @@ class OpenMetadataLineageBackend(LineageBackend): config: AirflowLineageConfig = get_lineage_config() metadata = OpenMetadata(config.metadata_config) - op_inlets = get_xlets(operator, "_inlets") - op_outlets = get_xlets(operator, "_outlets") + runner = AirflowLineageRunner( + metadata=metadata, + service_name=config.airflow_service_name, + dag=context["dag"], + context=context, + only_keep_dag_lineage=config.only_keep_dag_lineage, + max_status=config.max_status, + ) + runner.execute() - parse_lineage(config, context, operator, op_inlets, op_outlets, metadata) except Exception as exc: # pylint: disable=broad-except operator.log.error(traceback.format_exc()) operator.log.error(exc) diff --git a/ingestion/src/airflow_provider_openmetadata/lineage/callback.py b/ingestion/src/airflow_provider_openmetadata/lineage/callback.py index e12abbf4ea6..6c59d436dd3 100644 --- a/ingestion/src/airflow_provider_openmetadata/lineage/callback.py +++ b/ingestion/src/airflow_provider_openmetadata/lineage/callback.py @@ -43,23 +43,29 @@ def failure_callback(context: Dict[str, str]) -> None: metadata = OpenMetadata(config.metadata_config) operator: "BaseOperator" = context["task"] + dag: "DAG" = context["dag"] - operator.log.info("Parsing lineage & pipeline status on failure...") + operator.log.info("Updating pipeline status on error...") - op_inlets = get_xlets(operator, "_inlets") - op_outlets = get_xlets(operator, "_outlets") - - # Get the pipeline created or updated during the lineage - pipeline = parse_lineage( - config, context, operator, op_inlets, op_outlets, metadata + airflow_service_entity: PipelineService = metadata.get_by_name( + entity=PipelineService, fqn=config.airflow_service_name + ) + pipeline: Pipeline = metadata.get_by_name( + entity=Pipeline, + fqn=f"{airflow_service_entity.name.__root__}.{dag.dag_id}", ) - add_status( - operator=operator, - pipeline=pipeline, - metadata=metadata, - context=context, - ) + if pipeline: + add_status( + operator=operator, + pipeline=pipeline, + metadata=metadata, + context=context, + ) + else: + logging.warning( + f"Pipeline {airflow_service_entity.name.__root__}.{dag.dag_id} not found. Skipping status update." + ) except Exception as exc: # pylint: disable=broad-except logging.error(traceback.format_exc()) diff --git a/ingestion/src/airflow_provider_openmetadata/lineage/config/loader.py b/ingestion/src/airflow_provider_openmetadata/lineage/config/loader.py index d5e8d786dcd..35866660a80 100644 --- a/ingestion/src/airflow_provider_openmetadata/lineage/config/loader.py +++ b/ingestion/src/airflow_provider_openmetadata/lineage/config/loader.py @@ -32,6 +32,8 @@ from metadata.generated.schema.entity.services.connections.metadata.openMetadata class AirflowLineageConfig(BaseModel): airflow_service_name: str metadata_config: OpenMetadataConnection + only_keep_dag_lineage: bool = False + max_status: int = 10 def parse_airflow_config( @@ -59,6 +61,12 @@ def parse_airflow_config( return AirflowLineageConfig( airflow_service_name=airflow_service_name, + # Check if value is a literal string `true` + only_keep_dag_lineage=conf.get( + LINEAGE, "only_keep_dag_lineage", fallback="false" + ) + == "true", + max_status=int(conf.get(LINEAGE, "max_status", fallback=10)), metadata_config=OpenMetadataConnection( hostPort=conf.get( LINEAGE, diff --git a/ingestion/src/airflow_provider_openmetadata/lineage/operator.py b/ingestion/src/airflow_provider_openmetadata/lineage/operator.py new file mode 100644 index 00000000000..ebf7b3ddd6e --- /dev/null +++ b/ingestion/src/airflow_provider_openmetadata/lineage/operator.py @@ -0,0 +1,73 @@ +# Copyright 2021 Collate +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +""" +OpenMetadata Airflow Lineage Operator +""" +import traceback + +from airflow.models.baseoperator import BaseOperator +from airflow.utils.context import Context + +from airflow_provider_openmetadata.lineage.runner import AirflowLineageRunner +from metadata.generated.schema.entity.services.connections.metadata.openMetadataConnection import ( + OpenMetadataConnection, +) +from metadata.ingestion.ometa.ometa_api import OpenMetadata + + +class OpenMetadataLineageOperator(BaseOperator): + """ + This Operator will check the inlets and outlets of its DAG + and push the lineage to OpenMetadata. + + It requires the OpenMetadataConnection to be passed as + an argument to instantiate the ometa client. + + if `only_keep_dag` is True, we will remove any lineage related + to the DAG that is not part of the inlets/outlets of its tasks. + """ + + def __init__( + self, + server_config: OpenMetadataConnection, + service_name: str, + only_keep_dag_lineage: bool = False, + max_status: int = 10, + **kwargs, + ) -> None: + super().__init__(**kwargs) + self.server_config = server_config + self.service_name = service_name + self.only_keep_dag_lineage = only_keep_dag_lineage + self.max_status = max_status + + def execute(self, context: Context) -> None: + """ + Main logic to check the context for lineage + and push it to OpenMetadata using the Python Client. + """ + try: + metadata = OpenMetadata(self.server_config) + runner = AirflowLineageRunner( + metadata=metadata, + service_name=self.service_name, + dag=self.dag, + context=context, + only_keep_dag_lineage=self.only_keep_dag_lineage, + max_status=self.max_status, + ) + + runner.execute() + except Exception as err: + self.dag.log.info(traceback.format_exc()) + self.dag.log.error(f"Error executing the lineage runner - {err}") + raise err diff --git a/ingestion/src/airflow_provider_openmetadata/lineage/runner.py b/ingestion/src/airflow_provider_openmetadata/lineage/runner.py new file mode 100644 index 00000000000..ec693a8d632 --- /dev/null +++ b/ingestion/src/airflow_provider_openmetadata/lineage/runner.py @@ -0,0 +1,376 @@ +# Copyright 2021 Collate +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +""" +OpenMetadata Airflow Provider Lineage Runner +""" +from itertools import groupby +from typing import List, Set + +from airflow.configuration import conf +from pydantic import BaseModel + +from airflow_provider_openmetadata.lineage.utils import STATUS_MAP, get_xlets +from metadata.generated.schema.api.data.createPipeline import CreatePipelineRequest +from metadata.generated.schema.api.lineage.addLineage import AddLineageRequest +from metadata.generated.schema.api.services.createPipelineService import ( + CreatePipelineServiceRequest, +) +from metadata.generated.schema.entity.data.pipeline import ( + Pipeline, + PipelineStatus, + StatusType, + Task, + TaskStatus, +) +from metadata.generated.schema.entity.data.table import Table +from metadata.generated.schema.entity.services.connections.pipeline.airflowConnection import ( + AirflowConnection, +) +from metadata.generated.schema.entity.services.connections.pipeline.backendConnection import ( + BackendConnection, +) +from metadata.generated.schema.entity.services.pipelineService import ( + PipelineConnection, + PipelineService, + PipelineServiceType, +) +from metadata.generated.schema.type.basic import Uuid +from metadata.generated.schema.type.entityLineage import EntitiesEdge +from metadata.generated.schema.type.entityReference import EntityReference +from metadata.ingestion.ometa.ometa_api import OpenMetadata +from metadata.utils.helpers import datetime_to_ts + + +class XLets(BaseModel): + """ + Group inlets and outlets from all tasks in a DAG + """ + + inlets: Set[str] + outlets: Set[str] + + +class SimpleEdge(BaseModel): + """ + Simple Edge representation with FQN and id + """ + + fqn: str + id: str + + +class AirflowLineageRunner: + """ + Given the OpenMetadata connection, a service name and a DAG: + + 1. Create the Pipeline Service (if not exists) + 2. Create or update the Pipeline (DAG + tasks) + 3. Add the task status (Task Instances). We'll pick this up from the available information. + This operator should run the last to have the complete view. + 4. Add Pipeline Lineage from xlets + + This Runner will be called either from: + 1. Lineage Backend + 2. Lineage Operator + In both cases, this will run directly on an Airflow instance. Therefore, + we'll use the airflow config data to populate entities' details. + """ + + def __init__( + self, + metadata: OpenMetadata, + service_name: str, + dag: "DAG", + context: "Context", + only_keep_dag_lineage: bool = False, + max_status: int = 10, + ): + self.metadata = metadata + self.service_name = service_name + self.only_keep_dag_lineage = only_keep_dag_lineage + self.max_status = max_status + + self.dag = dag + self.context = context + + def get_or_create_pipeline_service(self) -> PipelineService: + """ + Fetch the Pipeline Service from OM. If it does not exist, + create it. + """ + service_entity: PipelineService = self.metadata.get_by_name( + entity=PipelineService, fqn=self.service_name + ) + + if service_entity: + return service_entity + + else: + pipeline_service: PipelineService = self.metadata.create_or_update( + CreatePipelineServiceRequest( + name=self.service_name, + serviceType=PipelineServiceType.Airflow, + connection=PipelineConnection( + config=AirflowConnection( + hostPort=conf.get("webserver", "base_url"), + connection=BackendConnection(), + ), + ), + ) + ) + + if pipeline_service is None: + raise RuntimeError("Failed to create Airflow service.") + + return pipeline_service + + def get_task_url(self, task: "Operator"): + return f"/taskinstance/list/?flt1_dag_id_equals={self.dag.dag_id}&_flt_3_task_id={task.task_id}" + + def get_om_tasks(self) -> List[Task]: + """ + Get all tasks from the DAG and map them to + OpenMetadata Task Entities + """ + return [ + Task( + name=task.task_id, + taskUrl=self.get_task_url(task), + taskType=task.task_type, + startDate=task.start_date.isoformat() if task.start_date else None, + endDate=task.end_date.isoformat() if task.end_date else None, + downstreamTasks=list(task.downstream_task_ids) + if task.downstream_task_ids + else None, + ) + for task in self.dag.tasks or [] + ] + + def create_pipeline_entity(self, pipeline_service: PipelineService) -> Pipeline: + """ + Create the Pipeline Entity + """ + self.dag.log.info("Creating or updating Pipeline Entity from DAG...") + pipeline_request = CreatePipelineRequest( + name=self.dag.dag_id, + description=self.dag.description, + pipelineUrl=f"/tree?dag_id={self.dag.dag_id}", + concurrency=self.dag.max_active_tasks, + pipelineLocation=self.dag.fileloc, + startDate=self.dag.start_date.isoformat() if self.dag.start_date else None, + tasks=self.get_om_tasks(), + service=EntityReference( + id=pipeline_service.id, + type="pipelineService", + ), + ) + + return self.metadata.create_or_update(pipeline_request) + + def get_all_pipeline_status(self) -> List[PipelineStatus]: + """ + Iterate over the DAG's task instances and map + them to PipelineStatus + """ + + # This list is already ordered by Execution Date + grouped_ti: List[List["TaskInstance"]] = [ + list(value) + for _, value in groupby( + self.dag.get_task_instances(), key=lambda ti: ti.run_id + ) + ] + # Order descending by execution date + grouped_ti.reverse() + + return [ + self.get_pipeline_status(task_instances) + for task_instances in grouped_ti[: self.max_status] + ] + + @staticmethod + def get_dag_status_from_task_instances(task_instances: List["TaskInstance"]) -> str: + """ + If any task is in pending state, then return pending. + If any task is in failed state, return failed. + Otherwise, return Success. + """ + task_statuses = [ + STATUS_MAP.get(task_instance.state, StatusType.Pending.value) + for task_instance in task_instances + ] + if any(status == StatusType.Pending.value for status in task_statuses): + return StatusType.Pending.value + if any(status == StatusType.Failed.value for status in task_statuses): + return StatusType.Failed.value + + return StatusType.Successful.value + + def get_pipeline_status( + self, task_instances: List["TaskInstance"] + ) -> PipelineStatus: + """ + Given the task instances for a run, prep the PipelineStatus + """ + + task_status = [ + TaskStatus( + name=task_instance.task_id, + executionStatus=STATUS_MAP.get( + task_instance.state, StatusType.Pending.value + ), + startTime=datetime_to_ts(task_instance.start_date), + endTime=datetime_to_ts(task_instance.end_date), + logLink=task_instance.log_url, + ) + for task_instance in task_instances + ] + return PipelineStatus( + # Use any of the task execution dates for the status execution date + timestamp=datetime_to_ts(task_instances[0].execution_date), + executionStatus=self.get_dag_status_from_task_instances(task_instances), + taskStatus=task_status, + ) + + def add_all_pipeline_status(self, pipeline: Pipeline) -> None: + """ + Get the latest Pipeline Status from the DAG and send + it to OM + """ + pipeline_status_list = self.get_all_pipeline_status() + + for status in pipeline_status_list: + self.metadata.add_pipeline_status( + fqn=pipeline.fullyQualifiedName.__root__, status=status + ) + + def get_xlets(self) -> XLets: + """ + Fill the inlets and outlets of the Pipeline by iterating + over all its tasks + """ + _inlets = set() + _outlets = set() + + for task in self.dag.tasks: + _inlets.update(get_xlets(operator=task, xlet_mode="_inlets") or []) + _outlets.update(get_xlets(operator=task, xlet_mode="_outlets") or []) + + return XLets(inlets=_inlets, outlets=_outlets) + + def add_lineage(self, pipeline: Pipeline, xlets: XLets) -> None: + """ + Add the lineage from inlets and outlets + """ + + for table_fqn in xlets.inlets or []: + table_entity = self.metadata.get_by_name(entity=Table, fqn=table_fqn) + try: + lineage = AddLineageRequest( + edge=EntitiesEdge( + fromEntity=EntityReference(id=table_entity.id, type="table"), + toEntity=EntityReference(id=pipeline.id, type="pipeline"), + ) + ) + self.metadata.add_lineage(lineage) + except AttributeError as err: + self.dag.log.error( + f"Error trying to access Entity data due to: {err}." + f" Is the table [{table_fqn}] present in OpenMetadata?" + ) + + for table_fqn in xlets.outlets or []: + table_entity = self.metadata.get_by_name(entity=Table, fqn=table_fqn) + try: + lineage = AddLineageRequest( + edge=EntitiesEdge( + fromEntity=EntityReference(id=pipeline.id, type="pipeline"), + toEntity=EntityReference(id=table_entity.id, type="table"), + ) + ) + self.metadata.add_lineage(lineage) + except AttributeError as err: + self.dag.log.error( + f"Error trying to access Entity data due to: {err}." + f" Is the table [{table_fqn}] present in OpenMetadata?" + ) + + def clean_lineage(self, pipeline: Pipeline, xlets: XLets): + """ + Clean the lineage nodes that are not part of xlets. + + We'll only clean up table nodes + """ + lineage_data = self.metadata.get_lineage_by_name( + entity=Pipeline, + fqn=pipeline.fullyQualifiedName.__root__, + up_depth=1, + down_depth=1, + ) + + upstream_edges = [ + next( + ( + SimpleEdge(fqn=node["fullyQualifiedName"], id=node["id"]) + for node in lineage_data.get("nodes") or [] + if node["id"] == upstream_edge["fromEntity"] + and node["type"] == "table" + ) + ) + for upstream_edge in lineage_data.get("upstreamEdges") or [] + ] + downstream_edges = [ + next( + ( + SimpleEdge(fqn=node["fullyQualifiedName"], id=node["id"]) + for node in lineage_data.get("nodes") or [] + if node["id"] == downstream_edge["toEntity"] + and node["type"] == "table" + ) + ) + for downstream_edge in lineage_data.get("downstreamEdges") or [] + ] + + for edge in upstream_edges: + if edge.fqn not in xlets.inlets: + self.dag.log.info(f"Removing upstream edge with {edge.fqn}") + edge_to_remove = EntitiesEdge( + fromEntity=EntityReference(id=edge.id, type="table"), + toEntity=EntityReference(id=pipeline.id, type="pipeline"), + ) + self.metadata.delete_lineage_edge(edge=edge_to_remove) + + for edge in downstream_edges: + if edge.fqn not in xlets.outlets: + self.dag.log.info(f"Removing downstream edge with {edge.fqn}") + edge_to_remove = EntitiesEdge( + fromEntity=EntityReference(id=pipeline.id, type="pipeline"), + toEntity=EntityReference(id=edge.id, type="table"), + ) + self.metadata.delete_lineage_edge(edge=edge_to_remove) + + def execute(self): + """ + Run the whole ingestion logic + """ + self.dag.log.info("Executing Airflow Lineage Runner...") + pipeline_service = self.get_or_create_pipeline_service() + pipeline = self.create_pipeline_entity(pipeline_service) + self.add_all_pipeline_status(pipeline) + + xlets = self.get_xlets() + self.add_lineage(pipeline, xlets) + if self.only_keep_dag_lineage: + self.dag.log.info( + "`only_keep_dag_lineage` is set to True. Cleaning lineage not in inlets or outlets..." + ) + self.clean_lineage(pipeline, xlets) diff --git a/ingestion/src/airflow_provider_openmetadata/lineage/utils.py b/ingestion/src/airflow_provider_openmetadata/lineage/utils.py index 8ee5127c988..858196c1146 100644 --- a/ingestion/src/airflow_provider_openmetadata/lineage/utils.py +++ b/ingestion/src/airflow_provider_openmetadata/lineage/utils.py @@ -10,41 +10,17 @@ # limitations under the License. """ -OpenMetadata Airflow Lineage Backend +OpenMetadata Airflow Provider utilities """ -import traceback from typing import TYPE_CHECKING, Dict, List, Optional -from airflow.configuration import conf - -from airflow_provider_openmetadata.lineage.config.loader import AirflowLineageConfig -from metadata.generated.schema.api.data.createPipeline import CreatePipelineRequest -from metadata.generated.schema.api.lineage.addLineage import AddLineageRequest -from metadata.generated.schema.api.services.createPipelineService import ( - CreatePipelineServiceRequest, -) from metadata.generated.schema.entity.data.pipeline import ( Pipeline, PipelineStatus, StatusType, - Task, TaskStatus, ) -from metadata.generated.schema.entity.data.table import Table -from metadata.generated.schema.entity.services.connections.pipeline.airflowConnection import ( - AirflowConnection, -) -from metadata.generated.schema.entity.services.connections.pipeline.backendConnection import ( - BackendConnection, -) -from metadata.generated.schema.entity.services.pipelineService import ( - PipelineConnection, - PipelineService, - PipelineServiceType, -) -from metadata.generated.schema.type.entityLineage import EntitiesEdge -from metadata.generated.schema.type.entityReference import EntityReference from metadata.ingestion.ometa.ometa_api import OpenMetadata from metadata.utils.helpers import datetime_to_ts @@ -55,40 +31,13 @@ if TYPE_CHECKING: from airflow.models.taskinstance import TaskInstance -_STATUS_MAP = { - "running": StatusType.Pending, - "success": StatusType.Successful, - "failed": StatusType.Failed, +STATUS_MAP = { + "success": StatusType.Successful.value, + "failed": StatusType.Failed.value, + "queued": StatusType.Pending.value, } -def is_airflow_version_1() -> bool: - """ - Check varying imports between Airflow v1 & v2 - """ - # pylint: disable=unused-import,import-outside-toplevel - try: - - return False - except ModuleNotFoundError: - - return True - - -def parse_v1_xlets(xlet: dict) -> Optional[List[str]]: - """ - Parse airflow xlets for V1 - :param xlet: airflow v1 xlet dict - :return: table list or None - """ - if isinstance(xlet, dict): - tables = xlet.get("tables") - if tables and isinstance(tables, list): - return tables - - return None - - def parse_xlets(xlet: List[dict]) -> Optional[List[str]]: """ Parse airflow xlets for V1 @@ -118,112 +67,17 @@ def get_xlets( :return: list of tables FQN """ xlet = getattr(operator, xlet_mode) - if is_airflow_version_1(): - tables = parse_v1_xlets(xlet) - - else: - tables = parse_xlets(xlet) + tables = parse_xlets(xlet) if not tables: - operator.log.info(f"Not finding proper {xlet_mode} in task {operator.task_id}") + operator.log.debug(f"Not finding proper {xlet_mode} in task {operator.task_id}") + + else: + operator.log.info(f"Found {xlet_mode} {tables} in task {operator.task_id}") return tables -def create_or_update_pipeline( # pylint: disable=too-many-locals - task_instance: "TaskInstance", - operator: "BaseOperator", - dag: "DAG", - airflow_service_entity: PipelineService, - metadata: OpenMetadata, -) -> Pipeline: - """ - Prepare the upsert of pipeline entity with the given task - - We will: - - Create the pipeline Entity - - Append the task being processed - - Clean deleted tasks based on the DAG children information - - :param task_instance: task run being processed - :param dag_run: DAG run being processed - :param operator: task being examined by lineage - :param dag: airflow dag - :param airflow_service_entity: PipelineService - :param metadata: OpenMetadata API client - :return: PipelineEntity - """ - dag_url = f"/tree?dag_id={dag.dag_id}" - task_url = f"/taskinstance/list/?flt1_dag_id_equals={dag.dag_id}&_flt_3_task_id={operator.task_id}" - - dag_start_date = dag.start_date.isoformat() if dag.start_date else None - task_start_date = ( - task_instance.start_date.isoformat() if task_instance.start_date else None - ) - task_end_date = ( - task_instance.end_date.isoformat() if task_instance.end_date else None - ) - - downstream_tasks = [] - if getattr(operator, "downstream_task_ids", None): - downstream_tasks = operator.downstream_task_ids - - operator.log.info(f"downstream tasks {downstream_tasks}") - - task = Task( - name=operator.task_id, - displayName=operator.task_id, - taskUrl=task_url, - taskType=operator.task_type, - startDate=task_start_date, - endDate=task_end_date, - downstreamTasks=downstream_tasks, - ) - - # Check if the pipeline already exists - operator.log.info( - f"Checking if the pipeline {airflow_service_entity.name.__root__}.{dag.dag_id} exists. If not, we will create it." - ) - current_pipeline: Pipeline = metadata.get_by_name( - entity=Pipeline, - fqn=f"{airflow_service_entity.name.__root__}.{dag.dag_id}", - fields=["tasks"], - ) - - # Create pipeline if not exists or update its properties - pipeline_request = CreatePipelineRequest( - name=dag.dag_id, - displayName=dag.dag_id, - description=dag.description, - pipelineUrl=dag_url, - concurrency=current_pipeline.concurrency if current_pipeline else None, - pipelineLocation=current_pipeline.pipelineLocation - if current_pipeline - else None, - startDate=dag_start_date, - tasks=current_pipeline.tasks - if current_pipeline - else None, # use the current tasks, if any - service=EntityReference(id=airflow_service_entity.id, type="pipelineService"), - owner=current_pipeline.owner if current_pipeline else None, - tags=current_pipeline.tags if current_pipeline else None, - ) - pipeline: Pipeline = metadata.create_or_update(pipeline_request) - - # Add the task we are processing in the lineage backend - operator.log.info("Adding tasks to pipeline...") - updated_pipeline = metadata.add_task_to_pipeline(pipeline, task) - - # Clean pipeline - try: - operator.log.info("Cleaning pipeline tasks...") - updated_pipeline = metadata.clean_pipeline_tasks(updated_pipeline, dag.task_ids) - except Exception as exc: # pylint: disable=broad-except - operator.log.warning(f"Error cleaning pipeline tasks {exc}") - - return updated_pipeline - - def get_dag_status(all_tasks: List[str], task_status: List[TaskStatus]): """ Based on the task information and the total DAG tasks, cook the @@ -290,7 +144,7 @@ def add_status( updated_task_status = [ TaskStatus( name=task_instance.task_id, - executionStatus=_STATUS_MAP.get(task_instance.state), + executionStatus=STATUS_MAP.get(task_instance.state), startTime=datetime_to_ts(task_instance.start_date), endTime=datetime_to_ts(task_instance.end_date), logLink=task_instance.log_url, @@ -311,117 +165,3 @@ def add_status( metadata.add_pipeline_status( fqn=pipeline.fullyQualifiedName.__root__, status=updated_status ) - - -# pylint: disable=too-many-arguments,too-many-locals -def parse_lineage( - config: AirflowLineageConfig, - context: Dict, - operator: "BaseOperator", - inlets: List, - outlets: List, - metadata: OpenMetadata, -) -> Optional[Pipeline]: - """ - Main logic to extract properties from DAG and the - triggered operator to ingest lineage data into - OpenMetadata - - :param config: lineage configuration - :param context: airflow runtime context - :param operator: task being executed - :param inlets: list of upstream tables - :param outlets: list of downstream tables - :param metadata: OpenMetadata client - """ - operator.log.info("Parsing Lineage for OpenMetadata") - - dag: "DAG" = context["dag"] - task_instance: "TaskInstance" = context["task_instance"] - - try: - - airflow_service_entity = get_or_create_pipeline_service( - operator, metadata, config - ) - pipeline = create_or_update_pipeline( - task_instance=task_instance, - operator=operator, - dag=dag, - airflow_service_entity=airflow_service_entity, - metadata=metadata, - ) - - operator.log.info("Parsing Lineage") - for table in inlets if inlets else []: - table_entity = metadata.get_by_name(entity=Table, fqn=table) - operator.log.debug(f"from entity {table_entity}") - lineage = AddLineageRequest( - edge=EntitiesEdge( - fromEntity=EntityReference(id=table_entity.id, type="table"), - toEntity=EntityReference(id=pipeline.id, type="pipeline"), - ) - ) - operator.log.debug(f"From lineage {lineage}") - metadata.add_lineage(lineage) - - for table in outlets if outlets else []: - table_entity = metadata.get_by_name(entity=Table, fqn=table) - operator.log.debug(f"To entity {table_entity}") - lineage = AddLineageRequest( - edge=EntitiesEdge( - fromEntity=EntityReference(id=pipeline.id, type="pipeline"), - toEntity=EntityReference(id=table_entity.id, type="table"), - ) - ) - operator.log.debug(f"To lineage {lineage}") - metadata.add_lineage(lineage) - - return pipeline - - except Exception as exc: # pylint: disable=broad-except - operator.log.error( - f"Failed to parse Airflow DAG task and publish to OpenMetadata due to {exc}" - ) - operator.log.error(traceback.format_exc()) - - return None - - -def get_or_create_pipeline_service( - operator: "BaseOperator", metadata: OpenMetadata, config: AirflowLineageConfig -) -> PipelineService: - """ - Check if we already have the airflow instance as a PipelineService, - otherwise create it. - - :param operator: task from which we extract the lineage - :param metadata: OpenMetadata API wrapper - :param config: lineage config - :return: PipelineService - """ - operator.log.info("Get Airflow Service ID") - airflow_service_entity = metadata.get_by_name( - entity=PipelineService, fqn=config.airflow_service_name - ) - - if airflow_service_entity is None: - pipeline_service = CreatePipelineServiceRequest( - name=config.airflow_service_name, - serviceType=PipelineServiceType.Airflow, - connection=PipelineConnection( - config=AirflowConnection( - hostPort=conf.get("webserver", "base_url"), - connection=BackendConnection(), - ), - ), - ) - airflow_service_entity = metadata.create_or_update(pipeline_service) - if airflow_service_entity: - operator.log.info( - f"Created airflow service entity - {airflow_service_entity.fullyQualifiedName.__root__}" - ) - else: - operator.log.error("Failed to create airflow service entity") - - return airflow_service_entity diff --git a/ingestion/src/airflow_provider_openmetadata/provider.yaml b/ingestion/src/airflow_provider_openmetadata/provider.yaml index 07c9c4f00e6..e6842979c88 100644 --- a/ingestion/src/airflow_provider_openmetadata/provider.yaml +++ b/ingestion/src/airflow_provider_openmetadata/provider.yaml @@ -24,3 +24,12 @@ integrations: - integration-name: OpenMetadata external-doc-url: https://open-metadata.org tags: [service] + +hooks: + - integration-name: OpenMetadata + python-modules: + - airflow_provider_openmetadata.hooks.openmetadata + +connection-types: + - hook-class-name: airflow_provider_openmetadata.hooks.openmetadata.OpenMetadataHook + connection-type: openmetadata diff --git a/ingestion/src/metadata/ingestion/ometa/mixins/lineage_mixin.py b/ingestion/src/metadata/ingestion/ometa/mixins/lineage_mixin.py index 0b3164a45f3..e6570df2062 100644 --- a/ingestion/src/metadata/ingestion/ometa/mixins/lineage_mixin.py +++ b/ingestion/src/metadata/ingestion/ometa/mixins/lineage_mixin.py @@ -19,6 +19,7 @@ from typing import Any, Dict, Generic, Optional, Type, TypeVar, Union from pydantic import BaseModel from metadata.generated.schema.api.lineage.addLineage import AddLineageRequest +from metadata.generated.schema.type.entityLineage import EntitiesEdge from metadata.ingestion.ometa.client import REST, APIError from metadata.ingestion.ometa.utils import get_entity_type, ometa_logger @@ -129,3 +130,16 @@ class OMetaLineageMixin(Generic[T]): + f"{entity.__name__} and {path}: {err}" ) return None + + def delete_lineage_edge(self, edge: EntitiesEdge) -> None: + """ + Remove the given Edge + """ + try: + self.client.delete( + f"{self.get_suffix(AddLineageRequest)}/{edge.fromEntity.type}/{edge.fromEntity.id.__root__}/" + f"{edge.toEntity.type}/{edge.toEntity.id.__root__}" + ) + except APIError as err: + logger.debug(traceback.format_exc()) + logger.error(f"Error {err.status_code} trying to DELETE linage for {edge}") diff --git a/ingestion/tests/integration/lineage/airflow/test_airflow_lineage.py b/ingestion/tests/integration/lineage/airflow/test_airflow_lineage.py index 58826a7ac6e..2e87eb7a779 100644 --- a/ingestion/tests/integration/lineage/airflow/test_airflow_lineage.py +++ b/ingestion/tests/integration/lineage/airflow/test_airflow_lineage.py @@ -28,9 +28,7 @@ from airflow.operators.bash import BashOperator from airflow.operators.dummy import DummyOperator from airflow.utils.task_group import TaskGroup -from airflow_provider_openmetadata.lineage.openmetadata import ( - OpenMetadataLineageBackend, -) +from airflow_provider_openmetadata.lineage.backend import OpenMetadataLineageBackend from airflow_provider_openmetadata.lineage.utils import get_xlets from metadata.generated.schema.api.data.createDatabase import CreateDatabaseRequest from metadata.generated.schema.api.data.createDatabaseSchema import ( diff --git a/openmetadata-docs/content/connectors/pipeline/airflow/lineage-backend.md b/openmetadata-docs/content/connectors/pipeline/airflow/lineage-backend.md index 6cba8b3c6aa..87b68f250ae 100644 --- a/openmetadata-docs/content/connectors/pipeline/airflow/lineage-backend.md +++ b/openmetadata-docs/content/connectors/pipeline/airflow/lineage-backend.md @@ -37,111 +37,56 @@ versions match. ### Adding Lineage Config + + +If using OpenMetadata version 0.13.0 or lower, the import for the lineage backend is +`airflow_provider_openmetadata.lineage.openmetadata.OpenMetadataLineageBackend`. + +For 0.13.1 or higher, the import has been renamed to `airflow_provider_openmetadata.lineage.backend.OpenMetadataLineageBackend`. + + + After the installation, we need to update the Airflow configuration. This can be done following this example on `airflow.cfg`: ```ini [lineage] -backend = airflow_provider_openmetadata.lineage.openmetadata.OpenMetadataLineageBackend +backend = airflow_provider_openmetadata.lineage.backend.OpenMetadataLineageBackend airflow_service_name = local_airflow openmetadata_api_endpoint = http://localhost:8585/api -auth_provider_type = no-auth +auth_provider_type = openmetadata +jwt_token = ``` Or we can directly provide environment variables: ```env -AIRFLOW__LINEAGE__BACKEND="airflow_provider_openmetadata.lineage.openmetadata.OpenMetadataLineageBackend" +AIRFLOW__LINEAGE__BACKEND="airflow_provider_openmetadata.lineage.backend.OpenMetadataLineageBackend" AIRFLOW__LINEAGE__AIRFLOW_SERVICE_NAME="local_airflow" AIRFLOW__LINEAGE__OPENMETADATA_API_ENDPOINT="http://localhost:8585/api" -AIRFLOW__LINEAGE__AUTH_PROVIDER_TYPE="no-auth" +AIRFLOW__LINEAGE__AUTH_PROVIDER_TYPE="openmetadata" +AIRFLOW__LINEAGE__JWT_TOKEN="" ``` We can choose the option that best adapts to our current architecture. Find more information on Airflow configurations [here](https://airflow.apache.org/docs/apache-airflow/stable/howto/set-config.html). -We are now going to list the configurations for the different SSO. We will use the `ini` format for those, -but on your own Airflow you can freely choose. +#### Optional Parameters -#### Google SSO +You can also set the following parameters: ```ini [lineage] -backend = airflow_provider_openmetadata.lineage.openmetadata.OpenMetadataLineageBackend -airflow_service_name = local_airflow -openmetadata_api_endpoint = http://localhost:8585/api -auth_provider_type = google -# Note that the path should be local in Airflow -secret_key = path-to-secret-key-file.json +... +only_keep_dag_lineage = true +max_status = 10 ``` -#### Okta SSO +- `only_keep_dag_lineage` will remove any table lineage not present in the inlets or outlets. This will ensure +that any lineage in OpenMetadata comes from your code. +- `max_status` controls the number of status to ingest in each run. By default, we'll pick the last 10. -```ini -[lineage] -backend = airflow_provider_openmetadata.lineage.openmetadata.OpenMetadataLineageBackend -airflow_service_name = local_airflow -openmetadata_api_endpoint = http://localhost:8585/api -auth_provider_type = okta -client_id = client id -org_url = org url -private_key = private key -email = email -# Optional -scopes = ["scope1", "scope2"] -``` -#### Auth0 SSO - -```ini -[lineage] -backend = airflow_provider_openmetadata.lineage.openmetadata.OpenMetadataLineageBackend -airflow_service_name = local_airflow -openmetadata_api_endpoint = http://localhost:8585/api -auth_provider_type = auth0 -client_id = client id -secret_key = secret key -domain = domain -``` - -#### Azure SSO - -```ini -[lineage] -backend = airflow_provider_openmetadata.lineage.openmetadata.OpenMetadataLineageBackend -airflow_service_name = local_airflow -openmetadata_api_endpoint = http://localhost:8585/api -auth_provider_type = azure -client_id = client id -client_secret = client secret -authority = authority -# Optional -scopes = ["scope1", "scope2"] -``` - -#### OpenMetadata SSO - -```ini -[lineage] -backend = airflow_provider_openmetadata.lineage.openmetadata.OpenMetadataLineageBackend -airflow_service_name = local_airflow -openmetadata_api_endpoint = http://localhost:8585/api -auth_provider_type = openmetadata -jwt_token = token -``` - -#### Custom OIDC SSO - -```ini -[lineage] -backend = airflow_provider_openmetadata.lineage.openmetadata.OpenMetadataLineageBackend -airflow_service_name = local_airflow -openmetadata_api_endpoint = http://localhost:8585/api -auth_provider_type = custom-oidc -client_id = client id -client_secret = client secret -token_endpoint = endpoint -``` In the following sections, we'll show how to adapt our pipelines to help us build the lineage information. @@ -307,7 +252,7 @@ If you are running this example using the quickstart deployment of OpenMetadata, this: ``` -backend = airflow_provider_openmetadata.lineage.openmetadata.OpenMetadataLineageBackend +backend = airflow_provider_openmetadata.lineage.backend.OpenMetadataLineageBackend airflow_service_name = local_airflow openmetadata_api_endpoint = http://localhost:8585/api auth_provider_type = openmetadata diff --git a/openmetadata-docs/content/connectors/pipeline/airflow/lineage-operator.md b/openmetadata-docs/content/connectors/pipeline/airflow/lineage-operator.md new file mode 100644 index 00000000000..1cb7fc16705 --- /dev/null +++ b/openmetadata-docs/content/connectors/pipeline/airflow/lineage-operator.md @@ -0,0 +1,213 @@ +--- +title: Airflow Lineage Operator +slug: /connectors/pipeline/airflow/lineage-operator +--- + +# Airflow Lineage Operator + +Another approach to extract Airflow metadata only for the DAGs you want is to use the `OpenMetadataLineageOperator`. + +When the task executes, it will ingest: +- The Pipeline Service if it does not exist +- The DAG as a Pipeline if it does not exist. +- The status of the tasks. We recommend running this Operator as the last step if you want up-to-date statuses. +- The lineage from inlets and outlets. + +## Installation + +The Lineage Operator can be directly installed to the Airflow instances as part of the usual OpenMetadata Python +distribution: + +```commandline +pip3 install "openmetadata-ingestion==x.y.z" +``` + +Where `x.y.z` is the version of your OpenMetadata server, e.g., 0.13.0. It is important that server and client +versions match. + +**It requires the version `0.13.1` or higher**. + +## Example DAG + +An example DAG looks like follows: + +```python +# Copyright 2021 Collate +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" +You can run this DAG from the default OM installation +""" + +from datetime import datetime, timedelta +from textwrap import dedent + +# The DAG object; we'll need this to instantiate a DAG +from airflow import DAG + +# Operators; we need this to operate! +from airflow.operators.bash import BashOperator +from airflow.operators.python import PythonOperator + +# These args will get passed on to each operator +# You can override them on a per-task basis during operator initialization +from airflow_provider_openmetadata.lineage.operator import OpenMetadataLineageOperator + +from metadata.generated.schema.entity.services.connections.metadata.openMetadataConnection import ( + OpenMetadataConnection, +) +from metadata.generated.schema.security.client.openMetadataJWTClientConfig import ( + OpenMetadataJWTClientConfig, +) + + +default_args = { + 'retries': 1, + 'retry_delay': timedelta(minutes=5), +} + + +def explode(): + raise Exception("Oh no!") + + +with DAG( + 'lineage_tutorial_operator', + default_args=default_args, + description='A simple tutorial DAG', + schedule_interval=timedelta(days=1), + start_date=datetime(2021, 1, 1), + catchup=False, + tags=['example'], +) as dag: + + # t1, t2 and t3 are examples of tasks created by instantiating operators + t1 = BashOperator( + task_id='print_date', + bash_command='date', + outlets={ + "tables": ["sample_data.ecommerce_db.shopify.dim_address"] + } + ) + + t2 = BashOperator( + task_id='sleep', + depends_on_past=False, + bash_command='sleep 1', + retries=3, + inlets={ + "tables": ["sample_data.ecommerce_db.shopify.dim_customer"] + } + ) + + risen = PythonOperator( + task_id='explode', + provide_context=True, + python_callable=explode, + retries=0, + ) + + dag.doc_md = __doc__ # providing that you have a docstring at the beginning of the DAG + dag.doc_md = """ + This is a documentation placed anywhere + """ # otherwise, type it like this + templated_command = dedent( + """ + {% for i in range(5) %} + echo "{{ ds }}" + echo "{{ macros.ds_add(ds, 7)}}" + echo "{{ params.my_param }}" + {% endfor %} + """ + ) + + t3 = BashOperator( + task_id='templated', + depends_on_past=False, + bash_command=templated_command, + params={'my_param': 'Parameter I passed in'}, + ) + + t1 >> [t2, t3] + + server_config = OpenMetadataConnection( + hostPort="http://localhost:8585/api", + authProvider="openmetadata", + securityConfig=OpenMetadataJWTClientConfig( + jwtToken="eyJraWQiOiJHYjM4OWEtOWY3Ni1nZGpzLWE5MmotMDI0MmJrOTQzNTYiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsImlzQm90IjpmYWxzZSwiaXNzIjoib3Blbi1tZXRhZGF0YS5vcmciLCJpYXQiOjE2NjM5Mzg0NjIsImVtYWlsIjoiYWRtaW5Ab3Blbm1ldGFkYXRhLm9yZyJ9.tS8um_5DKu7HgzGBzS1VTA5uUjKWOCU0B_j08WXBiEC0mr0zNREkqVfwFDD-d24HlNEbrqioLsBuFRiwIWKc1m_ZlVQbG7P36RUxhuv2vbSp80FKyNM-Tj93FDzq91jsyNmsQhyNv_fNr3TXfzzSPjHt8Go0FMMP66weoKMgW2PbXlhVKwEuXUHyakLLzewm9UMeQaEiRzhiTMU3UkLXcKbYEJJvfNFcLwSl9W8JCO_l0Yj3ud-qt_nQYEZwqW6u5nfdQllN133iikV4fM5QZsMCnm8Rq1mvLR0y9bmJiD7fwM1tmJ791TUWqmKaTnP49U493VanKpUAfzIiOiIbhg" + ), + ) + + t4 = OpenMetadataLineageOperator( + task_id='lineage_op', + depends_on_past=False, + server_config=server_config, + service_name="airflow_lineage_op_service", + only_keep_dag_lineage=True, + ) + + t1 >> t4 +``` + +## Retrieving the OpenMetadataConnection from Airflow + +In 0.13.1 we have also added an `OpenMetadataHook`, which can be configured from the UI to safely store +the parameters to connect to OpenMetadata. + +Go to the Airflow UI > Admin > Connection and create a new `OpenMetadata` connection as follows: + +Airflow Connection + +Testing the connection will validate that the server is reachable and the installed client can be instantiated properly. + +Once the connection is configured, you can use it in your DAGs without creating the `OpenMetadataConnection` manually + +```python +from airflow_provider_openmetadata.hooks.openmetadata import OpenMetadataHook + +openmetadata_hook = OpenMetadataHook(openmetadata_conn_id="om_id") +server_config = openmetadata_hook.get_conn() + +OpenMetadataLineageOperator( + task_id='lineage_op', + depends_on_past=False, + server_config=server_config, + service_name="airflow_lineage_op_service", + only_keep_dag_lineage=True, +) +``` + +### OpenMetadataHook with HTTPS and SSL + +If the OpenMetadata server connection needs to happen through HTTPS, update the `Schema` accordingly to `https`. + +For SSL parameters we have two options: + +#### 1. Ignore the SSL certificates + +You can add the `Extra` value as the following JSON to create the connection that will ignore SSL. + +```json +{ + "verifySSL": "ignore" +} +``` + +#### 2. Validate SSL certificates + +Otherwise, you can use the `validate` value and add the path to the certificate. **It should be reachable locally +in your Airflow instance**. + +```json +{ + "verifySSL": "validate", + "sslConfig": "path-to-cert" +} +``` diff --git a/openmetadata-docs/content/deployment/upgrade/versions/012-to-013.md b/openmetadata-docs/content/deployment/upgrade/versions/012-to-013.md index 8766f731bde..ff7ebf36293 100644 --- a/openmetadata-docs/content/deployment/upgrade/versions/012-to-013.md +++ b/openmetadata-docs/content/deployment/upgrade/versions/012-to-013.md @@ -27,4 +27,13 @@ Starting with `0.13.0`, we have deprecated the initial configurations for Author - Airbyte - Airbyte connector now support Basic Authentication. - - Added: `username`, `password` \ No newline at end of file + - Added: `username`, `password` + +## Lineage Backend + +In 0.13.1: + +- The import for the Airflow Lineage Backend has been updated from `airflow_provider_openmetadata.lineage.openmetadata.OpenMetadataLineageBackend` +to `airflow_provider_openmetadata.lineage.backend.OpenMetadataLineageBackend`. +- We removed support from Airflow v1. +- The failure callback now only updates the pipeline status if the Pipeline already exists in OpenMetadata. diff --git a/openmetadata-docs/content/menu.md b/openmetadata-docs/content/menu.md index 3cef609ef60..41a521925d0 100644 --- a/openmetadata-docs/content/menu.md +++ b/openmetadata-docs/content/menu.md @@ -428,6 +428,8 @@ site_menu: url: /connectors/pipeline/airflow/gcs - category: Connectors / Pipeline / Airflow / Lineage Backend url: /connectors/pipeline/airflow/lineage-backend + - category: Connectors / Pipeline / Airflow / Lineage Operator + url: /connectors/pipeline/airflow/lineage-operator - category: Connectors / Pipeline / Airbyte url: /connectors/pipeline/airbyte - category: Connectors / Pipeline / Airbyte / Airflow diff --git a/openmetadata-docs/images/openmetadata/connectors/airflow/airflow-connection.png b/openmetadata-docs/images/openmetadata/connectors/airflow/airflow-connection.png new file mode 100644 index 0000000000000000000000000000000000000000..c5cd7596daadd8f465116f5908d15d955618b984 GIT binary patch literal 180752 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�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 literal 0 HcmV?d00001