Grafana中的rate与irate以及histogram

用法

rate

rate函数用于计算一个时间序列在给定时间范围内的平均速率。它对每个数据点进行线性插值来计算速率,因此对于平滑和稳定的数据来说,rate是一个不错的选择。语法如下:

复制代码
rate(metric_name[time_range])
  • metric_name: 指标名称。
  • time_range: 时间范围,例如5m表示过去5分钟。

示例:

复制代码
rate(http_requests_total[5m])

这个查询返回的是http_requests_total指标在过去5分钟内的平均请求速率。

irate

irate函数用于计算时间序列的瞬时速率。它仅使用时间范围内的最后两个数据点来计算速率,因此对于检测突发变化或短期波动非常有用。语法如下:

复制代码
irate(metric_name[time_range])
  • metric_name: 指标名称。
  • time_range: 时间范围,例如5m表示过去5分钟。

示例:

复制代码
irate(http_requests_total[5m])

这个查询返回的是http_requests_total指标在过去5分钟内的瞬时请求速率。

选择rate还是irate

  • 如果你需要一个平滑的平均速率,可以选择rate
  • 如果你需要捕捉短期的突发变化或尖峰,可以选择irate

rate(http_requests_total[5m]) 返回的是 http_requests_total 指标在过去 5 分钟内的平均请求速率,通常可以解释为平均 QPS(每秒请求数)。

histogram_quantile

histogram_quantile 函数的语法如下:

复制代码
histogram_quantile(quantile, sum(rate(metric_name_bucket[time_range])) by (le))
  • **quantile**: 要计算的分位数,取值范围是 0 到 1,例如 0.5 表示 50th percentile(中位数)。
  • **metric_name_bucket**: 直方图指标的名称,_bucket 是其后缀,用于表示不同的桶(bucket)。
  • **time_range**: 用于计算速率的时间范围,例如 5m 表示过去 5 分钟。
  • **le**: 桶的标签,用于按桶进行分组。

示例

假设你有一个名为 http_request_duration_seconds_bucket 的直方图指标,它记录了 HTTP 请求的延迟,并且包含以下桶:

  • http_request_duration_seconds_bucket{le="0.1"}
  • http_request_duration_seconds_bucket{le="0.2"}
  • http_request_duration_seconds_bucket{le="0.5"}
  • http_request_duration_seconds_bucket{le="1"}
  • http_request_duration_seconds_bucket{le="2"}
  • http_request_duration_seconds_bucket{le="+Inf"}

要计算 95th percentile(即 0.95 分位数)的请求延迟,你可以使用以下查询:

复制代码
histogram_quantile(0.95, sum(rate(http_request_duration_seconds_bucket[5m])) by (le))
查询解释
1. rate(http_request_duration_seconds_bucket[5m])
  • 功能:计算每个桶在过去 5 分钟内的请求速率。
  • 过程:对每个桶的计数器数据进行速率计算,这表示每秒钟有多少请求落在该桶内。
2. sum(rate(http_request_duration_seconds_bucket[5m])) by (le)
  • 在 Prometheus 直方图中,le 标签用于表示桶(bucket)的上限,而不是简单的指示标签。le 是 "less than or equal" 的缩写,用来指定每个桶能容纳的最大值。因此,le="0.1" 表示这个桶包含了所有延迟时间小于或等于 0.1 秒的请求。
  • 功能 :将速率按桶的标签 le 进行分组求和。
  • 过程 :将每个桶的速率汇总,以便能够按桶的上限(le 标签)进行分组。le 标签表示每个桶的最大延迟值。例如,le="0.1" 表示 延迟在0.1 秒以内的请求。
3. histogram_quantile(0.95, ...)
  • 功能:计算指定分位数(0.95,即 95th percentile)的值。
  • 过程
    1. 累积分布:首先,根据每个桶的速率计算累积分布。累积分布函数 (CDF) 表示小于或等于某个值的请求的比例。
    2. 插值计算:然后,根据累积分布函数的结果插值计算 95th percentile 的值。也就是说,它在累积分布中找到 0.95 位置对应的延迟值。这个位置表示有 95% 的请求延迟小于或等于该值。

函数计算原理

rate

rate(http_requests_total[5m]) 返回的是 http_requests_total 指标在过去 5 分钟内的平均请求速率,通常可以解释为平均 QPS(每秒请求数)。

计算方法

