web-dev-qa-db-fra.com

Comment configurer la configuration de messagerie d'Airflow pour envoyer un e-mail en cas d'erreur?

J'essaie de faire échouer intentionnellement une tâche Airflow et de générer une erreur en passant une ligne Bash (thisshouldnotrun) qui ne fonctionne pas. Le flux d'air génère les informations suivantes:

[2017-06-15 17:44:17,869] {bash_operator.py:94} INFO - /tmp/airflowtmpLFTMX7/run_bashm2MEsS: line 7: thisshouldnotrun: command not found
[2017-06-15 17:44:17,869] {bash_operator.py:97} INFO - Command exited with return code 127
[2017-06-15 17:44:17,869] {models.py:1417} ERROR - Bash command failed
Traceback (most recent call last):
  File "/home/ubuntu/.local/lib/python2.7/site-packages/airflow/models.py", line 1374, in run
    result = task_copy.execute(context=context)
  File "/home/ubuntu/.local/lib/python2.7/site-packages/airflow/operators/bash_operator.py", line 100, in execute
    raise AirflowException("Bash command failed")
AirflowException: Bash command failed
[2017-06-15 17:44:17,871] {models.py:1433} INFO - Marking task as UP_FOR_RETRY
[2017-06-15 17:44:17,878] {models.py:1462} ERROR - Bash command failed
Traceback (most recent call last):
  File "/home/ubuntu/.local/bin/airflow", line 28, in <module>
    args.func(args)
  File "/home/ubuntu/.local/lib/python2.7/site-packages/airflow/bin/cli.py", line 585, in test
    ti.run(ignore_task_deps=True, ignore_ti_state=True, test_mode=True)
  File "/home/ubuntu/.local/lib/python2.7/site-packages/airflow/utils/db.py", line 53, in wrapper
    result = func(*args, **kwargs)
  File "/home/ubuntu/.local/lib/python2.7/site-packages/airflow/models.py", line 1374, in run
    result = task_copy.execute(context=context)
  File "/home/ubuntu/.local/lib/python2.7/site-packages/airflow/operators/bash_operator.py", line 100, in execute
    raise AirflowException("Bash command failed")
airflow.exceptions.AirflowException: Bash command failed

Airflow enverra-t-il un e-mail pour ce type d'erreurs? Sinon, quelle serait la meilleure façon d'envoyer un e-mail pour ces erreurs?

Je ne sais même pas si airflow.cfg est correctement configuré ... Étant donné que l'objectif ultime est de tester la notification d'alerte par e-mail, je veux m'assurer que airflow.cfg est correctement configuré. Voici la configuration:

[email]
email_backend = airflow.utils.email.send_email_smtp


[smtp]
# If you want airflow to send emails on retries, failure, and you want to use
# the airflow.utils.email.send_email_smtp function, you have to configure an
# smtp server here
smtp_Host = emailsmtpserver.region.amazonaws.com 
smtp_starttls = True
smtp_ssl = False
# Uncomment and set the user/pass settings if you want to use SMTP AUTH
# smtp_user = airflow_data_user
# smtp_password = password
smtp_port = 587 
smtp_mail_from = [email protected]

Quel est smtp_starttls? Je ne trouve aucune information à ce sujet dans la documentation ou en ligne. Si nous avons besoin d'une authentification à deux facteurs pour afficher les e-mails, cela posera-t-il un problème ici pour Airflow?

Voici ma commande Bash:

task1_bash_command = """
export PATH=/home/ubuntu/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
export rundate=`TZ='America/Los_Angeles' date +%F -d "yesterday"`
export AWS_CONFIG_FILE="/home/ubuntu/.aws/config"

/home/ubuntu/bin/snowsql -f //home/ubuntu/sql/script.sql 1> /home/ubuntu/logs/"$rundate"_dev.log 2> /home/ubuntu/logs/"$rundate"_error_dev.log

if [ -e /home/ubuntu/logs/"$rundate"_error_dev.log ]
then
    exit 64
fi

Et ma tâche:

task1 = BashOperator(
    task_id = 'run_bash',
    bash_command = task1_bash_command,
    dag = dag,
    retries = 2,
    email_on_failure = True,
    email = '[email protected]')
6
simplycoding

smtp_starttls signifie essentiellement utiliser TLS

Définissez ce paramètre sur False et définissez smtp_ssl à True si vous souhaitez utiliser SSL à la place. Vous avez probablement besoin de smtp_user et smtp_password pour l'un ou l'autre.

Airflow ne gérera pas l'authentification en 2 étapes. Cependant, si vous utilisez AWS, vous n'en aurez probablement pas besoin car vos informations d'identification SMTP (SES) sont différentes de vos informations d'identification AWS.

Voir ici .

EDIT: pour que airflow envoie un e-mail en cas d'échec, il y a quelques éléments qui doivent être définis pour votre tâche, email_on_failure et email.

Voir ici par exemple:

def throw_error(**context):
    raise ValueError('Intentionally throwing an error to send an email.')



t1 = PythonOperator(task_id='throw_error_and_email',
                    python_callable=throw_error,
                    provide_context=True,
                    email_on_failure=True,
                    email='[email protected]',
                    dag=dag)
8
jhnclvr