apache-airflow-providers-openlineage 2.1.3__tar.gz → 2.2.0rc1__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.

Potentially problematic release.


This version of apache-airflow-providers-openlineage might be problematic. Click here for more details.

Files changed (88) hide show
  1. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/PKG-INFO +13 -13
  2. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/README.rst +5 -5
  3. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/docs/changelog.rst +20 -0
  4. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/docs/commits.rst +18 -1
  5. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/docs/guides/developer.rst +11 -3
  6. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/docs/index.rst +5 -5
  7. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/provider.yaml +2 -1
  8. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/pyproject.toml +8 -8
  9. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/src/airflow/providers/openlineage/__init__.py +1 -1
  10. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/src/airflow/providers/openlineage/extractors/manager.py +3 -4
  11. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/src/airflow/providers/openlineage/plugins/adapter.py +8 -2
  12. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/src/airflow/providers/openlineage/plugins/listener.py +76 -5
  13. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/src/airflow/providers/openlineage/utils/spark.py +1 -1
  14. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/src/airflow/providers/openlineage/utils/utils.py +31 -28
  15. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/tests/system/openlineage/operator.py +2 -2
  16. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/tests/unit/openlineage/plugins/test_adapter.py +15 -0
  17. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/tests/unit/openlineage/plugins/test_listener.py +147 -57
  18. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/tests/unit/openlineage/utils/test_utils.py +19 -0
  19. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/docs/.latest-doc-only-change.txt +0 -0
  20. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/docs/conf.py +0 -0
  21. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/docs/configurations-ref.rst +0 -0
  22. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/docs/guides/structure.rst +0 -0
  23. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/docs/guides/user.rst +0 -0
  24. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/docs/installing-providers-from-sources.rst +0 -0
  25. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/docs/integration-logos/openlineage.svg +0 -0
  26. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/docs/macros.rst +0 -0
  27. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/docs/security.rst +0 -0
  28. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/docs/supported_classes.rst +0 -0
  29. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/src/airflow/__init__.py +0 -0
  30. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/src/airflow/providers/__init__.py +0 -0
  31. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/src/airflow/providers/openlineage/LICENSE +0 -0
  32. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/src/airflow/providers/openlineage/conf.py +0 -0
  33. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/src/airflow/providers/openlineage/extractors/__init__.py +0 -0
  34. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/src/airflow/providers/openlineage/extractors/base.py +0 -0
  35. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/src/airflow/providers/openlineage/extractors/bash.py +0 -0
  36. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/src/airflow/providers/openlineage/extractors/python.py +0 -0
  37. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/src/airflow/providers/openlineage/facets/AirflowDagRunFacet.json +0 -0
  38. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/src/airflow/providers/openlineage/facets/AirflowDebugRunFacet.json +0 -0
  39. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/src/airflow/providers/openlineage/facets/AirflowJobFacet.json +0 -0
  40. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/src/airflow/providers/openlineage/facets/AirflowRunFacet.json +0 -0
  41. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/src/airflow/providers/openlineage/facets/AirflowStateRunFacet.json +0 -0
  42. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/src/airflow/providers/openlineage/facets/__init__.py +0 -0
  43. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/src/airflow/providers/openlineage/get_provider_info.py +0 -0
  44. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/src/airflow/providers/openlineage/plugins/__init__.py +0 -0
  45. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/src/airflow/providers/openlineage/plugins/facets.py +0 -0
  46. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/src/airflow/providers/openlineage/plugins/macros.py +0 -0
  47. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/src/airflow/providers/openlineage/plugins/openlineage.py +0 -0
  48. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/src/airflow/providers/openlineage/sqlparser.py +0 -0
  49. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/src/airflow/providers/openlineage/utils/__init__.py +0 -0
  50. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/src/airflow/providers/openlineage/utils/selective_enable.py +0 -0
  51. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/src/airflow/providers/openlineage/utils/sql.py +0 -0
  52. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/src/airflow/providers/openlineage/version_compat.py +0 -0
  53. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/tests/conftest.py +0 -0
  54. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/tests/integration/__init__.py +0 -0
  55. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/tests/integration/openlineage/__init__.py +0 -0
  56. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/tests/integration/openlineage/operators/__init__.py +0 -0
  57. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/tests/system/__init__.py +0 -0
  58. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/tests/system/openlineage/__init__.py +0 -0
  59. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/tests/system/openlineage/conftest.py +0 -0
  60. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/tests/system/openlineage/example_openlineage.json +0 -0
  61. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/tests/system/openlineage/example_openlineage.py +0 -0
  62. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/tests/system/openlineage/example_openlineage_mapped_sensor.json +0 -0
  63. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/tests/system/openlineage/example_openlineage_mapped_sensor.py +0 -0
  64. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/tests/system/openlineage/transport/__init__.py +0 -0
  65. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/tests/system/openlineage/transport/variable.py +0 -0
  66. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/tests/unit/__init__.py +0 -0
  67. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/tests/unit/openlineage/__init__.py +0 -0
  68. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/tests/unit/openlineage/extractors/__init__.py +0 -0
  69. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/tests/unit/openlineage/extractors/test_base.py +0 -0
  70. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/tests/unit/openlineage/extractors/test_bash.py +0 -0
  71. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/tests/unit/openlineage/extractors/test_manager.py +0 -0
  72. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/tests/unit/openlineage/extractors/test_python.py +0 -0
  73. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/tests/unit/openlineage/log_config.py +0 -0
  74. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/tests/unit/openlineage/plugins/__init__.py +0 -0
  75. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/tests/unit/openlineage/plugins/openlineage_configs/__init__.py +0 -0
  76. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/tests/unit/openlineage/plugins/openlineage_configs/http.yaml +0 -0
  77. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/tests/unit/openlineage/plugins/test_execution.py +0 -0
  78. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/tests/unit/openlineage/plugins/test_facets.py +0 -0
  79. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/tests/unit/openlineage/plugins/test_macros.py +0 -0
  80. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/tests/unit/openlineage/plugins/test_openlineage.py +0 -0
  81. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/tests/unit/openlineage/plugins/test_utils.py +0 -0
  82. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/tests/unit/openlineage/test_conf.py +0 -0
  83. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/tests/unit/openlineage/test_sqlparser.py +0 -0
  84. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/tests/unit/openlineage/utils/__init__.py +0 -0
  85. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/tests/unit/openlineage/utils/custom_facet_fixture.py +0 -0
  86. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/tests/unit/openlineage/utils/test_selective_enable.py +0 -0
  87. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/tests/unit/openlineage/utils/test_spark.py +0 -0
  88. {apache_airflow_providers_openlineage-2.1.3 → apache_airflow_providers_openlineage-2.2.0rc1}/tests/unit/openlineage/utils/test_sql.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: apache-airflow-providers-openlineage
