promeQL 使用记录
2024-02-26 15:13:18

prometheus,说起来也用了挺久的了,但是以前一直只是把它部署上,没用过它的查询啥的,最近因为有监控需求,选择了从 Prometheus 查数据然后展示出来,其中遇到了一些问题,做一个记录。

瞬时向量和区间向量

在普罗米修斯中,一般都是使用 pull 的方式去获取指标(别的方式没用过,没见过,需要了解去翻文档),也就是说,应用系统,或者监测系统,需要写一个 exporter,对外表现为一个 http 服务的 metric 接口,然后在 Prometheus 中去配置 pull 的地址,以及间隔时间。同时,Prometheus 是一个时序数据库,它在获取到 exporter 的信息时,会一并记录下当前的时间,以一个时间序列存储下来,当后续需要查询某个指标的信息的时候,可以看到这个指标在过去时间段的变化情况。

瞬时向量:a set of time series containing a single sample for each time series, all sharing the same timestamp(一组时间序列,每个时间序列包含一个样本,并且所有时间序列共享相同的时间戳。)
区间向量:a set of time series containing a range of data points over time for each time series(一组时间序列,每个时间序列包含随着时间变化的一系列数据点。)

这是在官网给出的两个解释,除此以外,还有另外两种表达式,分别为: Scalar 、String,一般都是用 Instant vector 和 Range vector,有其他需要参考官方文档

在开发过程中,有的数据要求显示实时的变化情况,比如网速,延时,这类的数据我使用了 Instance vector 来做查询,这样可以得到最新的数据,另一类数据,比如一个接口的调用次数,接口的调用情况等,这些数据有可能会去查询过去某一段时间内的调用情况,于是就需要使用 Range vector。

topk 函数的坑

topk 函数,如果你是先使用 sum 聚合了一个 Range vector 的值,那么你计算出来的 top 5,可能会有 6、7、8 个数据,这是因为 topk 返回的是过去一组时间序列中,每一段时间的 top 5 的总和,在 stackoverflow 已经有人提过问题,这是一个特性,不是一个 bug,所以以后在做设计的时候要注意这个问题。

promQL 表达式

关于 promQL 表达式的文章很多,这里就强调一个事,promeQL 很灵活,支持子查询,支持正则表达式,能用正则表达式,绝大部分查询条件都能筛选出来了吧。

2023/06/29 补充

在普罗米修斯中,使用 query_range 查询出来的结果,是一系列随着时间不断变化的数据,这种查询方式主要用户画图,例如折线图、直方图等,如果遇到的需求是要展示某个指标在具体某个时间或者某个时间段的值,可以使用 query 去查询,自己通过 starttime 和 endtime 查询出对应的值,并根据业务需求对数据做处理。