如果仪表可以充当计数器,为什么 Prometheus 中既有计数器又有仪表?

Jos*_*sto 15 monitoring metrics prometheus

Counter和之间做出决定时GaugePrometheus 文档指出

在计数器和仪表之间进行选择,有一个简单的经验法则:如果值可以下降,它就是一个仪表。计数器只能上升(并重置,例如当进程重新启动时)。

它们似乎涵盖了重叠的用例:您可以使用只会增加的仪表。那么为什么要首先创建 Counter 指标类型呢?为什么不简单地将 Gauges 用于两者?

Mic*_*bez 20

从概念上看,gauge和counter有不同的用途

  • 仪表通常代表一种状态,通常用于检测饱和度。
  • 计数器的绝对值并没有真正的意义,真正的目的是计算进化(通常是利用率),函数如irate/rate(), increase()...

这些演化操作需要对使用仪表无法实现的增加进行可靠计算,因为您需要检测值的重置。

从技术上讲,计数器有两个重要的属性:

  1. 它总是从 0 开始
  2. 它总是增加(即在代码中增加)

如果应用程序在两次 Prometheus 刮擦之间重新启动,则第二次刮擦的值可能小于前一次刮擦,并且可以恢复增加(某种程度上因为您总是会丢失上次刮擦和重置之间的增加)。

计算从 t1 到 t2 之间的刮擦之间计数器增加的简单算法是:

  • 如果counter(t2) >= counter(t1)那么increase=counter(t2)-counter(t1)
  • 如果counter(2) < counter(t1)那么increase=counter(t2)

作为结论,从技术角度来看,您可以使用仪表而不是计数器,前提是您在启动时将其重置为 0 并且只增加它,但任何违反合同都会导致错误的值。

作为旁注,我还希望计数器实现使用无符号整数表示,而gauge 宁愿使用浮点表示。这对代码有一些小的影响,例如能够自动溢出到 0 以及更好地支持当前 CPU 上的原子操作。

  • 确切地。我可能会补充一点,[文本文件格式](https://prometheus.io/docs/instrumenting/exposition_formats/#comments-help-text-and-type-in​​formation)公开类型信息。例如:`# TYPE http_requests_total counter`。这有助于发现暴露的指标或可用于健全性检查。 (2认同)

dsc*_*tor 11

对此,一个敏锐的观察是:

Gauge背后的感觉是:

仪表适用Iff SUM operationmeasurements任何时间间隔没有意义

例如,如果哈勃太空望远镜正在观察brightness of every star它在天体扫描中观察到的温度之和,则不会产生任何有价值的信息。

同样对于bank-balance. 您每天的银行余额总和并不是一个有意义的财富指标。因此,请使用仪表 - 仪表中提供了间隔内的平均值。


fnrate()问题只是关于rate()fn 的技术问题,而不是关于仪表和计数器的问题。

罪魁祸首是rate()在检测重置方面过于聪明。似乎没有任何数学原因可以解释为什么simple-rate()不能在规范中完成。


bri*_*zil 6

对于计数器,您关心它增加的速度,而对于仪表,您关心实际值。虽然有些指标(理论上)只会上升,但这并不意味着它们会成为计数器。