web-dev-qa-db-ja.com

Airflow-EmailOperator html_contentを動的にする方法は?

特定のEmailOperatorタスクによって送信された電子メールのコンテンツを動的に設定できるようにする方法を探しています。理想的には、できればhtml_content引数を使用して、xcom呼び出しの結果に応じて電子メールの内容を作成したいと思います。

alert = EmailOperator(
    task_id=alertTaskID,
    to='[email protected]',
    subject='Airflow processing report',
    html_content='raw content #2',
    dag=dag
)

Airflowのドキュメントには、xcom呼び出しをテンプレートに埋め込むことができると書かれていることに気付きました。おそらく、指定されたタスクIDのテンプレートを使用してxcomプルを作成し、その結果をhtml_contentとして渡す方法がありますか?ありがとう

9
Ziggy Eunicien

自分で答えた方がいいかもしれません。 template + xcomルートを使用するとかなり簡単であることがわかります。このコードスニペットは、すでに定義されているdagのコンテキストで機能します。テストが簡単なため、EmailOperatorの代わりにBashOperatorを使用します。

def pushparam(param, ds, **kwargs):
    kwargs['ti'].xcom_Push(key='specificKey', value=param)
    return 

loadxcom = PythonOperator(
    task_id='loadxcom',
    python_callable=pushparam,
    provide_context=True,        
    op_args=['your_message_here'],
    dag=dag)

template2 = """
    echo "{{ params.my_param }}"
    echo "{{ task_instance.xcom_pull(task_ids='loadxcom', key='specificKey') }}"
"""
t5 = BashOperator(
    task_id='tt2',
    bash_command=template2,
    params={'my_param': 'PARAMETER1'},
    dag=dag)

次のようなものを使用して、コマンドラインでテストできます。

airflow test dag_name loadxcom 2015-12-31
airflow test dag_name tt2 2015-12-31

最終的にEmailOperatorでテストし、機能しない場合はここに何かを追加します...

9
Ziggy Eunicien

EmailOperatorでjinjaテンプレートを使用する正確な例をお探しの方は、こちらをご覧ください。

from airflow.operators.email_operator import EmailOperator
from datetime import timedelta, datetime

email_task = EmailOperator(
    to='[email protected]',
    task_id='email_task',
    subject='Templated Subject: start_date {{ ds }}',
    params={'content1': 'random'},
    html_content="Templated Content: content1 - {{ params.content1 }}  task_key - {{ task_instance_key_str }} test_mode - {{ test_mode }} task_owner - {{ task.owner}} hostname - {{ ti.hostname }}",
    dag=dag)

上記のコードスニペットは、次を使用してテスト実行できます。

airflow test dag_name email_task 2017-05-10
7
Saurabh Mishra

代わりにPythonOperator + send_emailを使用してください。

from airflow.operators import PythonOperator
from airflow.utils.email import send_email


def email_callback(**kwargs):
    with open('/path/to.html') as f:
        content = f.read()
    send_email(
        to=[
            # emails
        ],
        subject='subject',
        html_content=content,
    )


email_task = PythonOperator(
    task_id='task_id',
    python_callable=email_callback,
    provide_context=True,
    dag=dag,
)
4
guyskk