Skip to content

render_template_as_native_obj=True in DAG constructor prevents failure e-mail from sending #22152

Description

@kyan113

Apache Airflow version

2.2.4 (latest released)

What happened

A DAG constructed with render_template_as_native_obj=True does not send an e-mail notification on task failure.

DAGs constructed without render_template_as_native_obj send e-mail notification as expected.

default_email_on_failure is set to True in airflow.cfg.

What you expected to happen

I expect DAGs to send an e-mail alert on task failure.

Logs for failed tasks show this:

Traceback (most recent call last):
  File "/home/airflow/.local/lib/python3.9/site-packages/airflow/models/taskinstance.py", line 1767, in handle_failure
    self.email_alert(error)
  File "/home/airflow/.local/lib/python3.9/site-packages/airflow/models/taskinstance.py", line 2101, in email_alert
    subject, html_content, html_content_err = self.get_email_subject_content(exception)
  File "/home/airflow/.local/lib/python3.9/site-packages/airflow/models/taskinstance.py", line 2093, in get_email_subject_content
    subject = render('subject_template', default_subject)
  File "/home/airflow/.local/lib/python3.9/site-packages/airflow/models/taskinstance.py", line 2091, in render
    return render_template_to_string(jinja_env.from_string(content), jinja_context)
  File "/home/airflow/.local/lib/python3.9/site-packages/airflow/utils/helpers.py", line 268, in render_template_to_string
    return render_template(template, context, native=False)
  File "/home/airflow/.local/lib/python3.9/site-packages/airflow/utils/helpers.py", line 263, in render_template
    return "".join(nodes)
TypeError: sequence item 1: expected str instance, TaskInstance found

How to reproduce

  1. Construct a DAG with render_template_as_native_obj=True with 'email_on_failure':True.
  2. Cause an error in a task. I used a PythonOperator with assert False.
  3. Task will fail, but no alert e-mail will be sent.
  4. Remove render_template_as_native_obj=True from DAG constructor.
  5. Re-run DAG
  6. Task will fail and alert e-mail will be sent.

I used the following for testing:

import datetime
from airflow.operators.python_operator import PythonOperator
from airflow.models import DAG

default_args = {
				'owner': 'me',
				'start_date': datetime.datetime(2022,3,9),
				'email_on_failure':True,
				'email':'[email protected]'
				}
				
dag = DAG(dag_id = 'dagname', 
          schedule_interval = '@once',
          default_args = default_args,
          render_template_as_native_obj = True, #comment this out to test
          )                 

def testfunc(**kwargs):    
    #intentional error
    assert False
        
task_testfunc = PythonOperator(
    task_id = "task_testfunc",
    python_callable=testfunc,
    dag=dag)
    
task_testfunc

Operating System

Red Hat Enterprise Linux Server 7.9 (Maipo)

Versions of Apache Airflow Providers

No response

Deployment

Docker-Compose

Deployment details

No response

Anything else

No response

Are you willing to submit PR?

  • Yes I am willing to submit a PR!

Code of Conduct

Activity

  1. boring-cyborg commented on Mar 10, 2022

    @boring-cyborg

    Thanks for opening your first issue here! Be sure to follow the issue template!

  2. uranusjr commented on Mar 11, 2022

    @uranusjr
    Member

    Would you fancy a pull request please? The fix should be fairly straightforward, by changing the offending line in render_template to this:

    return "".join((str(n) for n in nodes)

    Add a test can be added to ensure render_template works with non-str nodes.

  3. andyfcx commented on Mar 13, 2022

    @andyfcx

    I think return "".join((str(n) for n in nodes)
    might not work due to possible returning as generator string representations

  4. likecodingloveproblems commented on Mar 13, 2022

    @likecodingloveproblems
    Contributor

    Would I work on this issue please?

  5. kyan113 commented on Mar 13, 2022

    @kyan113
    Author

    If you'd like. I don't think I have the expertise to put together a pull request, so someone else will need to take a crack at it.

  6. uranusjr commented on Mar 13, 2022

    @uranusjr
    Member

    Please also see #22218 for some context.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions