Symfony命令报错时Airflow仍显示成功,如何实现错误感知?
解决Airflow无法识别Symfony命令执行失败的问题
问题根源
当前Symfony接口无论命令执行成功或失败,都返回HTTP 200状态码,而Airflow的SimpleHttpOperator默认仅通过HTTP状态码判断任务是否成功——只要状态码是2xx,就标记任务成功,完全忽略响应内容里的执行结果。
解决方案
1. 修复Symfony接口的状态码返回逻辑
不要通过解析输出内容判断命令结果,直接使用Application::run()的返回值(即命令的退出码),并返回对应HTTP状态码:
use Symfony\Component\HttpFoundation\Response; public function ImportMasse(string $csv, KernelInterface $kernel) { $application = new Application($kernel); $application->setAutoExit(false); $input = new ArrayInput([ 'command' => 'Import', 'class_name' => $csv, ]); $output = new BufferedOutput(); // 获取命令执行的退出码,0表示成功,非0表示失败 $exitCode = $application->run($input, $output); if ($exitCode === 0) { // 成功返回200状态码 return new Response('命令执行成功', Response::HTTP_OK); } else { // 失败返回4xx级状态码,比如422 Unprocessable Entity return new Response('命令执行失败:' . $output->fetch(), Response::HTTP_UNPROCESSABLE_ENTITY); } }
说明:Application::run()的返回值对应命令的exit code,Symfony命令正常退出返回0,异常退出返回非0值,这比解析输出文本更可靠。
2. 配置Airflow的SimpleHttpOperator
确保Airflow能正确识别失败状态:
方式一:依赖HTTP状态码(推荐)
SimpleHttpOperator默认会把非2xx的状态码判定为失败,只要Symfony接口返回非2xx状态码,Airflow自动标记任务失败,无需额外配置。方式二:自定义响应检查(如果需要基于响应内容判断)
如果仍需基于响应内容判断,添加response_check参数:
def check_response(response): # 根据Symfony返回的内容判断,比如包含"命令执行成功"则通过 return "命令执行成功" in response.text t1 = SimpleHttpOperator( http_conn_id='name fill json', task_id='name task', endpoint='url route symfony', method='POST', # 建议改为POST,符合执行有副作用命令的HTTP语义 data={}, headers={}, response_check=check_response, # 添加自定义检查函数 dag=dag )
额外注意事项
- 避免使用
GET方法执行数据导入这类有副作用的命令,改用POST更符合HTTP规范。 - 如果Symfony命令可能抛出未捕获的异常,需在接口中捕获并返回错误状态码,避免接口直接返回500(虽然Airflow也会识别,但友好的错误信息更便于排查问题)。
内容的提问来源于stack exchange,提问作者Fafnir
相关产品推荐
相关产品推荐

