监视Huey(Redis队列,队列中的时间和工人数)

时间:2018-09-06 13:48:20

标签: python-huey

选择Huery的Celery并热爱它的一切:)

芹菜我想念的一件事是它的花朵监控工具。有针对Huey的监视工具吗?

我们需要跟踪Redis队列中的任务数量,任务被工作人员接走之前排队花费的总时间以及有多少工作人员在运行。

有任何Huey钩子可以帮助解决这个问题吗?

我已经浏览了Huey事件,但似乎只有消费者选择了任务后,它们才会触发。

我现在的计划是:

  1. 将时间戳记入任务时,将时间戳记作为任务传递给任务,然后当它被工作人员从队列中拉出时,我可以将其与时间戳记进行比较。这将获得“排队时间”。

  2. 我可以提供一个服务,该服务在Redis Huey Queue上调用LLEN来跟踪作业。

  3. 我不确定获得#名工人的最佳方法。理想情况下,如果我们的任务队列达到一定长度,我们希望使用Huey worker扩大实例数量。

有人有监控Huey的经验吗?在文档中我缺少什么可以帮助此过程的信息?

2 个答案:

答案 0 :(得分:1)

Huey有signals,可帮助监视每个任务中发生的某些生命周期事件-例如计划,触发,完成,错误。如果为这些事件加上时间戳,则可以确定每个阶段花费的时间。 SIGNAL_ERROR挂钩对于通过Sentry或Slack发出警报特别有用。

我还没有研究监视当前正在使用的线程/进程的数量,但是我确定它是可行的。我在下面构建的非常简单的监视器仪表板。

huey monitoring dashboard

答案 1 :(得分:0)

我设法找到了一种监控工作流程的解决方案。 我需要一次计算工作流程。因此,我是通过信号机制完成的。

Huey提供信号装饰器来触发特定信号,例如 SIGNAL_EXECUTING SIGNAL_COMPLETE SIGNAL_ERROR

在每个执行过程中,带有特定前缀的新密钥存储在Redis哈希中。该过程结束后,密钥将被删除。因此,要获取执行任务的数量,可以调用get_executing_count()

我的工作代码:

from huey import RedisHuey
from huey.constants import EmptyData
from huey.signals import SIGNAL_EXECUTING, SIGNAL_COMPLETE, SIGNAL_ERROR, SIGNAL_REVOKED

EXECUTING_PREFIX = "executing"

redis_addr = os.getenv("REDIS", "localhost")
huey = RedisHuey('entrypoint', host=redis_addr)

def get_executing_count():
    global huey
    matching = list(
        filter(
            lambda key: key.decode().startswith(f"{EXECUTING_PREFIX}-"), 
            huey.storage.conn.hgetall(huey.storage.result_key).keys()
        )
    )
    return len(matching)

@huey.signal(SIGNAL_EXECUTING)
def task_signal_executing(signal, task):
    global huey
    huey.storage.put_data(f"{EXECUTING_PREFIX}-{task.id}", 1)

@huey.signal(SIGNAL_COMPLETE)
def task_signal_complete(signal, task):
    global huey
    huey.storage.delete_data(f"{EXECUTING_PREFIX}-{task.id}")

@huey.signal(SIGNAL_ERROR, SIGNAL_REVOKED)
def task_signal_error(signal, task, exc=None):
    global huey
    huey.storage.delete_data(f"{EXECUTING_PREFIX}-{task.id}")

值检索我采用以下方式

from entrypoint import get_executing_count

get_executing_count()