Skip to content

Fix Variable not found issue in Airflow 3#1684

Merged
tatiana merged 1 commit into
mainfrom
fix-variable-not-found-af3
Apr 22, 2025
Merged

Fix Variable not found issue in Airflow 3#1684
tatiana merged 1 commit into
mainfrom
fix-variable-not-found-af3

Conversation

@tatiana
Copy link
Copy Markdown
Collaborator

@tatiana tatiana commented Apr 22, 2025

In Airflow 2.x, the following DAG used to work (when specifying other mandatory fields):

import json

from airflow import DAG
from airflow.operators.empty import EmptyOperator
from airflow.models import Variable

try:
    variable_value = Variable.get("some-variable", deserialize_json=True)
except (json.decoder.JSONDecodeError, KeyError):
    variable_value = {"task_id": "default_task_name"}

with DAG(dag_id="example_dag_variable_access") as dag:
    task_from_var = EmptyOperator(task_id=variable_value.get("task_id"))
    task_from_var

In Airflow 3 (commit dda86263e8a9c171d91729f14668028408568022), if we try to parse it using:

airflow dag-processor

It fails and logs:

================================================================================
DAG File Processing Stats

Bundle       File Path                       PID    Current Duration      # DAGs    # Errors  Last Duration    Last Run At
-----------  ------------------------------  -----  ------------------  --------  ----------  ---------------  -------------------
dags-folder  example_dag_variable_access.py                                    0           1  0.62s            2025-04-22T11:02:54
================================================================================
[2025-04-22T12:03:25.160+0100] {manager.py:523} INFO - Not time to refresh bundle dags-folder
[2025-04-22T12:03:25.338+0100] {_client.py:1025} INFO - HTTP Request: GET http://in-process.invalid./variables/some-variable "HTTP/1.1 404 Not Found"
2025-04-22 12:03:25 [warning  ] Server error                   [airflow.sdk.api.client] detail={'detail': {'reason': 'not_found', 'message': "Variable with key 'some-variable' not found"}}
2025-04-22 12:03:25 [error    ] Variable not found             [airflow.sdk.api.client] detail={'detail': {'reason': 'not_found', 'message': "Variable with key 'some-variable' not found"}} key=some-variable status_code=404

We're resolving this problem in Cosmos by capturing AirflowRuntimeError exceptions, when needed:

from airflow.sdk.exceptions import AirflowRuntimeError

apache/airflow#49543

In Airflow 2.x, the following DAG used to work (when specifying other mandatory fields):

```
import json

from airflow import DAG
from airflow.operators.empty import EmptyOperator
from airflow.models import Variable

try:
    variable_value = Variable.get("some-variable", deserialize_json=True)
except (json.decoder.JSONDecodeError, KeyError):
    variable_value = {"task_id": "default_task_name"}

with DAG(dag_id="example_dag_variable_access") as dag:
    task_from_var = EmptyOperator(task_id=variable_value.get("task_id"))
    task_from_var
```

In Airflow 3 (commit `dda86263e8a9c171d91729f14668028408568022`), if we try to parse it using:
```
airflow dag-processor
```

It fails and logs:
```
================================================================================
DAG File Processing Stats

Bundle       File Path                       PID    Current Duration      # DAGs    # Errors  Last Duration    Last Run At
-----------  ------------------------------  -----  ------------------  --------  ----------  ---------------  -------------------
dags-folder  example_dag_variable_access.py                                    0           1  0.62s            2025-04-22T11:02:54
================================================================================
[2025-04-22T12:03:25.160+0100] {manager.py:523} INFO - Not time to refresh bundle dags-folder
[2025-04-22T12:03:25.338+0100] {_client.py:1025} INFO - HTTP Request: GET http://in-process.invalid./variables/some-variable "HTTP/1.1 404 Not Found"
2025-04-22 12:03:25 [warning  ] Server error                   [airflow.sdk.api.client] detail={'detail': {'reason': 'not_found', 'message': "Variable with key 'some-variable' not found"}}
2025-04-22 12:03:25 [error    ] Variable not found             [airflow.sdk.api.client] detail={'detail': {'reason': 'not_found', 'message': "Variable with key 'some-variable' not found"}} key=some-variable status_code=404
```

