写点什么

Prometheus 基础查询(三)范围向量和 PromQL 的缺陷

用户头像
耳东@Erdong
关注
发布于: 刚刚

范围向量

范围向量的工作方式类似于瞬时向量,除了它们从当前瞬间选择返回的数据范围。从语法上讲,在向量选择器的末尾用方括号([])附加一个时间持续时间,以指定每个结果范围向量元素应该获取的时间值。


在这个例子中,我们选择指标名称为 http_requests_totaljob label 设置为 prometheus 的所有时间序列在过去 5 分钟内记录的所有值:


http_requests_total{job="prometheus"}[5m]
复制代码

时间范围

时间长度指定为一个数字,后面紧跟着下列单位之一:


  • ms - milliseconds 毫秒

  • s - seconds 秒

  • m - minutes 分钟

  • h - hours 小时

  • d - days 天,假设一天总是 24h。为什么要假设,因为我们现在是作为计量单位来进行描述,如果按照自然地球日或者其他各种历法,一天不一定是完整的,正正好好的 24 h 。

  • w - weeks 周,假设一周总是 7 天。同理上一条。

  • y - years 年,假设一年总是 365 天。闰年是 366 天嘛,所以这个时间计量单位是不分平年和闰年的。


时间持续范围可以通过连接来组合。单位必须按从大到小的顺序排列。一个给定的单位在一段时间内只能出现一次。比如


1h2h20m5m15s
复制代码


PromQL 查询的缺陷

过期数据

在执行查询语句时,抽样数据所在的时间戳将独立于当前的实际时间序列数据进行选择。这主要是为了支持像聚合(sum、avg 等)这样的情况,在这种情况下,多个聚合时间序列不能在时间上精确对齐。由于它们的独立性,Prometheus 需要在这些时间戳上为每个相关的时间序列分配一个值。它只需要在这个时间戳之前获取最新的样本即可。

如果指标获取或规则评估不再返回以前存在的时间序列数据,则该时间序列将被标记为陈旧。如果删除了目标,那么之前返回的时间序列数据很快就会被标记为过时的。

如果在一个时间序列数据被标记为过时之后,在一个采样时间戳上计算查询,则不会为该时间序列返回值。如果随后在该时间序列中摄入了新的数据,它们将被正常退回。

如果在采样时间戳 5 分钟前没有找到数据(默认情况下),则该时间序列在此时间点上没有返回值。这实际上意味着,当最新收集的样本时间超过 5 分钟,或者被标记为陈旧时,时间序列就会从图表中“消失”。

在时间序列中包含时间戳的时间序列将不会被标记为过时。在这种情况下,只应用 5 分钟阈值。

避免慢查询和重载

如果一个查询需要操作大量的数据,把这个查询结果绘制成图形可能会超时,也有可能使 Prometheus 服务或者浏览器崩溃。因此,在执行对未知数据的查询时,尽量或者应当首先在 Prometheus 的表达式浏览器的表格视图中开始执行查询过程,也就是先查询一个瞬时值,直到结果集看起来合理为止(最多是数百个,而不是数千个时间序列)。当经过充分地过滤或聚合数据时,达到一个合理的情况时,切换到图形模式进行绘图。如果表达式仍然需要很长时间才能得到结果,那么可以通过相关规则进行预处理数据以后载执行。

这与 Prometheus 的查询语言特别相关,在这种语言中,像 api_http_requests_total 这样的指标名称选择器可以扩展到数千个带有不同标签的时间序列。还要记住,在多个时间序列上聚合的表达式将在服务器上生成负载,即使输出只是少量的时间序列。这类似于在关系数据库中对一列的所有值求和,即使输出值只是一个数字,也是很慢的。

发布于: 刚刚阅读数: 2
用户头像

耳东@Erdong

关注

还未添加个人签名 2020.05.24 加入

主要研究分享运维技术,专注于监控、CICD、操作系统、云原生领域,公众号【耳东学堂】,知识星球同名,坚持原创,希望能和大家在运维路上结伴而行 邮箱:erdong@mail.erdong.site

评论

发布
暂无评论
Prometheus 基础查询(三)范围向量和 PromQL 的缺陷