如何在 Prometheus 中每小时正确抓取和查询指标

Posted

技术标签:

【中文标题】如何在 Prometheus 中每小时正确抓取和查询指标【英文标题】:How to correctly scrape and query metrics in Prometheus every hour 【发布时间】:2019-12-30 23:08:34 【问题描述】:

我希望 Prometheus 每小时抓取一次指标,并将这些每小时抓取事件显示在 Grafana 仪表板的表格中。我在 prometheus.yml 文件中将全局抓取间隔设置为 1h。从 prometheus 可视化器来看,Prometheus 似乎在每小时的 43 分钟左右徘徊。但是,该数据似乎也仅在大约 3 分钟内有效:Prometheus graph

然后,我的情况是这样的:在 Grafana 表中,我将此指标的查询的最小步长设置为 1h,但这会导致表说没有数据点。但是,如果我将最小步长设置为 5 分钟,它会在 45 分钟标记上显示带有时间戳的每小时抓取事件。我对为什么会发生这种情况的猜测是,Prometheus 从某个小时的点开始,然后向前或向后迈出一小步。

这确实实现了我想做的事情,但如果 Prometheus 曾经做过类似前面图表开头的事情,它也有可能出现错误行为。我也知道我可以添加时间偏移,但它似乎总是相对于当前时间而不是绝对时间。

是否可以增加在 Prometheus 中刮取数据的有效时间,而不必每 3 分钟再次刮取一次?或者也许告诉普罗米修斯在每小时的 00 分钟标记处刮擦?或者如果没有,那么我可以在表格中添加一个相对时间偏移,使其从 45 分钟标记而不是 00 分钟标记开始?

附带说明,在上面的 Prometheus 图中,不规则数据是在 Prometheus 启动后被抓取的。我是22号18:30左右开始Prometheus的,但是Prometheus直到23:30才开始刮,然后在不同的时间间隔刮,直到23号2:43左右才稳定下来。有人知道为什么吗?

【问题讨论】:

我不完全确定您的问题是否会由此解决,但使用 grafana 中设置的时间段内的平均值可能有助于修复所有“空”值,因为结果对足够长。 【参考方案1】:

由于在 Prometheus 中实现了 staleness strategy,您的数据消失了。提取样本后,该指标在5 minutes 之后被认为是陈旧的。我没有找到任何配置来更改该值。

每小时刮一次并不是普罗米修斯的哲学。如果您真的需要以如此低的频率进行抓取,最好安排一个作业将数据发送到push gateway 或使用馈送到节点导出器的 prom 文件(如果有意义的话)。然后,您可以每 1-2 分钟抓取一次此端点。

您还可以滚动自己的导出器,该导出器会记住最后一次刮擦并仅在数据使用时间超过一小时时重新刮擦。 (这是我更喜欢的解决方案)

现在,作为一种快速解决方案,您可以请求过去一小时的数据并对其进行平均。这样,您将考虑到最后一次(旧)刮擦:

avg_over_time(old_metric[1h])

如果在抓取调度中存在一些抖动,它应该可以工作或有一些暂时的不正确值。

关于您在后期抓取方面遇到的问题,我怀疑抓取在这些日期失败。 Prometheus 仅在下一个计划(在您的情况下为 1 小时)重试。

【讨论】:

您的回答对我很有帮助。我面临与OP类似的问题。我每分钟都会从深度睡眠中唤醒传感器并进行测量。您能否就您所说的首选解决方案提供一些额外的细节?你的意思是有一些临时存储,每 1 分钟才公开一次指标吗?还是只让普罗米修斯每分钟刮一次?我开始觉得 Prometheus 可能不适合这些类型的用例,也许 InfluxDB 会更好。你有什么建议吗? 我更喜欢缓冲溶​​液,因为这样您就可以从 Prometheus 控制一切。使用批处理作业(节点或推送网关)需要对批处理进行调度,因此需要额外的配置点。

以上是关于如何在 Prometheus 中每小时正确抓取和查询指标的主要内容,如果未能解决你的问题,请参考以下文章

如何配置 kube-prometheus-stack helm 安装来抓取 Kubernetes 服务?

用 Django 和 Kubernetes 部署 prometheus,如何让它抓取 Django 应用程序?

如何将抓取目标添加到使用 Kubernetes-Helm 安装的 Prometheus 服务器?

如何在 .NET 中每小时(或每小时的特定时间间隔)引发一个事件?

如何在PHP MySql中每12小时更新一次行?

如何:在服务器中每 24 小时执行一次代码块?