We're resolving this problem in Cosmos by capturing AirflowRuntimeError exceptions, when needed:
```
from airflow.sdk.exceptions import AirflowRuntimeError
```

apache/airflow#49543
Copilot AI review requested due to automatic review settings April 22, 2025 12:46
@dosubot dosubot Bot added the size:S This PR changes 10-29 lines, ignoring generated files. label Apr 22, 2025
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This PR addresses the issue of Airflow variable not found errors in Airflow 3 by broadening the exception handling to include AirflowRuntimeError where appropriate.

  • Updated exception handling to include AirflowRuntimeError via dynamic import and list extension.
  • Modified the exception tuple in the try/except block to use the variable containing the list of exceptions.
Comments suppressed due to low confidence (1)

cosmos/dbt/graph.py:511

  • [nitpick] Consider adding an inline comment explaining the rationale for dynamically constructing the exception tuple for clarity to future maintainers.
except tuple(airflow_variable_exceptions):

@dosubot dosubot Bot added the area:parsing Related to parsing DAG/DBT improvement, issues, or fixes label Apr 22, 2025
@netlify
Copy link
Copy Markdown

netlify Bot commented Apr 22, 2025

Deploy Preview for sunny-pastelito-5ecb04 canceled.

Name Link
🔨 Latest commit f84a800
🔍 Latest deploy log https://app.netlify.com/sites/sunny-pastelito-5ecb04/deploys/68078f9c74b4ed000824d826

@cloudflare-workers-and-pages
Copy link
Copy Markdown

Deploying astronomer-cosmos with  Cloudflare Pages  Cloudflare Pages

Latest commit: f84a800
Status: ✅  Deploy successful!
Preview URL: https://63c58cb6.astronomer-cosmos.pages.dev
Branch Preview URL: https://fix-variable-not-found-af3.astronomer-cosmos.pages.dev

View logs

@codecov
Copy link
Copy Markdown

codecov Bot commented Apr 22, 2025

Codecov Report

Attention: Patch coverage is 85.71429% with 1 line in your changes missing coverage. Please review.

Project coverage is 97.43%. Comparing base (156da56) to head (f84a800).
Report is 1 commits behind head on main.

Files with missing lines Patch % Lines
cosmos/dbt/graph.py 85.71% 1 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main    #1684      +/-   ##
==========================================
- Coverage   97.44%   97.43%   -0.02%     
==========================================
  Files          80       80              
  Lines        5018     5024       +6     
==========================================
+ Hits         4890     4895       +5     
- Misses        128      129       +1     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@tatiana
Copy link
Copy Markdown
Collaborator Author

tatiana commented Apr 22, 2025

The coverage issues will be solved once we merge #1646

@tatiana tatiana merged commit 4604ac5 into main Apr 22, 2025
72 of 74 checks passed
@tatiana tatiana deleted the fix-variable-not-found-af3 branch April 22, 2025 14:27
@pankajkoti pankajkoti mentioned this pull request Apr 30, 2025
@tatiana tatiana added this to the Cosmos 1.10.0 milestone Apr 30, 2025
tatiana added a commit that referenced this pull request May 1, 2025
Features

* Airflow 3 support
* Support running ``dbt deps`` incrementally to pre-defined
``dbt_packages`` by @tatiana in #1668 and #1670
* Add ``DuckDB`` profile mapping by @prithvijitguha and @pankajastro in
#1553
* Implement DBT exposure selector by ghjklw #1717

Bug Fixes

* Fix ``test_indirect_selection`` flag to be propagated in case of
``TestBehavior.BUILD`` by @corsettigyg in #1663
* Fix ``select`` clause in the case of detached tests by @anyapriya in
#1680
* Operator argument fixes by @johnhoran in #1648


Airflow 3 Support

