Apache Airflow仅向列表中的第一人发送sla miss电子邮件

时间:2018-09-05 11:00:37

标签: airflow

我使用Apache Airflow,我希望它在sla miss上发送电子邮件通知。我将电子邮件地址存储为气流变量,但我有一个问题,其中一项任务是使用EmailOperator发送电子邮件。

这里出现了问题,因为它在我的send-mail任务运行时会向所有收件人发送电子邮件,并且只会将sla missnotifaction仅发送到列表中的第一个地址,在我的示例中为test1@test.com 。

这是一个错误,还是为什么不起作用?

这是我的dag和airlfow变量:  airflow variable

from airflow import DAG
from datetime import datetime, timedelta
from airflow.operators.email_operator import EmailOperator
from airflow.models import Variable
from airflow.operators.slack_operator import SlackAPIPostOperator

email = Variable.get("test_recipients")

args = {
    'owner': 'airflow'
    , 'depends_on_past': False
    , 'start_date': datetime(2018, 8, 20, 0, 0)
    , 'retries': 0
    , 'email': email
    , 'email_on_failure': True
    , 'email_on_retry': True
    , 'sla': timedelta(seconds=1)
}

dag = DAG('sla-email-test'
          , default_args=args
          , max_active_runs=1
          , schedule_interval="@daily")

....

t2 = EmailOperator(
    dag=dag,
    task_id="send-email",
    to=email,
    subject="Testing",
    html_content="<h3>Welcome to Airflow</h3>"
)

2 个答案:

答案 0 :(得分:1)

是的,目前在发送SLA电子邮件时,Airflow中存在一个错误-代码路径无法像任务失败电子邮件那样正确地用,分隔字符串。

目前的解决方法是使变量成为列表(即值为["test1@test.com","test2@test.com"]并按如下方式访问它:

email = Variable.get("test_recipients", deserialize_json=True)

在两种情况下(SLA和任务电子邮件)都应该起作用

答案 1 :(得分:0)

我不认为这是一个错误,我会说这是预期的行为。这是因为您要向"email1@example.com, email2@example.com"参数传递字符串email。如果要将此字符串用作python列表,可以执行以下操作:

test_receipients="email1@example.com, email2@example.com"

email = Variable.get("test_recipients")
args = {
    'owner': 'airflow'
    , 'depends_on_past': False
    , 'start_date': datetime(2018, 8, 20, 0, 0)
    , 'retries': 0
    , 'email': [email] # This will convert the string to python list
    , 'email_on_failure': True
    , 'email_on_retry': True
    , 'sla': timedelta(seconds=10)
}

通常,如果要将电子邮件发送到多个电子邮件地址,则应始终使用列表而不是字符串。

更新:我已在https://github.com/apache/incubator-airflow/pull/3869中修复此问题。这将在 Airflow 1.10.1

中提供