SLA не сохраняется в базе данных. Также не запускайте почту в воздушном потоке

Я успешно настроил smtp-сервер. также работает нормально в случае сбоя работы. Но я попытался установить промах SLA по ссылке ниже.

https://blog.clairvoyantsoft.com/airflow-service-level-agreement-sla-2f3c91cd84cc

mid = BashOperator(
task_id='mid',
sla=timedelta(seconds=5),
bash_command='sleep 10',
retries=0,
dag=dag,
)

Нет сохранения событий. Также я проверил, как показано ниже

Browse->SLA misses

Я пробовал больше. Не удалось уловить проблему.

даг определяется как:

args = {
  'owner': 'airflow',
  'start_date': datetime(2020, 11, 18),
  'catchup':False,
  'retries': 0,
  'provide_context': True,
  'email' : "[email protected]",
  'start_date': airflow.utils.dates.days_ago(n=0, minute=1),
  'priority_weight': 1,
  'email_on_failure' : True,
   'default_args':{
        'on_failure_callback': on_failure_callback,
    }
}
d = datetime(2020, 10, 30)



dag = DAG('MyApplication', start_date = d,on_failure_callback=on_failure_callback, schedule_interval = '@daily', default_args = args)

person Dev    schedule 19.11.2020    source источник
comment
Как определяется DAG? А аргументы по умолчанию?   -  person Philipp Johannis    schedule 20.11.2020
comment
Редактирование кода @PhilippJohannis для DAG.   -  person Dev    schedule 20.11.2020
comment
Хм, на первый взгляд все хорошо. Пробовали ли вы увеличить время сна до нескольких минут? Возможно, планировщик не достаточно быстр, чтобы зарегистрировать промах sla.   -  person Philipp Johannis    schedule 20.11.2020
comment
Ах! Вижу проблему - вижу ответ.   -  person Philipp Johannis    schedule 20.11.2020
comment
@PhilippJohannis, sla не сохраняется в базе данных.   -  person Dev    schedule 20.11.2020


Ответы (1)


Проблема, по-видимому, заключается в аргументах, а точнее в 'start_date': airflow.utils.dates.days_ago(n=0, minute=1), это означает, что start_date интерпретируется заново каждый раз, когда планировщик анализирует файл DAG. Вы должны указать статическую дату начала, например datetime(2020,11,18).

См. также Часто задаваемые вопросы по Airflow:

Мы не рекомендуем использовать динамические значения в качестве start_date, особенно datetime.now(), так как это может привести к путанице. Задача запускается, как только период закрывается, и теоретически @hourly DAG никогда не доберется до часа после этого, поскольку now() движется вперед.

Также мне кажется странным указание default_args внутри args.

person Philipp Johannis    schedule 20.11.2020
comment
default_args используется здесь для некоторого пользовательского события, которое может быть вызвано, здесь при сбое я вызываю пользовательский метод - person Dev; 20.11.2020
comment
SLA не сохраняет таблицу sla_miss - person Dev; 20.11.2020
comment
Вы установили фиксированную start_date? - person Philipp Johannis; 20.11.2020
comment
да, я исправил дату, но с датой проблем нет, если я увеличу время сна, она отправляет сообщения, но событие не сохраняется в базе данных. - person Dev; 20.11.2020
comment
но вложение default_args в args кажется неправильным. он должен быть непосредственно в args, поскольку вы указываете default_args = args в своей DAG, и это означает, что Airflow будет передавать все аргументы каждой задаче. Поэтому on_failure_callback должен быть похож на «email_on_failure» на том же уровне. - person Philipp Johannis; 20.11.2020
comment
Но динамическая установка даты начала влияет на SLA, поскольку она используется для расчета промаха SLA. - person Philipp Johannis; 20.11.2020
comment
Возможно также дать DAG новое имя при повторной попытке. Изменение дат начала и расписаний в существующей DAG может вызвать проблемы. - person Philipp Johannis; 20.11.2020
comment
sla не срабатывает при ручном срабатывании. Если задание запланировано, то sla работает нормально. - person Dev; 23.11.2020
comment
Это имеет смысл, как я уже сказал, расчет SLA основан на start_date + interval. Задание, запускаемое вручную, не укладывается в интервал. - person Philipp Johannis; 23.11.2020