哪些用例真正使Prometheus的摘要指标类型必要/独特?

lns*_*shi 4 prometheus

对于Prometheus指标收集(例如标题),我无法真正找到只能通过Summary类型完成的用例,似乎它们也都可以通过直方图来完成。

让我们以请求并发指标为例,毫无疑问,这可以通过完成type Summary,但是我也可以通过使用来达到相同的效果type Histogram,如下所示:

费率(http_request_duration_seconds_sum [1s])/费率(http_request_duration_seconds_count [1s])

我可以看到的唯一区别是:对于摘要,百分位数是在客户端中计算的,它由一个计数和总和计数器(如直方图类型)和结果分位数组成。

因此,我对哪些用例真正使type Summary必要/独特感到迷茫,请帮助我。

bri*_*zil 8

“摘要”度量标准不是唯一的,许多其他仪器系统也提供类似的功能-例如Dropwizard的直方图类型(内部是直方图,但以分位数形式显示)。这是它存在的原因之一,因此可以更清晰地映射其他仪器系统中的此类类型。

它存在的另一个原因是历史的。在Prometheus中,摘要位于直方图之前,一般建议使用直方图,因为它是可汇总的,而不是摘要的分位数。另一方面,直方图要求您预先选择其他存储桶以进行汇总,并允许在任意时间范围内进行分析。

文档中对这两种类型进行了更长的比较


val*_*ala 8

当存在一组预定义的百分位数(必须为某些指标(例如request duration或 )公开response size,并且无需计算多个指标的聚合百分位数时,Prometheus 摘要指标类型非常有用。例如,如果您需要request duration在单个服务器上测量第 90、97 和 99 个百分位,则构成 Prometheus 摘要的以下指标对于导出非常有用:

http_request_duration_seconds{quantile="0.99"}
http_request_duration_seconds{quantile="0.97"}
http_request_duration_seconds{quantile="0.90"}
Run Code Online (Sandbox Code Playgroud)

用户更喜欢 Prometheus 汇总类型而不是Prometheus 直方图类型的另一个常见原因是汇总指标更容易理解和处理。

与直方图指标类型相比,摘要指标类型具有以下限制:

  • 摘要指标类型不允许计算除已预定义的百分位数之外的百分位数。例如,如果汇总指标仅公开 0.9 和 0.95 百分位数,则无法从收集的数据计算 0.99 或 0.5 百分位数。
  • 摘要指标类型不允许计算多个摘要指标的聚合百分位数。例如,如果http_request_duration_seconds{quantile="0.99"}指标是针对集群中的每个服务器单独公开的,则无法计算集群中所有服务器的请求持续时间的第 99 个百分位。用户有时会使用avg(http_request_duration_seconds{quantile="0.99"})max(http_request_duration_seconds{quantile="0.99"})作为解决方法,但结果值可能与实际百分位相差甚远。

Prometheus 中的直方图指标类型也有其自身的问题:

  • 当导出的直方图桶没有足够的测量覆盖范围时,计算的百分位数精度太低。例如,如果http_request_duration_seconds直方图有以下桶:[0-0.1], (0.1-1.0], (1.0-10.0]- 并且大多数请求在 0.5 秒内执行,那么所有这些请求都会进入该[0.1-1.0]桶。但不可能从这样的数据中高精度地计算出任何百分位。

  • 导出的桶数量过多。当用户偶然发现第一个问题时,最常见的反应是创建大量存储桶,以便更好地覆盖测量。这可能会导致高基数问题,因为每个存储桶都作为单独的指标(也称为时间序列)公开。

  • 无法使用不同的桶集聚合直方图。例如,http_request_duration_seconds直方图可以针对每个受监控的服务具有不同的桶组。那么就不可能计算多个服务的该直方图的百分位数。

这些问题在 VictoriaMetrics 直方图类型中得到解决 - 有关详细信息,请参阅本文