You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 12:55:24