Мониторинг Celery в реальном времени и приложение Django

документы объясняют, как настроить пользовательскую обработку событий. Однако этот подход не совсем работает с моим проектом Django и сельдереем.

Мой файл celery.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)

Я только что скопировал пример монитора из документации.

Я не получаю сообщения об ошибке, но запуск celery worker/beat или runserver django, похоже, зависает навсегда, пока я не прокомментирую строку my_monitor(app).

Как правильно это сделать в проекте Django?


person fpghost    schedule 28.01.2016    source источник


Ответы (2)


recv.capture — блокирующий вызов. Получили ли вы какие-либо выходные данные от вашего обработчика событий?

Если вы пытаетесь использовать свой сервер django как в качестве монитора, так и в качестве производителя/потребителя задач, это не сработает.

Ваш монитор должен быть отдельным автономным приложением. Вам также следует подумать об устранении зависимости от django, поскольку в этом нет необходимости.

person Brenda Bell    schedule 25.08.2016

Я предлагаю использовать для этого celery-flower.

Flower запускает сервер 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 %}

Шаблон django использует следующую конечную точку:

ws://localhost:5555/api/task/events/task-succeeded/

В качестве альтернативы можно использовать вторую конечную точку WebSocket:

ws://localhost:5555/dashboard

Установите его с «pipenv» (это предпочтительнее, чем pip и virtualenv):

pipenv install flower

Начните цветок с:

flower -A $projectname -l info

и celery worker с информацией о событиях для цветка:

celery -A $projectname worker -E -B -l info

См. пульс сельдерея и параметры командной строки celery для пульса и событий. Celery beat Periodic — это планировщик задач, который запускается с параметром «-E».

Запустите проект Django после настройки celery в следующих файлах:

  • $имя_проекта/celery.py
  • $projectname/инициализация.py
  • celeryconfig.py

как описано в конфигурации сельдерея.

person Peter Rosemann    schedule 28.01.2016
comment
Скорректировано объяснение соответственно - person Peter Rosemann; 28.01.2016
comment
Я не могу судить, работает ли решение (поскольку я не использовал цветок таким образом), но это, по крайней мере, выглядит как отличный ответ. Спасибо. - person Louis; 28.01.2016