我使用Apache Airflow,我希望它在sla miss上发送电子邮件通知。我将电子邮件地址存储为气流变量,但我有一个问题,其中一项任务是使用EmailOperator发送电子邮件。
这里出现了问题,因为它在我的send-mail任务运行时会向所有收件人发送电子邮件,并且只会将sla missnotifaction仅发送到列表中的第一个地址,在我的示例中为test1@test.com 。
这是一个错误,还是为什么不起作用?
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>"
)
答案 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
中提供