当ADF中任一阶段失败时,如何通过Databricks Notebook发送邮件至Outlook 2016?
在ADF中实现阶段失败时通过Databricks Notebook发送Outlook告警邮件
步骤1:配置ADF的失败触发逻辑
- 给每个需要监控的ADF阶段(Pipeline Activity)添加失败分支动作:
- 选中目标阶段,进入「Settings」标签页的「Failure」分支,添加一个「Notebook」活动并关联你的Databricks集群。
- 传递关键参数到Notebook:必须包含
failed_activity_name(用表达式@activity('当前阶段名').Name获取当前失败阶段名称)、pipeline_name(流水线名称,表达式@pipeline().PipelineName)、failure_time(失败时间,表达式@utcNow())。
步骤2:编写Databricks Notebook的邮件发送代码
根据Databricks集群的操作系统选择对应的实现方式:
集群为Windows环境(可直接调用本地Outlook客户端)
# 若集群未预装依赖,先执行安装 %pip install pywin32 import win32com.client # 获取ADF传入的参数 dbutils.widgets.text("failed_activity_name", "") dbutils.widgets.text("pipeline_name", "") dbutils.widgets.text("failure_time", "") failed_activity = dbutils.widgets.get("failed_activity_name") pipeline = dbutils.widgets.get("pipeline_name") fail_time = dbutils.widgets.get("failure_time") # 初始化Outlook并构建邮件 outlook = win32com.client.Dispatch("Outlook.Application") mail = outlook.CreateItem(0) mail.To = "告警收件人邮箱@domain.com" mail.Subject = f"ADF告警:{pipeline} 中 {failed_activity} 阶段失败" mail.Body = f""" 流水线名称:{pipeline} 失败阶段:{failed_activity} 失败时间:{fail_time}(UTC时间) """ # 发送邮件 mail.Send()
集群为Linux环境(通过SMTP连接Outlook服务器)
import smtplib from email.mime.text import MIMEText # 获取ADF传入的参数 dbutils.widgets.text("failed_activity_name", "") dbutils.widgets.text("pipeline_name", "") dbutils.widgets.text("failure_time", "") failed_activity = dbutils.widgets.get("failed_activity_name") pipeline = dbutils.widgets.get("pipeline_name") fail_time = dbutils.widgets.get("failure_time") # 配置SMTP参数 smtp_server = 'smtp.office365.com' smtp_port = 587 sender_email = '你的发件邮箱@domain.com' sender_password = '你的邮箱应用密码(若开启MFA)' receiver_email = '告警收件人邮箱@domain.com' # 构建邮件内容 subject = f"ADF告警:{pipeline} 中 {failed_activity} 阶段失败" body = f"流水线名称:{pipeline}\n失败阶段:{failed_activity}\n失败时间:{fail_time}(UTC时间)" msg = MIMEText(body) msg['Subject'] = subject msg['From'] = sender_email msg['To'] = receiver_email # 发送邮件 with smtplib.SMTP(smtp_server, smtp_port) as server: server.starttls() server.login(sender_email, sender_password) server.sendmail(sender_email, receiver_email, msg.as_string())
步骤3:测试验证
- 手动触发某个阶段失败,检查是否收到包含准确失败信息的告警邮件;
- 确认参数传递正常,邮件中显示的阶段名称、流水线名称和时间无误。
内容的提问来源于stack exchange,提问作者harshith
相关产品推荐
相关产品推荐

