Flower中的高级任务格式化(芹菜监控)

时间:2018-12-21 16:36:25

标签: python task celery display flower

我用Flower监视芹菜任务。

我正在尝试更改任务的显示方式(在 Tasks 标签下),以使列表看起来更加“有条理”。 不幸的是,overriding the format_task method有局限性:

  • task.argstask.kwargs是字符串表示形式,有时会被截断-显然是由于celery events limitations -而不是list / dict
  • task.name以外的每个字段都对HTML进行了转义
  • 如果函数未返回值,则显示任务时会抛出AJAX错误

首先,我想根据任务的状态(即SUCCESSFAILURE)隐藏/显示任务,以便我可以隐藏不重要的子任务,除非它们失败。

我可以通过将所有显示的字段设置为空字符串来获得更近的信息:

if task.state == 'SUCCESS':
    task.name = ''
    task.args = ''
    # [...]
    task.runtime = 0.0

...仍然显示为空行。你知道我怎么能达到预期的结果吗?


第二,我正在尝试格式化任务自变量的显示方式。

我正在使用eval(task.args)将参数转换回其原始类型,以便以后可以遍历它们的项目。对我来说,评估随机字符串似乎有些不安全,您会推荐一种比这样做更好的方法吗?

1 个答案:

答案 0 :(得分:0)

我找到了一种解决方案,可以在调用(列表/字典)而不是字符串时获取任务的参数。

argsrepr方法的kwargsreprapply_async参数允许为任务的参数指定自定义表示形式。

我创建了一个自定义的 Task 类,像这样覆盖了delay方法:

import json
from celery import Task

class FlowerTask(Task):
    def delay(self, *args, **kwargs):
        argsrepr, kwargsrepr = [], {}

        for arg in args:
            if isinstance(arg, bytes):
                argsrepr.append("<binary content>")
            elif isinstance(arg, list):
                argsrepr.append("<list ({} items)".format(len(arg)))
            else:
                ...

        for key, value in kwargs.items():
            ...

        # Create and call the task with the reprs we just built
        new_task = super().s(*args, **kwargs)
        return new_task.apply_async(argsrepr=json.dumps(argsrepr), kwargsrepr=json.dumps(kwargsrepr))

然后我将此类用作任务的基础:

@shared_task(base=FlowerTask)
def test_task(*args, **kwargs):
    return "OK !"

通过这种方式,任务的参数表示形式存储为JSON,我可以随后将其加载到Flower的format_task中,并像对象而不是字符串一样使用它们:

def format_task(task):
    task.args = json.loads(task.args)

    if not task.args:
        task.args = "( )"
    else:
        task.args = ', '.join(arg for arg in task.args)
    # [...]

我仍然没有找到隐藏任务的方法。我想我可能需要调整Flower的CSS。