从累计总数计算 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 分钟内,基于 rate
、here 的文档。
但我不明白 "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 - 它可以可靠地检测到反利率的峰值。
我在 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 分钟内,基于 rate
、here 的文档。
但我不明白 "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()
.
例如,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 - 它可以可靠地检测到反利率的峰值。