Apache airflow отправляет электронные письма только первым лицам в списке - PullRequest
0 голосов
/ 05 сентября 2018

Я использую Apache Airflow, и я хотел бы, чтобы он отправлял уведомления по электронной почте по поводу отсутствия. Я храню адреса электронной почты как переменную airflow, и у меня есть знак, какая из его задач отправляет электронную почту с помощью EmailOperator.

И здесь возникает проблема, потому что, тем не менее, он отправляет электронные письма, когда моя задача отправки почты запускается всем получателям, Он отправляет уведомление о пропадании только по первому адресу в списке, что в моем примере означает 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 голосов
/ 05 сентября 2018

Я не считаю это ошибкой, я бы сказал, что это ожидаемое поведение. Это потому, что вы передаете строку "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. Это будет доступно в Воздушный поток 1.10.1

0 голосов
/ 05 сентября 2018

Да, в настоящее время существует ошибка в Airflow, когда речь идет об отправке электронных писем SLA - этот путь к коду неправильно разбивает строку на ,, как это делают электронные письма с ошибками при выполнении задач.

Короткий обходной путь сейчас состоит в том, чтобы сделать вашу переменную списком (то есть со значением ["test1@test.com","test2@test.com"] и получить к нему доступ как:

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

Это должно работать в обоих случаях (SLA и электронная почта задачи)

...