3
- Version: 2.1.3
3
+ Version: 2.2.0rc1
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>
@@ -20,15 +20,15 @@ Classifier: Programming Language :: Python :: 3.10
20
20
  Classifier: Programming Language :: Python :: 3.11
21
21
  Classifier: Programming Language :: Python :: 3.12
22
22
  Classifier: Topic :: System :: Monitoring
23
- Requires-Dist: apache-airflow>=2.9.0
24
- Requires-Dist: apache-airflow-providers-common-sql>=1.20.0
25
- Requires-Dist: apache-airflow-providers-common-compat>=1.4.0
23
+ Requires-Dist: apache-airflow>=2.9.0rc0
24
+ Requires-Dist: apache-airflow-providers-common-sql>=1.20.0rc0
25
+ Requires-Dist: apache-airflow-providers-common-compat>=1.4.0rc0
26
26
  Requires-Dist: attrs>=22.2
27
- Requires-Dist: openlineage-integration-common>=1.24.2
28
- Requires-Dist: openlineage-python>=1.24.2
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.1.3/changelog.html
31
- Project-URL: Documentation, https://airflow.apache.org/docs/apache-airflow-providers-openlineage/2.1.3
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.1.3``
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.1.3/>`_.
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.24.2``
97
- ``openlineage-python`` ``>=1.24.2``
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.1.3/changelog.html>`_.
121
+ `changelog <https://airflow.apache.org/docs/apache-airflow-providers-openlineage/2.2.0/changelog.html>`_.
122
122
 
@@ -23,7 +23,7 @@
23
23
 
24
24
  Package ``apache-airflow-providers-openlineage``
25
25
 
