Prometheus / Grafana绘图等待工作时间百分比

时间:2018-10-21 14:58:30

标签: grafana prometheus job-scheduling

我有一个作业调度引擎,可以在各种机器上运行作业。我有一个待处理的作业队列作为流(通常等待执行的数千个作业中至少有十万个)。我有一种算法可以在不同的计算机上执行作业。

要跟踪的核心指标之一是请求作业要安排执行多长时间(通常少于5分钟,但由于各种原因最多可能需要1个小时)。

是否有办法绘制使用Prometheus + Grafana(或Prometheus和其他解决方案如Redis的组合)当前未分配工作已经存在多长时间的百分位数?我想知道什么是平均等待时间,即工作等待时间的95%和99%。

问题是直到作业计划执行之前,不会生成任何事件,并且我们等待时间越长,作业将进入的位置越高。此外,由于要安排工作的时间可能非常不同(并非每个工作都相同),因此仅依靠过去很少的工作需要多长时间来安排工作是错误的。

一种简单的方法将遍历所有待处理的作业并连续计算百分位数,但这将非常昂贵。

1 个答案:

答案 0 :(得分:0)

Prometheus直方图实现假定一组固定的桶(例如,少于1秒,少于2秒,少于5秒等)只能递增(以及上面的所有桶)。

在您的情况下,您有2个选择:

  1. 在直方图中记录每个作业已排队的持续时间。这种方法的问题在于:(a)随着时间的流逝,您将不得不使每个作业一直“移动”到直方图上; (b)处理完直方图后便无法将其从直方图中删除(由于单调性要求)。
  2. 记录将每个作业添加到直方图中的时间(例如,在每小时1分钟之前添加的记录,在每小时2分钟之前添加的记录等)。这里的问题是您的直方图的大小不是静态的,并且会无限期地增长(假设您的Prometheus客户首先允许这样做)。

因此,您还有其他选择:

  1. 遍历队列并在每次被Prometheus抓取时创建一个新的直方图(或直接创建您感兴趣的百分位数)。数以万计的要迭代的工作听起来并不那么糟糕,它应该花费几毫秒的时间。您甚至可以将您用于队列的数据结构替换为例如一个二叉搜索树,它应该很容易在对数时间内找出您感兴趣的确切百分位数。
  2. 放弃记录待处理作业的排队时间,仅对已处理作业进行记录。每次处理作业时,您都会增加直方图。没有比这更简单的了。