假设 http_requests_total 是一个计数器,记录了从某个时间点开始累计的 HTTP 请求总数。计数器会随着每个新的 HTTP 请求递增。rate 函数通过以下步骤计算过去 5 分钟的平均速率:

  1. 选择指定时间范围内的所有数据点(例如过去 5 分钟内的所有数据点)。
  2. 进行线性插值,计算每个数据点之间的速率。
  3. 取这些速率的平均值,得到整个时间范围内的平均速率。
示例

假设我们有以下数据点在过去 5 分钟内:

  • 在时间 T0,http_requests_total 的值是 1000。
  • 在时间 T1(1 分钟后),http_requests_total 的值是 1100。
  • 在时间 T2(2 分钟后),http_requests_total 的值是 1150。
  • 在时间 T3(3 分钟后),http_requests_total 的值是 1200。
  • 在时间 T4(4 分钟后),http_requests_total 的值是 1250。
  • 在时间 T5(5 分钟后),http_requests_total 的值是 1300。

rate 函数会对这些数据点进行线性插值,并计算平均速率:

  • 速率=Δ值 / Δ时间

每分钟的速率分别为:

  • 从 T0 到 T1:1100−1000/60=1.67 QPS
  • 从 T1 到 T2:1150−1100/60=0.83 QPS
  • 从 T2 到 T3:1200−1150/60=0.83 QPS
  • 从 T3 到 T4:1250−1200/60=0.83 QPS
  • 从 T4 到 T5:1300−1250/60=0.83 QPS

然后,取这些速率的平均值:

  • 平均速率=(1.67+0.83+0.83+0.83+0.83)/5=1.00 QPS

irate

irate(http_requests_total[5m]) 返回的是 http_requests_total 指标在过去 5 分钟内的瞬时请求速率。与 rate 不同,irate 只使用时间范围内的最后两个数据点来计算速率,因此它更适合捕捉短期内的突发变化或尖峰。

计算方法
  1. 选择过去 5 分钟内的最后两个数据点。
  2. 计算这两个数据点之间的增量。
  3. 将增量除以这两个数据点之间的时间间隔,以得到瞬时速率。
示例

假设在时间 T1 和 T2 是过去 5 分钟内的最后两个数据点:

  • 在时间 T1 时,http_requests_total 的值是 1000。
  • 在时间 T2 时,http_requests_total 的值是 1300。
  • T1 和 T2 之间的时间间隔是 1 分钟(60 秒)。

那么,irate 的计算过程如下:

  • 瞬时速率= (1300 - 1000) / 60 秒 = 5 QPS

histogram_quantile

计算方法

假设你有以下桶的速率数据(单位是每秒请求数):

  • le="0.1": 10 req/s
  • le="0.2": 15 req/s
  • le="0.5": 20 req/s
  • le="1": 25 req/s
  • le="2": 30 req/s
  • le="+Inf": 35 req/s

计算过程如下:

  1. 计算累积分布
    • le="0.1": 10 req/s
    • le="0.2": 10 + 15 = 25 req/s
    • le="0.5": 25 + 20 = 45 req/s
    • le="1": 45 + 25 = 70 req/s
    • le="2": 70 + 30 = 100 req/s
    • le="+Inf": 100 + 35 = 135 req/s
  2. 计算总请求数:135 req/s
  3. 计算 95th percentile 的请求数
    • 95% 的请求数 = 135 * 0.95 = 128.25 req/s
  4. 查找对应的桶
    • le="1": 70 req/s < 128.25 req/s
    • le="2": 100 req/s < 128.25 req/s
    • le="+Inf": 135 req/s > 128.25 req/s
    • 95th percentile 的请求数为 128.25 req/s,落在 le="2" 桶和 le="+Inf" 桶之间。
  5. 插值计算
    • 因为 le="2" 桶已经包含了绝大部分请求,实际插值计算会让我们确定 95th percentile 的延迟值接近 le="2" 桶的上限(即 2 秒)。实际的插值计算会让我们在 le="2" 桶的上限附近找到精确的值。
插值计算公式中的"上限"

在给出的案例中:

  • le="2" 桶的上限是 2 秒。
  • le="+Inf" 桶的上限理论上是无限大,但在实际计算中,我们用 le="2" 的上限值来做插值,因为 le="+Inf" 的上限并不提供具体的延迟值。
插值计算的详细步骤

我们已经知道:

  • le="2" 桶的累积请求数是 100 req/s。
  • le="+Inf" 桶的累积请求数是 135 req/s。
  • 95th percentile 的请求数是 128.25 req/s。

