如果您将 Redis 用于 Celery 队列,则有一种方法可以计算按任务分组的排队任务的数量,而无需外部工具。请注意,此方法假定您为任务使用 JSON 序列化程序。

使用您选择的 Redis 客户端,我选择了redli(支持 tls),使用LRANGE获取所有任务的列表,通过管道将它们通过jq查询headers->tasksort并使它们成为uniq/ 计数:

> redli [your connection parameters] lrange celery 0 30000 | jq '.headers.task' | sort | uniq -c

 533 "devices.adapters.lorawan.tasks.run_lora_payload_decoder"
   2 "devices.adapters.particle.tasks.run_particle_payload_decoder"
  92 "devices.tasks.call_device_function"
8556 "devices.tasks.ping_device"
9682 "devices.tasks.process_device_field_rules"
   5 "devices.tasks.send_device_offline_email"
   2 "dzeroos.tasks.call_command"
   8 "dzeroos.tasks.flush_command_queue"
   1 "dzeroos.tasks.publish_device_config"
   1 "dzeroos.tasks.publish_protobuf_config"

进入全屏模式 退出全屏模式

奖励:任务详情统计

就我而言,我需要对一项任务的其中一个参数有一些了解(我正在调查一个导致排长队的循环)。这需要更多的jq和 bash-magic 并且可能不适合您的用例,我只是将其粘贴在这里以供参考:

> redli [your connection parameters] lrange celery 0 1000 | jq -c '. | select(.headers.task | contains("taskname")) .body' | while read -r line; do echo "$line" | tr -d '"' | base64 -D | jq '.[0][0]'; done | sort | uniq -c

  15 "04576f6e-d5d1-45f4-8eef-a17e015335f4"
   9 "05264cc7-ae60-4f4f-9a18-2451e8d83f65"
  25 "4e240129-b84e-4e70-9f85-0e06f7a01875"
 224 "6c6a9aeb-10c7-417f-a928-791399d8adb9"

进入全屏模式 退出全屏模式

Logo

Redis社区为您提供最前沿的新闻资讯和知识内容

更多推荐