普罗米修斯直方图如何工作?

“监控和记录:Zabbix,Prometheus,ELK”课程开始之前,准备了该文章的翻译




前面我们看过一个柜台一个量表一个摘要现在让我们谈谈直方图在Prometheus中的工作方式。
直方图与摘要有一些相似之处。直方图是各种计数器的组合。像摘要指标一样,直方图指标用于使用方法来跟踪事件的维度指标(通常是事件的持续时间)observe计时工具通常与公告相同。它们的区别在于分位数的处理。

以下是曝光的 Prometheus标签格式的示例handler

# HELP prometheus_http_request_duration_seconds Histogram of latencies for HTTP requests.
# TYPE prometheus_http_request_duration_seconds histogram
prometheus_http_request_duration_seconds_bucket{handler="/",le="0.1"} 25547
prometheus_http_request_duration_seconds_bucket{handler="/",le="0.2"} 26688
prometheus_http_request_duration_seconds_bucket{handler="/",le="0.4"} 27760
prometheus_http_request_duration_seconds_bucket{handler="/",le="1"} 28641
prometheus_http_request_duration_seconds_bucket{handler="/",le="3"} 28782
prometheus_http_request_duration_seconds_bucket{handler="/",le="8"} 28844
prometheus_http_request_duration_seconds_bucket{handler="/",le="20"} 28855
prometheus_http_request_duration_seconds_bucket{handler="/",le="60"} 28860
prometheus_http_request_duration_seconds_bucket{handler="/",le="120"} 28860
prometheus_http_request_duration_seconds_bucket{handler="/",le="+Inf"} 28860
prometheus_http_request_duration_seconds_sum{handler="/"} 1863.80491025699
prometheus_http_request_duration_seconds_count{handler="/"} 28860

_sum它们的_count工作方式与摘要完全相同,可用于获取过去五分钟的平均执行时间:

 rate(prometheus_http_request_duration_seconds_sum[5m]
/
  rate(prometheus_http_request_duration_seconds_count[5m])

但是,在极少数情况下_sum,例如,在MySQLd导出器的某些指标中不存在

直方图的一个显着部分是时间序列_bucket,实际上是度量的直方图部分。更具体地说,这些是形成累积直方图的计数器。le表示小于或等于。因此,26688个请求花费的时间小于或等于200毫秒,27760个请求花费的时间小于或等于400ms,总共有28860个请求。值区中的值将单调非递减,并且+Inf值区中的值最大。+Inf存储桶必须始终存在并且与值匹配_count

例如,要计算0.9的分位数(第90个百分位数),应使用:

histogram_quantile(0.9, 
  rate(prometheus_http_request_duration_seconds_bucket[5m])
)

直方图相对于摘要的一大优势是,您可以在计算分位数之前汇总存储桶-注意不要丢失标签le

histogram_quantile(0.9, 
  sum without (handler)(
    rate(prometheus_http_request_duration_seconds_bucket[5m])
  )
)

除聚合外,由于计数器会快速增加,因此直方图在客户端上更便宜。那么为什么不总是使用直方图呢?有一个很长的答案,但简短的版本是您必须先使用直方图选择存储桶,由于存储桶元素的数量,成本从客户端转移到Prometheus本身。默认情况下,十个存储桶覆盖典型的Web服务,延迟范围从毫秒到一秒,在某些情况下,您可能需要更改它。例如,在这里,它们被重新定义以更好地跟踪PromQL查询,默认情况下,该查询有两分钟的超时时间。具有十几个水桶将给出更准确的结果,但也会产生许多时间序列。特别是与其他标签结合使用。

当使用诸如Prometheus的实时监控系统时,目标应该是提供足以根据其做出工程决策的分析值。例如,要知道第90个百分位的延迟增加了50毫秒,比知道现在是562毫秒还是563毫秒更为重要,为此通常十个bucket就足够了。如果您需要确切的答案,则始终可以稍后从日志中进行计算。如果存储桶太多,则可以在数据处理期间将其丢弃,如先前所示。在更极端的情况下,你可以完全忽略该系列的_bucketS和依靠平均的_sum_count

总之,尽管必须考虑元素的数量,但直方图允许对分位数进行汇总计算。请记住,如果您不需要直方图,则没有分位数的摘要是一种较便宜的选择。



有关课程的更多信息



All Articles