如何获取Celery中的失败任务?
我正在使用celery来处理一些任务。我可以看到有多少任务是正在进行中或者已经安排好了,但我找不到查看失败任务的方法。Flower可以显示任务的状态,但只有在任务开始并失败时它正在运行的情况下才能看到。如果有命令可以获取所有失败的任务(状态:失败),请告诉我。
我在任务创建时有任务的ID,但任务数量非常庞大,有几百万个。所以即使有办法通过任务ID一个一个地检查,我也做不到。如果有这样的命令,请告诉我。
2 个回答
task id
有 state
和 status
这两个属性。所以你可以通过任务的 ID 来获取任务的状态。
my_task_id = my_task.delay(foo)
my_task_id.state
my_task_id.status
这个状态可能是 PENDING(待处理)、STARTED(已开始)、RETRY(重试)、FAILURE(失败)或 SUCCESS(成功)。
据我所知,celery 只显示活动的、计划中的、保留的和撤销的任务,但 ID 不会显示失败的任务。
既然你有所有任务的 ID,你可以遍历它们的状态。
for task_id in task_id_list:
if task_id.state == 'FAILURE'
print(task_id)
Celery在找出失败的任务时并不太方便,但Flower(主要的Celery管理网页应用)可以简化这个过程。它会记录任务的ID,即使任务完成后也不会丢失,并且提供了一个接口,让你可以只找到失败的任务。
Flower的HTTP接口比较简单,其中有一个叫做/api/tasks
的端点 - 你可以使用/api/tasks?state=FAILURE
来只显示失败的任务,然后解析返回的JSON数据,提取你需要的信息。内容和网页API返回的类似,使用curl
来快速测试非常方便,还可以用jq来格式化和过滤数据:
curl -s 'http://localhost:5555/api/tasks?state=FAILURE&limit=5' | jq . | less
当然,使用Flower之前需要先安装并运行它。
由于你可能有数百万个已完成的任务,可能需要将失败任务的信息存储在一个数据存储中,以便高效访问 - 也许Flower可以帮上忙。或者你可以尝试在Celery中使用自定义的失败处理程序,专门捕获失败任务的信息 - 详情请见这个回答。