检查芹菜节拍是否正常运行

时间:2016-02-12 05:57:41

标签: django celery celerybeat

在我的Django项目中,我使用Celery和Rabbitmq在后台运行任务。 我正在使用芹菜节拍调度程序来执行定期任务。 如何以编程方式检查芹菜节拍是否正常运行?

7 个答案:

答案 0 :(得分:4)

使任务定期发送HTTP请求到Ping URL。如果未按时ping通URL,URL监视器将向您发送警报。

import requests
from yourapp.celery_config import app

@app.task
def ping():
    print '[healthcheck] pinging alive status...'
    # healthchecks.io works for me:
    requests.post("https://hchk.io/6466681c-7708-4423-adf0-XXXXXXXXX")

celery periodic task计划每分钟运行一次,如果没有按ping键,则您的节拍服务已关闭*,监视器将踢入您的邮件(或挂机,因此您可以zapier it以获得移动推送通知。

celery -A yourapp.celery_config beat -S djcelery.schedulers.DatabaseScheduler

*或不知所措,您应该跟踪任务的完成情况,这是Celery的噩梦,应该被发现并正确解决,当工人忙于阻塞需要优化的任务时经常发生

答案 1 :(得分:1)

如果您按照celery doc的教程进行了守护芹菜,检查它是否正在运行

sudo /etc/init.d/celeryd status
sudo /etc/init.d/celerybeat status

您可以在python模块中使用这些命令的返回。

答案 2 :(得分:0)

您可以通过以下命令检查调度程序是否正在运行

python manage.py celery worker --beat

答案 3 :(得分:0)

你是否使用暴发户或监督人或其他东西来运作芹菜工人+芹菜作为背景任务?在生产中你应该使用其中一个来运行芹菜工人+芹菜在背景中击败。

检查芹菜节拍的最简单方法是:ps aux | grep -i '[c]elerybeat'。如果你得到pid的文本字符串,它就会运行。此外,您可以使此命令的输出更漂亮:ps aux | grep -i '[c]elerybeat' | awk '{print $2}'。如果你得到号码 - 它正在工作,如果你什么都没有 - 它不起作用。

您也可以查看芹菜工人状态:celery -A projectname status

如果您对高级芹菜监测感兴趣,可以阅读官方文档monitoring指南。

答案 4 :(得分:0)

您可以查找supervisor。 它提供celerybeat conf,用于记录与/var/log/celery/beat.log中的节拍相关的所有内容。

另一种解决方法是使用Flower。您可以为您的服务器设置它(确保其密码受到保护),在GUI中更容易注意到正在排队的任务以及它们排队的时间,从而验证您的节拍是否正常运行。

答案 5 :(得分:0)

最近在从事一个项目时,我使用了它:

HEALTHCHECK CMD [“ stat celerybeat.pid ||退出1”]

本质上,beat进程会在某个位置(通常是家庭位置)下写入一个pid文件,您要做的就是获取一些统计信息以检查该文件是否存在。

注意:这在Docker容器中启动独立的celery beta进程时起作用

答案 6 :(得分:0)

celery beat/scheduler 的 liveness 目标是检查 celery beat/scheduler 是否能够将作业发送到消息代理,以便其可以被相应的消费者接收。 [它是否仍在工作或处于挂起状态]。 celery worker 和 celery scheduler/beat 可能会也可能不会在同一个 pod 或实例中运行。

为了处理这种情况,我们可以创建一个带有装饰器 update_scheduler_liveness 的方法 @after_task_publish.connect ,每次调度程序成功将消息/任务发布到消息代理时都会调用该方法。 方法 update_scheduler_liveness 每次任务发布成功时都会将当前时间戳更新到文件中。 在 Liveness 探针中,我们需要使用以下方法检查文件的最后更新时间戳: stat --printf="%Y" celery_beat_schedule_liveness.stat 命令 或者我们可以明确地尝试读取文件(读取模式)并提取时间戳并根据活性探测标准比较时间戳是否是最近的。 在这种方法中,您需要的活跃度标准越多,芹菜节拍触发作业的频率就越高。因此,对于这些情况,作业之间的频率非常大,可以每 2-5 分钟安排一次自定义/专用的 liveness 心跳作业,消费者可以直接处理它。 @after_task_publish.connect 装饰器提供了多个参数,这些参数也可用于过滤已触发的活跃度特定作业

如果我们不想采用基于文件的方法,那么我们可以像数据源一样依赖 Redis 以及需要在同一行上实现的特定于实例的 redis 键。

相关问题