博客/工程

如何在Grafana中可视化普罗米修斯直方图

2020年6月23日9分钟

你有电话吗?普罗米修斯你有没有问过自己如何在Grafana中可视化这个直方图?你并不孤单。在这里,我们将向您展示如何做到这一点。

这篇文章假设你已经有一个基本的了解普罗米修斯而且Grafana它将从普罗米修斯直方图的角度来看Grafana 7.0

如果你对技术层面的普罗米修斯直方图感兴趣,你应该读一下Björn“贝奥恩”拉本斯坦的帖子直方图改变了监测时间序列的游戏与普罗米修斯观看随附的演讲。

介绍我们的数据

我们的数据是一个虚构的图像托管服务的直方图。基于这个直方图,我将提出一组问题,并提供如何创建回答问题的面板的说明。

普罗米修斯直方图由三个元素组成:A_count计算样本数量;一个_sum对所有样本的值求和;最后是一组多个桶_bucket带着标签包含的计数所有类中包含的数值小于或等于的示例标签。

我在上面强调了“所有”这个词,因为普罗米修斯把一个样本放在所有它适合的桶里,而不仅仅是它适合的第一个桶里。换句话说,这些桶是累积的。(我稍后会回到这个观点。)

我们的图像托管站点接收的图片大小从几个字节到几兆字节不等,我们将存储桶设置为64字节到16MB之间的指数级(每个存储桶表示前一个存储桶大小的四倍)。

uploaded_image_bytes_bucket{le="64"} uploaded_image_bytes_bucket{le="256"} uploaded_image_bytes_bucket{le="4096"} uploaded_image_bytes_bucket{le="65536"} uploaded_image_bytes_bucket{le="262144"} uploaded_image_bytes_bucket{le="4194304"} uploaded_image_bytes_bucket{le="16777216"} uploaded_image_bytes_bucket{le="+Inf"} uploaded_image_bytes_total uploaded_image_bytes_count

对于这些示例,我在64KB和256KB桶之间生成了一个对数正态分布,其中64KB和256KB桶包含几乎相同数量的值(中值徘徊在64KB左右)。周围的桶的大小会逐渐减小。

格拉夫纳上的普罗米修斯直方图:数据
格拉夫纳上的普罗米修斯直方图:数据

在我们继续之前,对我的数据做一些说明:

  • 我假设这里的Prometheus数据不包含任何相关的重置,也不需要我加入度量。
  • 我选择了一个只有正数值的例子。这意味着我们可以使用_sum就好像它是一个计数器。
  • Go Prometheus客户端对大数字使用科学计数法。在我的代码示例中,我选择不这样做,这就是屏幕截图偶尔会有轻微偏差的原因。原理是一样的。

有多少小于(或等于)1MB的文件已上传?

这是普罗米修斯直方图的基本问题。答案已经存储在时间序列数据库中,我们不需要使用函数或算术来回答问题。

uploaded_image_bytes_bucket{勒= " 1048576 "}

如果普罗米修斯不累积存储桶,我们将不得不将所有小于1MB的桶相加。手动计算桶的总和很容易出错,也很复杂,虽然我们可以假设在必须这样做的情况下我们有一个帮助函数,但该操作也意味着即使是像这样的简单查询也必须查看大量唯一的时间序列,而不是理想情况下只有一个。

为了可视化这个查询,您可以在默认配置中使用stat、gauge或图形面板。我选择了stat,因为我最感兴趣的是我们有多少文件现在而不是随着时间的推移(如图所示)。当数据不在预定义的范围内时,衡量标准就没有意义了。

在这个查询的基础上,我们可以通过调整PromQL来实现相同的可视化,从而回答其他一些查询。

小于1MB的文件的比例是多少?

这个问题和前一个问题的区别在于,我们希望它与总计数有关。有两种方法可以获得直方图的总计数。

可以通过以下方式获取uploaded_image_bytes_countuploaded_image_bytes_bucket{勒= " + Inf "}(即有多少事件小于正无穷,根据定义,这是所有事件)。

如果我们用小于1MB的文件数除以文件总数,我们就会得到我们想要的两者之间的比率。

Uploaded_image_bytes_bucket {le="1048576"} /忽略(le) uploaded_image_bytes_count

由于显示比率的正常方式是百分比,所以我们将单位设置为百分比(0.0 - -1.0)

有多少文件更大的比1 mb ?

我们已经知道小于或等于1m字节的文件的数量和文件的总数。用总文件数减去小文件数,就得到大文件数。

Uploaded_image_bytes_count -忽略(le) uploaded_image_bytes_bucket{le="1048576"}

