7

把芹菜换成了休伊,我喜欢它的一切:)

我确实想念 Celery 的一件事是它的花卉监测工具。Huey 是否有任何监控工具?

我们需要跟踪 Redis 队列中的任务数、任务在被工作人员接收之前花费在队列中的总时间以及正在运行的工作人员数量。

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

我已经查看了 Huey 事件,但它们似乎只有在消费者完成任务后才会触发。

我现在的计划是:

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

  2. 我可以在 Redis Huey Queue 上创建一个调用 LLEN 的服务来跟踪作业。

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

有人有监控 Huey 的经验吗?文档中是否缺少可以帮助此过程的内容?

4

2 回答 2

3

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

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

huey 监控仪表板

于 2020-04-08T01:06:52.940 回答
3

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

Huey 提供信号装饰器来触发某个信号,例如SIGNAL_EXECUTINGSIGNAL_COMPLETESIGNAL_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()
于 2020-11-03T13:57:50.727 回答