芹菜实时监控和Django应用程序

芹菜实时监控和Django应用程序,django,celery,monitoring,Django,Celery,Monitoring,芹菜解释如何设置自定义事件处理。然而,这种方法似乎不太适合我的Django项目和芹菜 我的芹菜.py文件看起来像 from __future__ import absolute_import import os from celery import Celery from django.conf import settings os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproj.settings') # The custom mon

芹菜解释如何设置自定义事件处理。然而,这种方法似乎不太适合我的Django项目和芹菜

我的
芹菜.py
文件看起来像

from __future__ import absolute_import 
import os
from celery import Celery
from django.conf import settings
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproj.settings')

# The custom monitor copied from celery docs
def my_monitor(app):
    state = app.events.State()

    def announce_failed_tasks(event):
        state.event(event)
        # task name is sent only with -received event, and state
        # will keep track of this for us.
        task = state.tasks.get(event['uuid'])

        print('MY MON TASK FAILED: %s[%s] %s' % (
            task.name, task.uuid, task.info(), ))

    with app.connection() as connection:
        recv = app.events.Receiver(connection,
                                   handlers={'task-failed': announce_failed_tasks, }
                                   )
        recv.capture(limit=None, timeout=None, wakeup=True)


app = Celery('myproj')


app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
# Monitoring
my_monitor(app)
我刚刚从文档中复制了示例监视器

我没有收到任何错误,但启动芹菜工人/beat或django的runserver似乎一直挂着,直到我注释掉
my_monitor(app)

在Django项目中,正确的方法是什么?

我建议用芹菜来做这件事

启动tornado WebSocket服务器,并将任务的结果和状态传递给API WebSocket端点

请在下面找到Django事件模板的示例

{% extends "admin/base.html" %}
{% load staticfiles %}

{% block extrastyle %}
<style>
    table, th, td {
    border: 1px solid black;
        border-collapse: collapse;
    }
    th, td {
        padding: 5px;
    }
</style>
{% endblock extrastyle %}

{% block extrahead %}
<title>Read Flower event Websocket-API</title>
<script language="javascript" type="text/javascript">
    var ws_success = new WebSocket('ws://localhost:5555/api/task/events/task-succeeded/');
    ws_success.onmessage = function (event) {
        var div = document.getElementById("output");
        var li = document.createElement('li');
        li.innerText = event.data;
        div.appendChild(li);
    }
</script>
{% endblock extrahead %}

{% block content %}
    <h2>Events:</h2>
    <ul>
    <div id="output"></div>
    </ul>
{% endblock content %}
或者,是否可以使用第二个WebSocket端点:

ws://localhost:5555/api/task/events/task-succeeded/
ws://localhost:5555/dashboard
用“pipenv”安装(最好是:

从以下内容开始:

flower -A $projectname -l info
和芹菜工人的花事件信息:

celery -A $projectname worker -E -B -l info
见和。芹菜节拍周期是任务调度程序,将使用“-E”选项启动

在以下文件中配置芹菜后,启动Django项目:

  • $projectname/芹菜.py
  • $projectname/init.py
  • celeryconfig.py

正如。

recv.capture中所述,它是一个阻塞调用。您是否从事件处理程序获得任何输出

如果您试图将django服务器同时用作监视器和任务生产者/消费者,那么这是行不通的


您的显示器应该是一个独立的应用程序。你也应该考虑消除Django依赖性,因为它是不必要的。

根据我无法判断该解决方案是否有效(因为我没有用花这样的方式)来解释这个解释,但是这至少有一个很好的答案。非常感谢。
celery -A $projectname worker -E -B -l info