* Support rendering DbtDag in Airflow 3 by @tatiana and @ashb in #1657
* Refactor Rendered Task Instance Fields (RTIF) handling for Airflow 2.x
and 3.x by @pankajkoti in #1661
* Run cosmos operator in Airflow 3 by @pankajastro in #1642
* Fix ``python_virtualenv.prepare_env`` top-level import for Airflow 3
by @pankajkoti in #1678
* Fix Variable not found issue in Airflow 3 by @tatiana in #1684
* Disable CosmosPlugin on Airflow 3 setup by @pankajkoti in #1692, #1698
* Use ``schedule`` param in example DAGs instead of the 2.10 deprecated
and 3.0 removed ``schedule_interval`` by @pankajkoti in #1701
* Ensure ``virtualenv_dir`` path exists by @pankajkoti in #1724
* Support emitting Assets with Airflow 3 by @tatiana in #1713
* Add docs on Airflow 3 compatibility by @pankajkoti and @tatiana in
#1731
* Introduce, test and document asset/dataset breaking change by @tatiana
in #1672
* Improve dataset/asset driven scheduling documentation by @tatiana in
#1729

Enhancements

* Allow multiple callbacks by @corsettigyg #1693
* Refactor kubernetes warning callback handling by @canbekley in #1681

Documentation

* Add documentation related to ``copy_dbt_packages`` by @tatiana in
#1671
* Make wording and command consistent in the contributing doc by
@pankajkoti in #1697
* Add MonteCarlo callback example for importing dbt artifacts by
@corsettigyg #1695
* Change async feature to be non-experimental by @tatiana in #1732

Others

* Add sample ``dbt_packages`` to validate incremental ``dbt deps`` by
@tatiana in #1669
* Add kubernetes execution mode example in Airflow 3 by @pankajastro in
#1667
* Check only major version until Airflow 3 stable release by
@pankajastro in #1665
* Install Airflow from main branch by @pankajastro in #1660
* Add dev tool for Airflow 3 by @pankajastro and @tatiana in #1627
* Improve Airflow 3 tooling by @pankajastro in #1656
* Skip associating ``openlineage_events_completes`` to ``ti`` in Airflow
3 by @pankajkoti in #1662
* Add .gitignore file for the scripts/airflow3 directory by @pankajkoti
in #1658
* Remove ``original_jaffle_shop`` dbt project by @pankajkoti in #1676
* Fix or ignore type check error by @pankajastro in #1687
* Run virtualenv example with Airflow 3 tooling by @pankajastro in #1686
* Enable running setup/teardown tasks with Async execution DAG with
Airflow 3 tooling by @pankajastro in #1696
* Enable integration tests for the DuckDB adapter by @pankajastro in
#1699
* Add Airflow 3 tests matrix entries in CI by @pankajkoti in #1646
* Use a different way to get tasks count for asserting test_perf_dag by
@pankajkoti in #1714
* Reinstall Airflow 3 dependency on ``pydantic>=2.11`` for dbt adapter
versions 1.6 & 1.9 by @pankajkoti in #1715
* Fix outdated ``echo`` in Airflow 3 tooling script #1700
* Add files not needed for git tracking to .gitignore by @pankajkoti in
#1723
* Use latest minor versions for dbt adapters to get in compatibility
fixes by @pankajkoti in #1719
* Fix Airflow 3 tests raising generate_run_id() takes 0 positional
arguments by @tatiana in #1725
* Fix dataset tests failing in Airflow 3 by @tatiana in #1716
* Enable example DAGs to run in CI that were disabled in PR #1646 by
@pankajkoti in #1726
* Pre-commit updates: #1666, #1653, #1641, #1682, #1720


Co-authored-by: Pankaj Koti <pankajkoti699@gmail.com>
Co-authored-by: Pankaj Singh
<98807258+pankajastro@users.noreply.github.com>

---------

Co-authored-by: Pankaj Koti <pankajkoti699@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:parsing Related to parsing DAG/DBT improvement, issues, or fixes size:S This PR changes 10-29 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants