Prometheus Query 以高间隔和周期丢失数据

Posted

技术标签:

【中文标题】Prometheus Query 以高间隔和周期丢失数据【英文标题】:Prometheus Query losing data with high intervals and periods 【发布时间】:2021-10-29 11:44:14 【问题描述】:

我有一个非常简单的 promQL 查询:

sum(my_metrics)

嗯,我每个时期都有以下回报:

最近 6 小时:1058924(间隔 20 秒) 过去 12 小时:358243(间隔 1m) 过去 24 小时:163049(间隔 2m)

我了解间隔的增加(因为数据点)。但是这种情况给了我一个非常混乱的数字,而且仪表盘也不可靠。

最大的问题是:如何在 Grafana/Prometheus 中进行正确的求和而不“丢失数据”。

【问题讨论】:

【参考方案1】:

尝试sum(sum_over_time(my_metrics[d])),其中d 必须替换为6h12h24h,以获得过去 6 小时、12 小时或 24 小时内所有指标值的总和。

sum_over_time(m[d]) 是一个rollup function,它计算在给定的time 之前在给定的后视窗口d 上存储在数据库中的原始样本的总和,然后传递给/api/v1/query。每个时间序列独立计算总和。

sum() 是一个aggregate function,它计算多个时间序列中具有相同时间戳的点的总和。

【讨论】:

【参考方案2】:

您必须首先了解,Prometheus 和大多数公制系统都是针对变化趋势设计的,而不是精确计算。

在这种特殊情况下,间隔转换为查询步骤,步骤表示在范围的开始和结束之间跳转以评估表达式的量,每次跳转都会跳过一些数据点,这会影响结果。 要获得更准确的结果,但仍具有合理的性能,您可以使用记录规则创建具有原始抓取分辨率的指标每小时和每日汇总,并在仪表板中使用它们。

【讨论】:

以上是关于Prometheus Query 以高间隔和周期丢失数据的主要内容,如果未能解决你的问题,请参考以下文章

Prometheus 查询一个时间间隔下的总体平均值

Prometheus query_range 函数无法正常工作

Prometheus采集抓取间隔时间15秒与1秒的区别 scrape_interval

prometheus 常用指标

prometheus能监控哪些指标

如何从 Prometheus Query 中排除多个标签?