在256KB到1MB之间的bucket中有多少文件?

这与上一个查询的逻辑相同:我们可以通过从较大的桶边界中减去较小的边界来获得任何两个桶边界之间的文件数。

Uploaded_image_bytes_bucket {le="1048576"} -忽略(le) Uploaded_image_bytes_bucket {le="262144"}

四分之一的文件小于多少?

就基本问题而言,这个问题比其他问题更复杂。对于这个问题,我们没有准确的答案。我们可以使用PromQL 's近似地回答这个问题histogram_quantile函数。该函数以比率和直方图的桶作为输入,并返回比率的分位数点的近似值。(例如,如果1是最大的文件,0是最小的文件,那么0.75的文件有多大?)

这种近似是基于我们对特定桶上有多少值和桶下有多少值的确切了解。这意味着我们得到了一个在正确范围内的近似值。

如果近似值大于最大桶(不包括+正),普罗米修斯会放弃,并给你最大的桶的价值回来。

有了这个警告,我们可以用下面的查询来近似第三个四分位数:

uploaded_image_bytes_bucket histogram_quantile (0.75)

注意:当谈到服务水平时,分位数估计的精度是相关的。从历史上看,许多服务都被定义为“p95延迟可能不超过0.25秒”。假设我们有一个桶勒= 0.25,我们可以准确回答p95时延是否超过0.25。

然而,由于p95值是近似值,我们无法确定p95是0.22还是0.24,如果没有一个bucket介于两者之间。

对于这个相同的需求,有一种表述方式可以让我们准确地了解我们与服务水平的差距有多大,即“延迟超过0.25秒的请求的比例必须小于5%。”我们没有近似p95并查看它是低于还是高于0.25秒,而是使用上面的方法精确地定义超过0.25秒的请求的百分比。

给我看看桶的分布情况

到目前为止,我们还没有使用格拉夫纳关于普罗米修斯直方图的任何内在知识。如果我们想要在Grafana中可视化完整的直方图,而不仅仅是从中获得一些数据点,Grafana有一些妙招。

如果你创建一个杆规面板,想象一下uploaded_image_bytes_bucket并将标签设置为{{le}}你会注意到一些事情:

  • 这些值可能是错误的。这是因为杆规对接收到的数据执行的默认计算是的意思是.下>显示>值选项,将其更改为最后的相反,将为您提供正确的值。
  • 您可能会注意到桶的顺序是乱的,因为它们是按字母顺序排序的,而不是按数字排序的(例如,10比2小,因为1比2小)。
  • 您还会注意到直方图的累积性质,因为每个bucket都比前一个bucket包含更多的元素。

要告诉Grafana它正在使用直方图,并且您希望它对桶进行排序,并且只显示每个桶的不同计数,有一个选项可以更改格式普罗米修斯号的数据时间序列的热图

在改变格式后,您将注意到您的直方图条形测量面板看起来更像教科书中直方图应该如何显示的示例。

现在给我看看桶随时间的分布

由于条形规不包含任何时间数据,当我们想要在一段时间内看到相同的可视化时,我们必须使用其他工具。Grafana有一个的热图用于此目的的面板。当我们设置直方图条形尺时,如果我们将面板类型切换为的热图在我们的热图正确显示之前,我们需要做一些调整:

  • 我们必须改变面板>轴>数据格式>格式选择从时间序列时间序列桶因为我们已经预先定义了存储桶。
  • 我们还将稍微改变我们的查询,以显示每个直方图块的增量,而不是桶的总计数。我们的新查询是Sum(增加(image_uploaded_bytes_bucket[$__interval])) by (le).当我们在可视化中有一个时间维度时,确保查询利用它是有意义的。
  • 最后,我们要设置查询选项>最大数据点到25岁。热图已经包含了大量的信息,当分辨率过高时,它们有减慢浏览器速度的趋势。

注意:我不小心用了而不是增加当为热图记录动画时。速率是间隔内每秒的平均增长。桶之间的相对差异是相同的,因此生成的热图将具有相同的外观。

结论

虽然关于直方图及其可视化还有很多事情可以讲,但希望这篇文章已经为您提供了拥抱和进一步探索直方图所需的动力。

我很想看到一些使用直方图的真实世界的例子——如果你有能力,请把你的Grafana实例的截图发到twitter上@grafana或张贴到我们的社区论坛community.www.tubolov.com

你可以在几分钟内开始看《格拉夫纳》和《普罗米修斯》Grafana云.我们有免费和付费的Grafana云计划,以适应每一个用例-现在免费注册