Python 如何使特定气流任务的故障静音?

Python 如何使特定气流任务的故障静音?,python,airflow,pagerduty,Python,Airflow,Pagerduty,我在中设置了一个条件任务。它所做的只是检查配置单元分区是否存在。如果是,则继续执行其余任务,如果不是,则在继续之前先添加分区。条件检查任务可以失败,也可以成功,两者都可以。但是,我为dag设置了寻呼机任务电子邮件通知,因为我想知道下游任务何时失败。如何使特定条件任务上的失败通知静音,以便在寻呼机工作时不会收到错误警报?在失败时发送电子邮件和在失败时发送回叫等都是任务(操作员)级参数。它们继承自DAG对象,即传递给DAG的default_args值,但也可以在初始化时覆盖它们 YourOperat

我在中设置了一个条件任务。它所做的只是检查配置单元分区是否存在。如果是,则继续执行其余任务,如果不是,则在继续之前先添加分区。条件检查任务可以失败,也可以成功,两者都可以。但是,我为dag设置了寻呼机任务电子邮件通知,因为我想知道下游任务何时失败。如何使特定条件任务上的失败通知静音,以便在寻呼机工作时不会收到错误警报?

在失败时发送电子邮件
和在失败时发送回叫
等都是任务(操作员)级参数。它们继承自DAG对象,即传递给DAG的
default_args
值,但也可以在初始化时覆盖它们

YourOperator(task_id='task1', dag=dag, email_on_failure=None, on_failure_callback=None, ...)
下面是当任务失败时如何处理这些回调的源代码,让您更清楚它是如何工作的

def handle_failure(self, error, test_mode=False, context=None):
        self.log.exception(error)
        task = self.task
        session = settings.Session()
        self.end_date = datetime.utcnow()
        self.set_duration()
        Stats.incr('operator_failures_{}'.format(task.__class__.__name__), 1, 1)
        Stats.incr('ti_failures')
        if not test_mode:
            session.add(Log(State.FAILED, self))

        # Log failure duration
        session.add(TaskFail(task, self.execution_date, self.start_date, self.end_date))

        # Let's go deeper
        try:
            # Since this function is called only when the TI state is running,
            # try_number contains the current try_number (not the next). We
            # only mark task instance as FAILED if the next task instance
            # try_number exceeds the max_tries.
            if task.retries and self.try_number <= self.max_tries:
                self.state = State.UP_FOR_RETRY
                self.log.info('Marking task as UP_FOR_RETRY')
                if task.email_on_retry and task.email:
                    self.email_alert(error, is_retry=True)
            else:
                self.state = State.FAILED
                if task.retries:
                    self.log.info('All retries failed; marking task as FAILED')
                else:
                    self.log.info('Marking task as FAILED.')
                if task.email_on_failure and task.email:
                    self.email_alert(error, is_retry=False)
        except Exception as e2:
            self.log.error('Failed to send email to: %s', task.email)
            self.log.exception(e2)

        # Handling callbacks pessimistically
        try:
            if self.state == State.UP_FOR_RETRY and task.on_retry_callback:
                task.on_retry_callback(context)
            if self.state == State.FAILED and task.on_failure_callback:
                task.on_failure_callback(context)
        except Exception as e3:
            self.log.error("Failed at executing callback")
            self.log.exception(e3)

        if not test_mode:
            session.merge(self)
        session.commit()
        self.log.error(str(error))
def handle_故障(self、error、test_mode=False、context=None):
self.log.exception(错误)
task=self.task
session=settings.session()
self.end_date=datetime.utcnow()
self.set_duration()
Stats.incr('operator_failures_{}'。格式(task.\uuuuu class.\uuuuuu name_uuu),1,1)
统计数据增量(“ti_故障”)
如果不是测试模式:
添加(日志(State.FAILED,self))
#日志失败持续时间
添加(任务失败(任务、self.execution\u日期、self.start\u日期、self.end\u日期))
#让我们深入一点
尝试:
#由于此函数仅在TI状态运行时调用,
#try_number包含当前try_number(不是下一个)。我们
#如果下一个任务实例失败,则仅将任务实例标记为失败
#尝试次数超过了最大尝试次数。

如果task.retries和self.try\u编号是如何触发此PagerDuty警报的?如果使用
on\u failure\u callback
email\u on\u failure
,您应该能够为该特定任务将它们设置为
None
。它使用email\u on\u failure作为默认参数的一部分。dag=dag应用于所有任务。如果我将其设置为“无”,我将无法在同一dag中发现其他任务失败。是的,因此您应该能够将其设置在
default\u args
中,以便所有其他任务都有警报,然后在定义一个任务时覆盖警报,即
bash操作符(task\u id='foo',dag=dag,on\u failure\u callback=None)
。它不起作用,所以您尝试了
BashOperator(task\u id='foo',dag=dag,email\u on\u failure=None)
?抱歉,我上次评论中的错误是回调失败。