apache-airflow-providers-openlineage 2.1.3__tar.gz → 2.2.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/PKG-INFO +10 -10
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/README.rst +5 -5
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/docs/changelog.rst +20 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/docs/commits.rst +18 -1
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/docs/guides/developer.rst +11 -3
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/docs/index.rst +5 -5
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/provider.yaml +2 -1
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/pyproject.toml +5 -5
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/src/airflow/providers/openlineage/__init__.py +1 -1
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/src/airflow/providers/openlineage/extractors/manager.py +3 -4
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/src/airflow/providers/openlineage/plugins/adapter.py +8 -2
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/src/airflow/providers/openlineage/plugins/listener.py +76 -5
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/src/airflow/providers/openlineage/utils/spark.py +1 -1
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/src/airflow/providers/openlineage/utils/utils.py +31 -28
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/tests/system/openlineage/operator.py +2 -2
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/tests/unit/openlineage/plugins/test_adapter.py +15 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/tests/unit/openlineage/plugins/test_listener.py +147 -57
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/tests/unit/openlineage/utils/test_utils.py +19 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/docs/.latest-doc-only-change.txt +0 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/docs/conf.py +0 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/docs/configurations-ref.rst +0 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/docs/guides/structure.rst +0 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/docs/guides/user.rst +0 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/docs/installing-providers-from-sources.rst +0 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/docs/integration-logos/openlineage.svg +0 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/docs/macros.rst +0 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/docs/security.rst +0 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/docs/supported_classes.rst +0 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/src/airflow/__init__.py +0 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/src/airflow/providers/__init__.py +0 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/src/airflow/providers/openlineage/LICENSE +0 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/src/airflow/providers/openlineage/conf.py +0 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/src/airflow/providers/openlineage/extractors/__init__.py +0 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/src/airflow/providers/openlineage/extractors/base.py +0 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/src/airflow/providers/openlineage/extractors/bash.py +0 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/src/airflow/providers/openlineage/extractors/python.py +0 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/src/airflow/providers/openlineage/facets/AirflowDagRunFacet.json +0 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/src/airflow/providers/openlineage/facets/AirflowDebugRunFacet.json +0 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/src/airflow/providers/openlineage/facets/AirflowJobFacet.json +0 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/src/airflow/providers/openlineage/facets/AirflowRunFacet.json +0 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/src/airflow/providers/openlineage/facets/AirflowStateRunFacet.json +0 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/src/airflow/providers/openlineage/facets/__init__.py +0 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/src/airflow/providers/openlineage/get_provider_info.py +0 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/src/airflow/providers/openlineage/plugins/__init__.py +0 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/src/airflow/providers/openlineage/plugins/facets.py +0 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/src/airflow/providers/openlineage/plugins/macros.py +0 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/src/airflow/providers/openlineage/plugins/openlineage.py +0 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/src/airflow/providers/openlineage/sqlparser.py +0 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/src/airflow/providers/openlineage/utils/__init__.py +0 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/src/airflow/providers/openlineage/utils/selective_enable.py +0 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/src/airflow/providers/openlineage/utils/sql.py +0 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/src/airflow/providers/openlineage/version_compat.py +0 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/tests/conftest.py +0 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/tests/integration/__init__.py +0 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/tests/integration/openlineage/__init__.py +0 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/tests/integration/openlineage/operators/__init__.py +0 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/tests/system/__init__.py +0 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/tests/system/openlineage/__init__.py +0 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/tests/system/openlineage/conftest.py +0 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/tests/system/openlineage/example_openlineage.json +0 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/tests/system/openlineage/example_openlineage.py +0 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/tests/system/openlineage/example_openlineage_mapped_sensor.json +0 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/tests/system/openlineage/example_openlineage_mapped_sensor.py +0 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/tests/system/openlineage/transport/__init__.py +0 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/tests/system/openlineage/transport/variable.py +0 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/tests/unit/__init__.py +0 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/tests/unit/openlineage/__init__.py +0 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/tests/unit/openlineage/extractors/__init__.py +0 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/tests/unit/openlineage/extractors/test_base.py +0 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/tests/unit/openlineage/extractors/test_bash.py +0 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/tests/unit/openlineage/extractors/test_manager.py +0 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/tests/unit/openlineage/extractors/test_python.py +0 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/tests/unit/openlineage/log_config.py +0 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/tests/unit/openlineage/plugins/__init__.py +0 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/tests/unit/openlineage/plugins/openlineage_configs/__init__.py +0 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/tests/unit/openlineage/plugins/openlineage_configs/http.yaml +0 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/tests/unit/openlineage/plugins/test_execution.py +0 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/tests/unit/openlineage/plugins/test_facets.py +0 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/tests/unit/openlineage/plugins/test_macros.py +0 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/tests/unit/openlineage/plugins/test_openlineage.py +0 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/tests/unit/openlineage/plugins/test_utils.py +0 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/tests/unit/openlineage/test_conf.py +0 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/tests/unit/openlineage/test_sqlparser.py +0 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/tests/unit/openlineage/utils/__init__.py +0 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/tests/unit/openlineage/utils/custom_facet_fixture.py +0 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/tests/unit/openlineage/utils/test_selective_enable.py +0 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/tests/unit/openlineage/utils/test_spark.py +0 -0
- {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/tests/unit/openlineage/utils/test_sql.py +0 -0
{apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: apache-airflow-providers-openlineage
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.2.0
|
|
4
4
|
Summary: Provider package apache-airflow-providers-openlineage for Apache Airflow
|
|
5
5
|
Keywords: airflow-provider,openlineage,airflow,integration
|
|
6
6
|
Author-email: Apache Software Foundation <dev@airflow.apache.org>
|
|
@@ -24,11 +24,11 @@ Requires-Dist: apache-airflow>=2.9.0
|
|
|
24
24
|
Requires-Dist: apache-airflow-providers-common-sql>=1.20.0
|
|
25
25
|
Requires-Dist: apache-airflow-providers-common-compat>=1.4.0
|
|
26
26
|
Requires-Dist: attrs>=22.2
|
|
27
|
-
Requires-Dist: openlineage-integration-common>=1.
|
|
28
|
-
Requires-Dist: openlineage-python>=1.
|
|
27
|
+
Requires-Dist: openlineage-integration-common>=1.31.0
|
|
28
|
+
Requires-Dist: openlineage-python>=1.31.0
|
|
29
29
|
Project-URL: Bug Tracker, https://github.com/apache/airflow/issues
|
|
30
|
-
Project-URL: Changelog, https://airflow.apache.org/docs/apache-airflow-providers-openlineage/2.
|
|
31
|
-
Project-URL: Documentation, https://airflow.apache.org/docs/apache-airflow-providers-openlineage/2.
|
|
30
|
+
Project-URL: Changelog, https://airflow.apache.org/docs/apache-airflow-providers-openlineage/2.2.0/changelog.html
|
|
31
|
+
Project-URL: Documentation, https://airflow.apache.org/docs/apache-airflow-providers-openlineage/2.2.0
|
|
32
32
|
Project-URL: Mastodon, https://fosstodon.org/@airflow
|
|
33
33
|
Project-URL: Slack Chat, https://s.apache.org/airflow-slack
|
|
34
34
|
Project-URL: Source Code, https://github.com/apache/airflow
|
|
@@ -59,7 +59,7 @@ Project-URL: YouTube, https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/
|
|
|
59
59
|
|
|
60
60
|
Package ``apache-airflow-providers-openlineage``
|
|
61
61
|
|
|
62
|
-
Release: ``2.
|
|
62
|
+
Release: ``2.2.0``
|
|
63
63
|
|
|
64
64
|
|
|
65
65
|
`OpenLineage <https://openlineage.io/>`__
|
|
@@ -72,7 +72,7 @@ This is a provider package for ``openlineage`` provider. All classes for this pr
|
|
|
72
72
|
are in ``airflow.providers.openlineage`` python package.
|
|
73
73
|
|
|
74
74
|
You can find package information and changelog for the provider
|
|
75
|
-
in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-openlineage/2.
|
|
75
|
+
in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-openlineage/2.2.0/>`_.
|
|
76
76
|
|
|
77
77
|
Installation
|
|
78
78
|
------------
|
|
@@ -93,8 +93,8 @@ PIP package Version required
|
|
|
93
93
|
``apache-airflow-providers-common-sql`` ``>=1.20.0``
|
|
94
94
|
``apache-airflow-providers-common-compat`` ``>=1.4.0``
|
|
95
95
|
``attrs`` ``>=22.2``
|
|
96
|
-
``openlineage-integration-common`` ``>=1.
|
|
97
|
-
``openlineage-python`` ``>=1.
|
|
96
|
+
``openlineage-integration-common`` ``>=1.31.0``
|
|
97
|
+
``openlineage-python`` ``>=1.31.0``
|
|
98
98
|
========================================== ==================
|
|
99
99
|
|
|
100
100
|
Cross provider package dependencies
|
|
@@ -118,5 +118,5 @@ Dependent package
|
|
|
118
118
|
================================================================================================================== =================
|
|
119
119
|
|
|
120
120
|
The changelog for the provider package can be found in the
|
|
121
|
-
`changelog <https://airflow.apache.org/docs/apache-airflow-providers-openlineage/2.
|
|
121
|
+
`changelog <https://airflow.apache.org/docs/apache-airflow-providers-openlineage/2.2.0/changelog.html>`_.
|
|
122
122
|
|
{apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0}/README.rst
RENAMED
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
|
|
24
24
|
Package ``apache-airflow-providers-openlineage``
|
|
25
25
|
|
|
26
|
-
Release: ``2.
|
|
26
|
+
Release: ``2.2.0``
|
|
27
27
|
|
|
28
28
|
|
|
29
29
|
`OpenLineage <https://openlineage.io/>`__
|
|
@@ -36,7 +36,7 @@ This is a provider package for ``openlineage`` provider. All classes for this pr
|
|
|
36
36
|
are in ``airflow.providers.openlineage`` python package.
|
|
37
37
|
|
|
38
38
|
You can find package information and changelog for the provider
|
|
39
|
-
in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-openlineage/2.
|
|
39
|
+
in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-openlineage/2.2.0/>`_.
|
|
40
40
|
|
|
41
41
|
Installation
|
|
42
42
|
------------
|
|
@@ -57,8 +57,8 @@ PIP package Version required
|
|
|
57
57
|
``apache-airflow-providers-common-sql`` ``>=1.20.0``
|
|
58
58
|
``apache-airflow-providers-common-compat`` ``>=1.4.0``
|
|
59
59
|
``attrs`` ``>=22.2``
|
|
60
|
-
``openlineage-integration-common`` ``>=1.
|
|
61
|
-
``openlineage-python`` ``>=1.
|
|
60
|
+
``openlineage-integration-common`` ``>=1.31.0``
|
|
61
|
+
``openlineage-python`` ``>=1.31.0``
|
|
62
62
|
========================================== ==================
|
|
63
63
|
|
|
64
64
|
Cross provider package dependencies
|
|
@@ -82,4 +82,4 @@ Dependent package
|
|
|
82
82
|
================================================================================================================== =================
|
|
83
83
|
|
|
84
84
|
The changelog for the provider package can be found in the
|
|
85
|
-
`changelog <https://airflow.apache.org/docs/apache-airflow-providers-openlineage/2.
|
|
85
|
+
`changelog <https://airflow.apache.org/docs/apache-airflow-providers-openlineage/2.2.0/changelog.html>`_.
|
|
@@ -26,6 +26,26 @@
|
|
|
26
26
|
Changelog
|
|
27
27
|
---------
|
|
28
28
|
|
|
29
|
+
2.2.0
|
|
30
|
+
.....
|
|
31
|
+
|
|
32
|
+
Features
|
|
33
|
+
~~~~~~~~
|
|
34
|
+
|
|
35
|
+
* ``feat: Add support for task's manual state change notification in OpenLineage listener (#49040)``
|
|
36
|
+
* ``feat: Explicitly propagate airflow logging level to OL client (#49108)``
|
|
37
|
+
* ``feat: Add owner_links in DAG object in airflow facet (#49085)``
|
|
38
|
+
|
|
39
|
+
Misc
|
|
40
|
+
~~~~
|
|
41
|
+
|
|
42
|
+
* ``gate import behind Airflow 2 path (#49209)``
|
|
43
|
+
* ``remove superfluous else block (#49199)``
|
|
44
|
+
* ``chore: Update requirement for openlineage client to >=1.31.0 (#49083)``
|
|
45
|
+
|
|
46
|
+
.. Below changes are excluded from the changelog. Move them to
|
|
47
|
+
appropriate section above if needed. Do not delete the lines(!):
|
|
48
|
+
|
|
29
49
|
2.1.3
|
|
30
50
|
.....
|
|
31
51
|
|
|
@@ -34,14 +34,31 @@ For high-level changelog, see :doc:`package information including changelog <ind
|
|
|
34
34
|
|
|
35
35
|
|
|
36
36
|
|
|
37
|
+
2.2.0
|
|
38
|
+
.....
|
|
39
|
+
|
|
40
|
+
Latest change: 2025-04-14
|
|
41
|
+
|
|
42
|
+
================================================================================================== =========== ==================================================================================================
|
|
43
|
+
Commit Committed Subject
|
|
44
|
+
================================================================================================== =========== ==================================================================================================
|
|
45
|
+
`c447ad303b <https://github.com/apache/airflow/commit/c447ad303b9b206dd56062b837ac92e6b7ea30eb>`__ 2025-04-14 ``gate import behind Airflow 2 path (#49209)``
|
|
46
|
+
`cb295c351a <https://github.com/apache/airflow/commit/cb295c351a016c0a10cab07f2a628b865cff3ca3>`__ 2025-04-14 ``remove superfluous else block (#49199)``
|
|
47
|
+
`b487617969 <https://github.com/apache/airflow/commit/b487617969679b81d6480ff3256f3b4d13c5700d>`__ 2025-04-11 ``feat: Add support for task's manual state change notification in OpenLineage listener (#49040)``
|
|
48
|
+
`6bd5354718 <https://github.com/apache/airflow/commit/6bd535471819074f74b0c3a3251a823be24c61b0>`__ 2025-04-11 ``feat: Explicitly propagate airflow logging level to OL client (#49108)``
|
|
49
|
+
`0936d76aa6 <https://github.com/apache/airflow/commit/0936d76aa6a09dd826ee4f0f3c095c9892a918ac>`__ 2025-04-11 ``chore: Update requirement for openlineage client to >=1.31.0 (#49083)``
|
|
50
|
+
`b7b25d6206 <https://github.com/apache/airflow/commit/b7b25d620621f1e8a93eed1bd137e7e50b867fca>`__ 2025-04-10 ``feat: Add owner_links in DAG object in airflow facet (#49085)``
|
|
51
|
+
================================================================================================== =========== ==================================================================================================
|
|
52
|
+
|
|
37
53
|
2.1.3
|
|
38
54
|
.....
|
|
39
55
|
|
|
40
|
-
Latest change: 2025-04-
|
|
56
|
+
Latest change: 2025-04-10
|
|
41
57
|
|
|
42
58
|
================================================================================================== =========== ==================================================================================
|
|
43
59
|
Commit Committed Subject
|
|
44
60
|
================================================================================================== =========== ==================================================================================
|
|
61
|
+
`4a8567b20b <https://github.com/apache/airflow/commit/4a8567b20bdd6555cbdc936d6674bf4fa390b0d5>`__ 2025-04-10 ``Prepare docs for Apr 2nd wave of providers (#49051)``
|
|
45
62
|
`e84c177f74 <https://github.com/apache/airflow/commit/e84c177f747f728ae52eeaa2c665ef6a4627c5af>`__ 2025-04-09 ``Move ObjectStoragePath and attach to Task SDK (#48906)``
|
|
46
63
|
`ad2e80d299 <https://github.com/apache/airflow/commit/ad2e80d2997dc46ca175a39a0a8b8c216361323f>`__ 2025-04-08 ``tests: verify openlineage airflow models serialization (#47915)``
|
|
47
64
|
`7b2ec33c7a <https://github.com/apache/airflow/commit/7b2ec33c7ad4998d9c9735b79593fcdcd3b9dd1f>`__ 2025-04-08 ``Remove unnecessary entries in get_provider_info and update the schema (#48849)``
|
|
@@ -504,15 +504,23 @@ Marquez can help you pinpoint which facets are not being formed properly so you
|
|
|
504
504
|
|
|
505
505
|
Debug settings
|
|
506
506
|
^^^^^^^^^^^^^^
|
|
507
|
-
For debugging purposes, ensure that
|
|
508
|
-
|
|
509
|
-
|
|
507
|
+
For debugging purposes, ensure that both `Airflow logging level <https://airflow.apache.org/docs/apache-airflow/stable/configurations-ref.html#logging-level>`_
|
|
508
|
+
and `OpenLineage client logging level <https://openlineage.io/docs/client/python#environment-variables>`_ is set to ``DEBUG``.
|
|
509
|
+
The latest provider auto-syncs Airflow's logging level with the OpenLineage client, removing the need for manual configuration.
|
|
510
|
+
|
|
511
|
+
For DebugFacet, containing additional information (e.g., list of all packages installed), to be appended to all OL events
|
|
512
|
+
enable :ref:`debug_mode <options:debug_mode>` for OpenLineage integration.
|
|
513
|
+
|
|
514
|
+
Keep in mind that enabling these settings will increase the detail in Airflow logs (which will increase their size) and
|
|
515
|
+
add extra information to OpenLineage events. It's recommended to use them temporarily, primarily for debugging purposes.
|
|
510
516
|
|
|
511
517
|
When seeking help with debugging, always try to provide the following:
|
|
512
518
|
|
|
513
519
|
- Airflow scheduler logs with the logging level set to DEBUG
|
|
514
520
|
- Airflow worker logs (task logs) with the logging level set to DEBUG
|
|
515
521
|
- OpenLineage events with debug_mode enabled
|
|
522
|
+
- Information about Airflow version and OpenLineage provider version
|
|
523
|
+
- Information about any custom modifications made to the deployment environment where the Airflow is running
|
|
516
524
|
|
|
517
525
|
|
|
518
526
|
Where can I learn more?
|
|
@@ -81,7 +81,7 @@ apache-airflow-providers-openlineage package
|
|
|
81
81
|
`OpenLineage <https://openlineage.io/>`__
|
|
82
82
|
|
|
83
83
|
|
|
84
|
-
Release: 2.
|
|
84
|
+
Release: 2.2.0
|
|
85
85
|
|
|
86
86
|
Provider package
|
|
87
87
|
----------------
|
|
@@ -108,8 +108,8 @@ PIP package Version required
|
|
|
108
108
|
``apache-airflow-providers-common-sql`` ``>=1.20.0``
|
|
109
109
|
``apache-airflow-providers-common-compat`` ``>=1.4.0``
|
|
110
110
|
``attrs`` ``>=22.2``
|
|
111
|
-
``openlineage-integration-common`` ``>=1.
|
|
112
|
-
``openlineage-python`` ``>=1.
|
|
111
|
+
``openlineage-integration-common`` ``>=1.31.0``
|
|
112
|
+
``openlineage-python`` ``>=1.31.0``
|
|
113
113
|
========================================== ==================
|
|
114
114
|
|
|
115
115
|
Cross provider package dependencies
|
|
@@ -138,5 +138,5 @@ Downloading official packages
|
|
|
138
138
|
You can download officially released packages and verify their checksums and signatures from the
|
|
139
139
|
`Official Apache Download site <https://downloads.apache.org/airflow/providers/>`_
|
|
140
140
|
|
|
141
|
-
* `The apache-airflow-providers-openlineage 2.
|
|
142
|
-
* `The apache-airflow-providers-openlineage 2.
|
|
141
|
+
* `The apache-airflow-providers-openlineage 2.2.0 sdist package <https://downloads.apache.org/airflow/providers/apache_airflow_providers_openlineage-2.2.0.tar.gz>`_ (`asc <https://downloads.apache.org/airflow/providers/apache_airflow_providers_openlineage-2.2.0.tar.gz.asc>`__, `sha512 <https://downloads.apache.org/airflow/providers/apache_airflow_providers_openlineage-2.2.0.tar.gz.sha512>`__)
|
|
142
|
+
* `The apache-airflow-providers-openlineage 2.2.0 wheel package <https://downloads.apache.org/airflow/providers/apache_airflow_providers_openlineage-2.2.0-py3-none-any.whl>`_ (`asc <https://downloads.apache.org/airflow/providers/apache_airflow_providers_openlineage-2.2.0-py3-none-any.whl.asc>`__, `sha512 <https://downloads.apache.org/airflow/providers/apache_airflow_providers_openlineage-2.2.0-py3-none-any.whl.sha512>`__)
|
|
@@ -22,9 +22,10 @@ description: |
|
|
|
22
22
|
`OpenLineage <https://openlineage.io/>`__
|
|
23
23
|
|
|
24
24
|
state: ready
|
|
25
|
-
source-date-epoch:
|
|
25
|
+
source-date-epoch: 1744792298
|
|
26
26
|
# note that those versions are maintained by release manager - do not update them manually
|
|
27
27
|
versions:
|
|
28
|
+
- 2.2.0
|
|
28
29
|
- 2.1.3
|
|
29
30
|
- 2.1.2
|
|
30
31
|
- 2.1.1
|
|
@@ -25,7 +25,7 @@ build-backend = "flit_core.buildapi"
|
|
|
25
25
|
|
|
26
26
|
[project]
|
|
27
27
|
name = "apache-airflow-providers-openlineage"
|
|
28
|
-
version = "2.
|
|
28
|
+
version = "2.2.0"
|
|
29
29
|
description = "Provider package apache-airflow-providers-openlineage for Apache Airflow"
|
|
30
30
|
readme = "README.rst"
|
|
31
31
|
authors = [
|
|
@@ -61,8 +61,8 @@ dependencies = [
|
|
|
61
61
|
"apache-airflow-providers-common-sql>=1.20.0",
|
|
62
62
|
"apache-airflow-providers-common-compat>=1.4.0",
|
|
63
63
|
"attrs>=22.2",
|
|
64
|
-
"openlineage-integration-common>=1.
|
|
65
|
-
"openlineage-python>=1.
|
|
64
|
+
"openlineage-integration-common>=1.31.0",
|
|
65
|
+
"openlineage-python>=1.31.0",
|
|
66
66
|
]
|
|
67
67
|
|
|
68
68
|
[dependency-groups]
|
|
@@ -105,8 +105,8 @@ apache-airflow-providers-common-sql = {workspace = true}
|
|
|
105
105
|
apache-airflow-providers-standard = {workspace = true}
|
|
106
106
|
|
|
107
107
|
[project.urls]
|
|
108
|
-
"Documentation" = "https://airflow.apache.org/docs/apache-airflow-providers-openlineage/2.
|
|
109
|
-
"Changelog" = "https://airflow.apache.org/docs/apache-airflow-providers-openlineage/2.
|
|
108
|
+
"Documentation" = "https://airflow.apache.org/docs/apache-airflow-providers-openlineage/2.2.0"
|
|
109
|
+
"Changelog" = "https://airflow.apache.org/docs/apache-airflow-providers-openlineage/2.2.0/changelog.html"
|
|
110
110
|
"Bug Tracker" = "https://github.com/apache/airflow/issues"
|
|
111
111
|
"Source Code" = "https://github.com/apache/airflow"
|
|
112
112
|
"Slack Chat" = "https://s.apache.org/airflow-slack"
|
|
@@ -29,7 +29,7 @@ from airflow import __version__ as airflow_version
|
|
|
29
29
|
|
|
30
30
|
__all__ = ["__version__"]
|
|
31
31
|
|
|
32
|
-
__version__ = "2.
|
|
32
|
+
__version__ = "2.2.0"
|
|
33
33
|
|
|
34
34
|
if packaging.version.parse(packaging.version.parse(airflow_version).base_version) < packaging.version.parse(
|
|
35
35
|
"2.9.0"
|
|
@@ -298,12 +298,11 @@ class ExtractorManager(LoggingMixin):
|
|
|
298
298
|
|
|
299
299
|
if isinstance(obj, Dataset):
|
|
300
300
|
return obj
|
|
301
|
-
|
|
301
|
+
if isinstance(obj, Table):
|
|
302
302
|
return ExtractorManager.convert_to_ol_dataset_from_table(obj)
|
|
303
|
-
|
|
303
|
+
if isinstance(obj, File):
|
|
304
304
|
return ExtractorManager.convert_to_ol_dataset_from_object_storage_uri(obj.url)
|
|
305
|
-
|
|
306
|
-
return None
|
|
305
|
+
return None
|
|
307
306
|
|
|
308
307
|
def validate_task_metadata(self, task_metadata) -> OperatorLineage | None:
|
|
309
308
|
try:
|
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
# under the License.
|
|
17
17
|
from __future__ import annotations
|
|
18
18
|
|
|
19
|
+
import os
|
|
19
20
|
import traceback
|
|
20
21
|
from contextlib import ExitStack
|
|
21
22
|
from typing import TYPE_CHECKING
|
|
@@ -36,6 +37,7 @@ from openlineage.client.facet_v2 import (
|
|
|
36
37
|
)
|
|
37
38
|
from openlineage.client.uuid import generate_static_uuid
|
|
38
39
|
|
|
40
|
+
from airflow.configuration import conf as airflow_conf
|
|
39
41
|
from airflow.providers.openlineage import __version__ as OPENLINEAGE_PROVIDER_VERSION, conf
|
|
40
42
|
from airflow.providers.openlineage.utils.utils import (
|
|
41
43
|
OpenLineageRedactor,
|
|
@@ -81,6 +83,11 @@ class OpenLineageAdapter(LoggingMixin):
|
|
|
81
83
|
|
|
82
84
|
def get_or_create_openlineage_client(self) -> OpenLineageClient:
|
|
83
85
|
if not self._client:
|
|
86
|
+
# If not already set explicitly - propagate airflow logging level to OpenLineage client
|
|
87
|
+
airflow_core_log_level = airflow_conf.get("logging", "logging_level", fallback="INFO")
|
|
88
|
+
if not os.getenv("OPENLINEAGE_CLIENT_LOGGING") and airflow_core_log_level != "INFO":
|
|
89
|
+
os.environ["OPENLINEAGE_CLIENT_LOGGING"] = airflow_core_log_level
|
|
90
|
+
|
|
84
91
|
config = self.get_openlineage_config()
|
|
85
92
|
if config:
|
|
86
93
|
self.log.debug(
|
|
@@ -102,8 +109,7 @@ class OpenLineageAdapter(LoggingMixin):
|
|
|
102
109
|
if openlineage_config_path:
|
|
103
110
|
config = self._read_yaml_config(openlineage_config_path)
|
|
104
111
|
return config
|
|
105
|
-
|
|
106
|
-
self.log.debug("OpenLineage config_path configuration not found.")
|
|
112
|
+
self.log.debug("OpenLineage config_path configuration not found.")
|
|
107
113
|
|
|
108
114
|
# Second, try to get transport config
|
|
109
115
|
transport_config = conf.transport()
|
|
@@ -28,9 +28,9 @@ from setproctitle import getproctitle, setproctitle
|
|
|
28
28
|
|
|
29
29
|
from airflow import settings
|
|
30
30
|
from airflow.listeners import hookimpl
|
|
31
|
-
from airflow.models import DagRun
|
|
31
|
+
from airflow.models import DagRun, TaskInstance
|
|
32
32
|
from airflow.providers.openlineage import conf
|
|
33
|
-
from airflow.providers.openlineage.extractors import ExtractorManager
|
|
33
|
+
from airflow.providers.openlineage.extractors import ExtractorManager, OperatorLineage
|
|
34
34
|
from airflow.providers.openlineage.plugins.adapter import OpenLineageAdapter, RunState
|
|
35
35
|
from airflow.providers.openlineage.utils.utils import (
|
|
36
36
|
AIRFLOW_V_2_10_PLUS,
|
|
@@ -53,7 +53,6 @@ from airflow.utils.state import TaskInstanceState
|
|
|
53
53
|
from airflow.utils.timeout import timeout
|
|
54
54
|
|
|
55
55
|
if TYPE_CHECKING:
|
|
56
|
-
from airflow.models import TaskInstance
|
|
57
56
|
from airflow.sdk.execution_time.task_runner import RuntimeTaskInstance
|
|
58
57
|
from airflow.settings import Session
|
|
59
58
|
|
|
@@ -235,10 +234,18 @@ class OpenLineageListener:
|
|
|
235
234
|
|
|
236
235
|
@hookimpl
|
|
237
236
|
def on_task_instance_success(
|
|
238
|
-
self, previous_state: TaskInstanceState, task_instance: RuntimeTaskInstance
|
|
237
|
+
self, previous_state: TaskInstanceState, task_instance: RuntimeTaskInstance | TaskInstance
|
|
239
238
|
) -> None:
|
|
240
239
|
self.log.debug("OpenLineage listener got notification about task instance success")
|
|
241
240
|
|
|
241
|
+
if isinstance(task_instance, TaskInstance):
|
|
242
|
+
self._on_task_instance_manual_state_change(
|
|
243
|
+
ti=task_instance,
|
|
244
|
+
dagrun=task_instance.dag_run,
|
|
245
|
+
ti_state=TaskInstanceState.SUCCESS,
|
|
246
|
+
)
|
|
247
|
+
return
|
|
248
|
+
|
|
242
249
|
context = task_instance.get_template_context()
|
|
243
250
|
task = context["task"]
|
|
244
251
|
if TYPE_CHECKING:
|
|
@@ -338,10 +345,20 @@ class OpenLineageListener:
|
|
|
338
345
|
def on_task_instance_failed(
|
|
339
346
|
self,
|
|
340
347
|
previous_state: TaskInstanceState,
|
|
341
|
-
task_instance: TaskInstance,
|
|
348
|
+
task_instance: RuntimeTaskInstance | TaskInstance,
|
|
342
349
|
error: None | str | BaseException,
|
|
343
350
|
) -> None:
|
|
344
351
|
self.log.debug("OpenLineage listener got notification about task instance failure")
|
|
352
|
+
|
|
353
|
+
if isinstance(task_instance, TaskInstance):
|
|
354
|
+
self._on_task_instance_manual_state_change(
|
|
355
|
+
ti=task_instance,
|
|
356
|
+
dagrun=task_instance.dag_run,
|
|
357
|
+
ti_state=TaskInstanceState.FAILED,
|
|
358
|
+
error=error,
|
|
359
|
+
)
|
|
360
|
+
return
|
|
361
|
+
|
|
345
362
|
context = task_instance.get_template_context()
|
|
346
363
|
task = context["task"]
|
|
347
364
|
if TYPE_CHECKING:
|
|
@@ -457,6 +474,60 @@ class OpenLineageListener:
|
|
|
457
474
|
|
|
458
475
|
self._execute(on_failure, "on_failure", use_fork=True)
|
|
459
476
|
|
|
477
|
+
def _on_task_instance_manual_state_change(
|
|
478
|
+
self,
|
|
479
|
+
ti: TaskInstance,
|
|
480
|
+
dagrun: DagRun,
|
|
481
|
+
ti_state: TaskInstanceState,
|
|
482
|
+
error: None | str | BaseException = None,
|
|
483
|
+
) -> None:
|
|
484
|
+
self.log.debug("`_on_task_instance_manual_state_change` was called with state: `%s`.", ti_state)
|
|
485
|
+
end_date = timezone.utcnow()
|
|
486
|
+
|
|
487
|
+
@print_warning(self.log)
|
|
488
|
+
def on_state_change():
|
|
489
|
+
date = dagrun.logical_date or dagrun.run_after
|
|
490
|
+
parent_run_id = self.adapter.build_dag_run_id(
|
|
491
|
+
dag_id=dagrun.dag_id,
|
|
492
|
+
logical_date=date,
|
|
493
|
+
clear_number=dagrun.clear_number,
|
|
494
|
+
)
|
|
495
|
+
|
|
496
|
+
task_uuid = self.adapter.build_task_instance_run_id(
|
|
497
|
+
dag_id=dagrun.dag_id,
|
|
498
|
+
task_id=ti.task_id,
|
|
499
|
+
try_number=ti.try_number,
|
|
500
|
+
logical_date=date,
|
|
501
|
+
map_index=ti.map_index,
|
|
502
|
+
)
|
|
503
|
+
|
|
504
|
+
adapter_kwargs = {
|
|
505
|
+
"run_id": task_uuid,
|
|
506
|
+
"job_name": get_job_name(ti),
|
|
507
|
+
"parent_job_name": dagrun.dag_id,
|
|
508
|
+
"parent_run_id": parent_run_id,
|
|
509
|
+
"end_time": end_date.isoformat(),
|
|
510
|
+
"task": OperatorLineage(),
|
|
511
|
+
"run_facets": get_airflow_debug_facet(),
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
if ti_state == TaskInstanceState.FAILED:
|
|
515
|
+
event_type = RunState.FAIL.value.lower()
|
|
516
|
+
redacted_event = self.adapter.fail_task(**adapter_kwargs, error=error)
|
|
517
|
+
elif ti_state == TaskInstanceState.SUCCESS:
|
|
518
|
+
event_type = RunState.COMPLETE.value.lower()
|
|
519
|
+
redacted_event = self.adapter.complete_task(**adapter_kwargs)
|
|
520
|
+
else:
|
|
521
|
+
raise ValueError(f"Unsupported ti_state: `{ti_state}`.")
|
|
522
|
+
|
|
523
|
+
operator_name = ti.operator.lower()
|
|
524
|
+
Stats.gauge(
|
|
525
|
+
f"ol.event.size.{event_type}.{operator_name}",
|
|
526
|
+
len(Serde.to_json(redacted_event).encode("utf-8")),
|
|
527
|
+
)
|
|
528
|
+
|
|
529
|
+
self._execute(on_state_change, "on_state_change", use_fork=True)
|
|
530
|
+
|
|
460
531
|
def _execute(self, callable, callable_name: str, use_fork: bool = False):
|
|
461
532
|
if use_fork:
|
|
462
533
|
self._fork_execute(callable, callable_name)
|
|
@@ -111,7 +111,7 @@ def _get_transport_information_as_spark_properties() -> dict:
|
|
|
111
111
|
props = _format_transport(props, http_transport, name)
|
|
112
112
|
return props
|
|
113
113
|
|
|
114
|
-
|
|
114
|
+
if transport.kind == "http":
|
|
115
115
|
return _format_transport({}, _get_transport_information(transport), None)
|
|
116
116
|
|
|
117
117
|
log.info(
|
|
@@ -54,7 +54,9 @@ from airflow.providers.openlineage.version_compat import AIRFLOW_V_2_10_PLUS, AI
|
|
|
54
54
|
from airflow.sensors.base import BaseSensorOperator
|
|
55
55
|
from airflow.serialization.serialized_objects import SerializedBaseOperator
|
|
56
56
|
from airflow.utils.module_loading import import_string
|
|
57
|
-
|
|
57
|
+
|
|
58
|
+
if not AIRFLOW_V_3_0_PLUS:
|
|
59
|
+
from airflow.utils.session import NEW_SESSION, provide_session
|
|
58
60
|
|
|
59
61
|
try:
|
|
60
62
|
from airflow.sdk import BaseOperator as SdkBaseOperator
|
|
@@ -195,40 +197,41 @@ def is_selective_lineage_enabled(obj: DAG | BaseOperator | MappedOperator | SdkB
|
|
|
195
197
|
return True
|
|
196
198
|
if isinstance(obj, DAG):
|
|
197
199
|
return is_dag_lineage_enabled(obj)
|
|
198
|
-
|
|
200
|
+
if isinstance(obj, (BaseOperator, MappedOperator, SdkBaseOperator)):
|
|
199
201
|
return is_task_lineage_enabled(obj)
|
|
200
|
-
|
|
201
|
-
raise TypeError("is_selective_lineage_enabled can only be used on DAG or Operator objects")
|
|
202
|
+
raise TypeError("is_selective_lineage_enabled can only be used on DAG or Operator objects")
|
|
202
203
|
|
|
203
204
|
|
|
204
|
-
|
|
205
|
-
def is_ti_rescheduled_already(ti: TaskInstance, session=NEW_SESSION):
|
|
206
|
-
from sqlalchemy import exists
|
|
205
|
+
if not AIRFLOW_V_3_0_PLUS:
|
|
207
206
|
|
|
208
|
-
|
|
209
|
-
|
|
207
|
+
@provide_session
|
|
208
|
+
def is_ti_rescheduled_already(ti: TaskInstance, session=NEW_SESSION):
|
|
209
|
+
from sqlalchemy import exists
|
|
210
210
|
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
211
|
+
if not isinstance(ti.task, BaseSensorOperator):
|
|
212
|
+
return False
|
|
213
|
+
|
|
214
|
+
if not ti.task.reschedule:
|
|
215
|
+
return False
|
|
216
|
+
if AIRFLOW_V_3_0_PLUS:
|
|
217
|
+
return (
|
|
218
|
+
session.query(
|
|
219
|
+
exists().where(TaskReschedule.ti_id == ti.id, TaskReschedule.try_number == ti.try_number)
|
|
220
|
+
).scalar()
|
|
221
|
+
is True
|
|
222
|
+
)
|
|
214
223
|
return (
|
|
215
224
|
session.query(
|
|
216
|
-
exists().where(
|
|
225
|
+
exists().where(
|
|
226
|
+
TaskReschedule.dag_id == ti.dag_id,
|
|
227
|
+
TaskReschedule.task_id == ti.task_id,
|
|
228
|
+
TaskReschedule.run_id == ti.run_id,
|
|
229
|
+
TaskReschedule.map_index == ti.map_index,
|
|
230
|
+
TaskReschedule.try_number == ti.try_number,
|
|
231
|
+
)
|
|
217
232
|
).scalar()
|
|
218
233
|
is True
|
|
219
234
|
)
|
|
220
|
-
return (
|
|
221
|
-
session.query(
|
|
222
|
-
exists().where(
|
|
223
|
-
TaskReschedule.dag_id == ti.dag_id,
|
|
224
|
-
TaskReschedule.task_id == ti.task_id,
|
|
225
|
-
TaskReschedule.run_id == ti.run_id,
|
|
226
|
-
TaskReschedule.map_index == ti.map_index,
|
|
227
|
-
TaskReschedule.try_number == ti.try_number,
|
|
228
|
-
)
|
|
229
|
-
).scalar()
|
|
230
|
-
is True
|
|
231
|
-
)
|
|
232
235
|
|
|
233
236
|
|
|
234
237
|
class InfoJsonEncodable(dict):
|
|
@@ -322,6 +325,7 @@ class DagInfo(InfoJsonEncodable):
|
|
|
322
325
|
"description",
|
|
323
326
|
"fileloc",
|
|
324
327
|
"owner",
|
|
328
|
+
"owner_links",
|
|
325
329
|
"schedule_interval", # For Airflow 2.
|
|
326
330
|
"timetable_summary", # For Airflow 3.
|
|
327
331
|
"start_date",
|
|
@@ -713,7 +717,7 @@ class OpenLineageRedactor(SecretsMasker):
|
|
|
713
717
|
),
|
|
714
718
|
)
|
|
715
719
|
return item
|
|
716
|
-
|
|
720
|
+
if is_json_serializable(item) and hasattr(item, "__dict__"):
|
|
717
721
|
for dict_key, subval in item.__dict__.items():
|
|
718
722
|
if type(subval).__name__ == "Proxy":
|
|
719
723
|
return "<<non-redactable: Proxy>>"
|
|
@@ -729,8 +733,7 @@ class OpenLineageRedactor(SecretsMasker):
|
|
|
729
733
|
),
|
|
730
734
|
)
|
|
731
735
|
return item
|
|
732
|
-
|
|
733
|
-
return super()._redact(item, name, depth, max_depth)
|
|
736
|
+
return super()._redact(item, name, depth, max_depth)
|
|
734
737
|
except Exception as exc:
|
|
735
738
|
log.warning("Unable to redact %r. Error was: %s: %s", item, type(exc).__name__, exc)
|
|
736
739
|
return item
|
|
@@ -82,7 +82,7 @@ def env_var(var: str, default: str | None = None) -> str:
|
|
|
82
82
|
"""
|
|
83
83
|
if var in os.environ:
|
|
84
84
|
return os.environ[var]
|
|
85
|
-
|
|
85
|
+
if default is not None:
|
|
86
86
|
return default
|
|
87
87
|
raise ValueError(f"Env var required but not provided: '{var}'")
|
|
88
88
|
|
|
@@ -166,7 +166,7 @@ def match(expected, result, env: Environment) -> bool:
|
|
|
166
166
|
return True
|
|
167
167
|
log.error("Rendered value %s does not equal 'true' or %s", rendered, result)
|
|
168
168
|
return False
|
|
169
|
-
|
|
169
|
+
if expected != result:
|
|
170
170
|
log.error("Expected value %s does not equal result %s", expected, result)
|
|
171
171
|
return False
|
|
172
172
|
elif expected != result:
|
|
@@ -61,6 +61,21 @@ from tests_common.test_utils.version_compat import AIRFLOW_V_3_0_PLUS
|
|
|
61
61
|
pytestmark = pytest.mark.db_test
|
|
62
62
|
|
|
63
63
|
|
|
64
|
+
@pytest.mark.parametrize(
|
|
65
|
+
"env_vars, expected_logging",
|
|
66
|
+
[
|
|
67
|
+
({"AIRFLOW__LOGGING__LOGGING_LEVEL": "DEBUG"}, "DEBUG"),
|
|
68
|
+
({"AIRFLOW__LOGGING__LOGGING_LEVEL": "INFO"}, None),
|
|
69
|
+
({}, None), # When no value is provided, default should be INFO and propagation is skipped.
|
|
70
|
+
],
|
|
71
|
+
)
|
|
72
|
+
def test_create_client_logging_propagation(env_vars, expected_logging):
|
|
73
|
+
with patch.dict(os.environ, env_vars, clear=True):
|
|
74
|
+
assert os.getenv("OPENLINEAGE_CLIENT_LOGGING") is None
|
|
75
|
+
OpenLineageAdapter().get_or_create_openlineage_client()
|
|
76
|
+
assert os.getenv("OPENLINEAGE_CLIENT_LOGGING") == expected_logging
|
|
77
|
+
|
|
78
|
+
|
|
64
79
|
@patch.dict(
|
|
65
80
|
os.environ,
|
|
66
81
|
{"OPENLINEAGE_URL": "http://ol-api:5000", "OPENLINEAGE_API_KEY": "api-key"},
|