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