我们需要在 le="2" 桶和 le="+Inf" 桶之间插值。由于 le="+Inf" 桶的具体上限不明确,我们通常将计算结果定在 le="2" 桶的上限附近。

  1. 计算差异
    • le="2" 桶的请求数:100 req/s
    • le="+Inf" 桶的请求数:135 req/s
    • 差异:135 req/s - 100 req/s = 35 req/s

计算插值

  • 95th percentile 的请求数是 128.25 req/s,落在 le="2" 桶和 le="+Inf" 桶之间。
  • 计算 95th percentile 在这两个桶之间的位置,可以用以下插值公式:
  • 延迟值=2+((128.25−100)/(135−100)×(上限−2))

在这里,上限是指 le="+Inf" 桶的理论上限,但实际插值会以 le="2" 桶的上限(即 2 秒)作为基准。

实际插值步骤

计算插值比例

  • 比例=(128.25−100)/(135−100)=28.25/35≈0.807

计算延迟值

  • 延迟值=2+(0.807×(上限−2))

由于 le="+Inf" 的上限理论上是无限大,实际中我们将插值结果定在 le="2" 的上限附近,即 2 秒。

插值结论

在实际情况下,因为 le="+Inf" 桶的上限是无限大,实际插值计算中我们通常将 95th percentile 的延迟值定在 le="2" 桶的上限附近,即 2 秒。因此:

  • 插值结果 :95th percentile 的延迟值在 le="2" 桶的上限(2 秒)附近。

插值计算的主要目的是找出更精确的延迟值,但由于 le="+Inf" 的上限不具体,结果一般在 le="2" 桶的上限附近。

示例

假设我们有以下桶的定义:

  • http_request_duration_seconds_bucket{le="0.1"}: 包含所有延迟小于或等于 0.1 秒的请求。
  • http_request_duration_seconds_bucket{le="0.2"}: 包含所有延迟小于或等于 0.2 秒的请求。
  • http_request_duration_seconds_bucket{le="0.5"}: 包含所有延迟小于或等于 0.5 秒的请求。
  • http_request_duration_seconds_bucket{le="1"}: 包含所有延迟小于或等于 1 秒的请求。
  • http_request_duration_seconds_bucket{le="+Inf"}: 包含所有延迟小于或等于无限大(即所有请求)的数据。

在直方图中,每个桶的 le 标签提供了该桶的延迟上限,使得我们能够理解请求的延迟分布情况。例如,如果你看到 http_request_duration_seconds_bucket{le="0.5"} 中的请求数为 1000,http_request_duration_seconds_bucket{le="1"} 中的请求数为 2000,那么可以得出结论:在 0.5 秒和 1 秒之间的请求数是 1000。

总结

le 标签在 Prometheus 直方图中表示桶的最大延迟值,以 "less than or equal" 的方式来说明。这样设计可以更精确地反映数据分布,并方便进行数学计算和分析。

相关推荐
行百里er8 小时前
Spring Insight 里如何画出服务拓扑
spring boot·spring cloud·监控
行百里er2 天前
Spring Insight 里如何对 Span 进行清洗
spring boot·spring cloud·监控
盛世宏博智慧档案2 天前
户外配电柜为什么要装POE供电以太网温湿度传感器?
服务器·网络·人工智能·监控·温湿度·配电柜
行百里er3 天前
Spring Insight 里收到的 Span 是怎么存下来的
spring boot·spring·监控
行百里er5 天前
Spring Insight 里上报 Span 为什么用 JDK HttpClient 而不是 RestTemplate
spring boot·spring cloud·监控
SkyWalking中文站5 天前
Horizon UI 1.0 正式发布:SkyWalking 新一代控制台接棒 Booster
运维·监控·自动化运维
行百里er5 天前
BlockingQueue:异步批量上报
spring boot·spring cloud·监控
IT界的老黄牛5 天前
Prometheus TSDB 拆不出来、也存不了一年:4 条外部存储出路 + 容量测算
prometheus·时序数据库·监控·thanos·victoriametrics·remote_write
qq_452396237 天前
第十二篇:《数据采集:Grafana Alloy、Fluent Bit、Vector 的选型与配置》
java·贪心算法·grafana
2601_962097367 天前
可观测性实战:Prometheus+Grafana+OTel构建监控
grafana·prometheus·微服务架构·可观测性·opentelemetry