26
- Release: ``2.1.3``
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.1.3/>`_.
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.24.2``
61
- ``openlineage-python`` ``>=1.24.2``
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.1.3/changelog.html>`_.
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-09
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 the `Airflow logging level <https://airflow.apache.org/docs/apache-airflow/stable/configurations-ref.html#logging-level>`_
508
- is set to ``DEBUG`` and that the :ref:`debug_mode <options:debug_mode>` is enabled for OpenLineage integration.
509
- This will increase the detail in Airflow logs and include additional environmental information in OpenLineage events.
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.1.3
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.24.2``
112
- ``openlineage-python`` ``>=1.24.2``
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.1.3 sdist package <https://downloads.apache.org/airflow/providers/apache_airflow_providers_openlineage-2.1.3.tar.gz>`_ (`asc <https://downloads.apache.org/airflow/providers/apache_airflow_providers_openlineage-2.1.3.tar.gz.asc>`__, `sha512 <https://downloads.apache.org/airflow/providers/apache_airflow_providers_openlineage-2.1.3.tar.gz.sha512>`__)
142
- * `The apache-airflow-providers-openlineage 2.1.3 wheel package <https://downloads.apache.org/airflow/providers/apache_airflow_providers_openlineage-2.1.3-py3-none-any.whl>`_ (`asc <https://downloads.apache.org/airflow/providers/apache_airflow_providers_openlineage-2.1.3-py3-none-any.whl.asc>`__, `sha512 <https://downloads.apache.org/airflow/providers/apache_airflow_providers_openlineage-2.1.3-py3-none-any.whl.sha512>`__)
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: 1744282175
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.1.3"
28
+ version = "2.2.0.rc1"
29
29
  description = "Provider package apache-airflow-providers-openlineage for Apache Airflow"
30
30
  readme = "README.rst"
31
31
  authors = [
@@ -57,12 +57,12 @@ requires-python = "~=3.9"
57
57
  # Make sure to run ``breeze static-checks --type update-providers-dependencies --all-files``
58
58
  # After you modify the dependencies, and rebuild your Breeze CI image with ``breeze ci-image build``
59
59
  dependencies = [
60
- "apache-airflow>=2.9.0",
61
- "apache-airflow-providers-common-sql>=1.20.0",
62
- "apache-airflow-providers-common-compat>=1.4.0",
60
+ "apache-airflow>=2.9.0rc0",
61
+ "apache-airflow-providers-common-sql>=1.20.0rc0",
62
+ "apache-airflow-providers-common-compat>=1.4.0rc0",
63
63
  "attrs>=22.2",
64
- "openlineage-integration-common>=1.24.2",
65
- "openlineage-python>=1.24.2",
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.1.3"
109
- "Changelog" = "https://airflow.apache.org/docs/apache-airflow-providers-openlineage/2.1.3/changelog.html"
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.1.3"
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
- elif isinstance(obj, Table):
301
+ if isinstance(obj, Table):
302
302
  return ExtractorManager.convert_to_ol_dataset_from_table(obj)
303
- elif isinstance(obj, File):
303
+ if isinstance(obj, File):
304
304
  return ExtractorManager.convert_to_ol_dataset_from_object_storage_uri(obj.url)
305
- else:
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
- else:
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
- elif transport.kind == "http":
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
- from airflow.utils.session import NEW_SESSION, provide_session
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
- elif isinstance(obj, (BaseOperator, MappedOperator, SdkBaseOperator)):
200
+ if isinstance(obj, (BaseOperator, MappedOperator, SdkBaseOperator)):
199
201
  return is_task_lineage_enabled(obj)
200
- else:
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
- @provide_session
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
- if not isinstance(ti.task, BaseSensorOperator):
209
- return False
207
+ @provide_session
208
+ def is_ti_rescheduled_already(ti: TaskInstance, session=NEW_SESSION):
209
+ from sqlalchemy import exists
210
210
 
211
- if not ti.task.reschedule:
212
- return False
213
- if AIRFLOW_V_3_0_PLUS:
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(TaskReschedule.ti_id == ti.id, TaskReschedule.try_number == ti.try_number)
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
- elif is_json_serializable(item) and hasattr(item, "__dict__"):
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
- else:
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
- elif default is not None:
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
- elif expected != result:
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"},