从累计总数计算 Prometheus 中的 Mbps

Calculating Mbps in Prometheus from cumulative total

我在 Prometheus 中有一个名为 unifi_devices_wireless_received_bytes_total 的指标,它表示无线设备已接收的累计总字节数。我想将其转换为以 Mbps 为单位的下载速度(甚至开始时为 MBps)。

我试过:

rate(unifi_devices_wireless_received_bytes_total[5m])

认为 说的是:"please give me the rate of bytes received per second",在过去 5 分钟内,基于 ratehere 的文档。

但我不明白 "over the last 5 minutes" 在这种情况下是什么意思。

简而言之,如何根据这个累计字节数指标确定 Mbps?这最终将显示在 Grafana 图表中。

你想要rate(unifi_devices_wireless_received_bytes_total[5m]) / 1000 / 1000

But I don't understand what "over the last 5 minutes" means in this context.

这是过去 5 分钟的平均值。

rate() 函数 return 是传递给它的计数器的 平均值 per-second 增长率。 平均 比率是根据在方括号中传递给 rate().

的回顾 window 计算得出的

例如,rate(unifi_devices_wireless_received_bytes_total[5m]) 计算过去 5 分钟的平均 per-second 增长率。当 10 秒内传输 100MB 数据时,它 returns 低于预期速率,因为它将这 100MB 除以 5 分钟并且 returns 平均数据传输速度为 100MB/5minutes = 333KB/s 而不是 10MB/s.

不幸的是,使用 10s 作为回顾 window 并没有像预期的那样工作 - rate(unifi_devices_wireless_received_bytes_total[10s]) 很可能 return 什么也没有。这是因为 Prometheus 中的 rate() 期望在 lookbehind window 上至少有两个原始样本。这意味着必须至少每 5 秒或更频繁地将新样本写入 Prometheus 以供 [10s] 后视 window。解决方案是使用 irate() 函数而不是 rate():

irate(unifi_devices_wireless_received_bytes_total[5m])

此查询可能 return 数据传输速率,如果原始样本之间的间隔(又名 scrape_interval)小于 10 秒,则该数据传输速率更接近预期的 10MB。

不幸的是,一般情况下不建议使用 irate() 函数,因为在大时间范围内刷新图形时,它往往会 return 跳变结果。阅读 this article 了解详情。

所以最终的解决方案是使用 rollup_rate function from VictoriaMetrics - 它可以可靠地检测到反利率的峰值。