Cloud Composer中SendGrid任务失败告警邮件未送达问题求助
排查Cloud Composer + SendGrid任务失败告警未送达的问题
我之前在Cloud Composer里配置SendGrid告警时也踩过类似的坑,结合实际经验给你梳理几个关键排查点:
1. 修复DAG默认参数的语法错误
你提供的default_dag_args存在明显语法问题,这会直接导致参数不生效:
start_date应该是datetime对象而非字符串,需要先导入datetime模块后用datetime(2019, 2, 25)格式定义"email":[email_list]后面缺少逗号,破坏了字典的语法结构- 确保
email_list是字符串列表格式,比如["alerts@example.com", "admin@example.com"],不能是单个字符串或其他格式
修正后的示例代码:
from datetime import datetime, timedelta PROJECT_ID = "your-project-id" email_list = ["alerts@example.com", "admin@example.com"] default_dag_args = { "start_date": datetime(2019, 2, 25), "email": email_list, "email_on_failure": True, "email_on_retry": False, "retries": 1, "retry_delay": timedelta(minutes=5), "project_id": PROJECT_ID }
2. 验证SendGrid环境变量配置
- SENDGRID_MAIL_FROM:必须是在SendGrid控制台中验证过的发件人邮箱(支持单个邮箱验证或域名验证),未验证的发件人会被SendGrid直接拦截
- SENDGRID_API_KEY:确保密钥拥有
Mail Send权限,且未过期、未被撤销。可以在SendGrid控制台的API Keys页面重新生成一个具备完整邮件发送权限的密钥 - 确认Cloud Composer环境中这两个变量已正确配置(在Composer环境的「环境变量」页面可查看)
3. 检查DAG/Operator的参数覆盖
单个Operator可能会覆盖默认的告警参数,比如某个任务显式设置了email_on_failure=False,导致该任务失败时不触发告警。可以检查DAG中所有Operator的定义,确保它们没有覆盖email_on_failure和email参数,或者显式继承默认配置:
with DAG( dag_id="your_dag_id", default_args=default_dag_args, schedule_interval="@daily" ) as dag: task1 = BashOperator( task_id="task1", bash_command="exit 1", # 故意让任务失败 email_on_failure=True # 显式确认告警开关 )
4. 查看Cloud Composer日志定位错误
去Cloud Logging中筛选Airflow相关日志(选择你的Composer环境,日志过滤器设置为resource.type="cloud_composer_environment" AND logName:"airflow"),搜索sendgrid、email或failure关键词:
- 若看到
401 Unauthorized:说明SENDGRID_API_KEY无效 - 若看到
403 Forbidden:通常是发件人邮箱未在SendGrid完成验证 - 若看到
Recipient address rejected:可能是收件人邮箱不存在或被SendGrid判定为垃圾邮箱
5. 测试邮件发送功能
可以写一个极简的测试DAG来验证告警流程:
from airflow import DAG from airflow.operators.bash import BashOperator from datetime import datetime, timedelta default_args = { "start_date": datetime.now(), "email": ["your-test-email@example.com"], "email_on_failure": True, "email_on_retry": False } with DAG( dag_id="test_sendgrid_alert", default_args=default_args, schedule_interval=None, catchup=False ) as dag: fail_task = BashOperator( task_id="fail_task", bash_command="exit 1" )
手动触发这个DAG,观察是否能收到告警邮件,同时查看日志是否有异常。
6. 确认Airflow邮件后端配置
在Airflow Webserver的Admin -> Configurations页面,搜索email_backend,确认其值为airflow.contrib.utils.sendgrid_email.send_email(Composer在配置SENDGRID变量后会自动设置,但偶尔可能出现配置异常)。
内容的提问来源于stack exchange,提问作者prasanna Kumar
相关产品推荐
相关产品推荐

