PromQL 分组与聚合函数
我们知道 Prometheus 的时间序列数据是多维数据模型,我们经常就有根据各个维度进行汇总的需求。
基于标签聚合
例如我们想知道我们的 demo 服务每秒处理的请求数,那么可以将单个的速率相加就可以。
sum(rate(demo_api_request_duration_seconds_count{job="demo"}[5m]))
可以得到如下所示的结果:
但是我们可以看到绘制出来的图形没有保留任何标签维度,一般来说可能我们希望保留一些维度,例如,我们可能更希望计算每个 instance 和 path 的变化率,但并不关心单个 method 或者 status 的结果,这个时候我们可以在 sum() 聚合器中添加一个 without() 的修饰符:
sum without(method, status) (rate(demo_api_request_duration_seconds_count{job="demo"}[5m]))
最后同理apiserver也是一样的
sum by(verb)(rate(apiserver_request_duration_seconds_count[5m]))
这里的分组概念和 SQL 语句中的分组去聚合就非常类似了。
除了 sum() 之外,Prometheus 还支持下面的这些聚合器/聚合函数:(如果不加上by进行分组,那么计算的是整个时间序列的值,只是一个值而已,没有标签维度)
sum():对聚合分组中的所有值进行求和
min():获取一个聚合分组中最小值
max():获取一个聚合分组中最大值
avg():计算聚合分组中所有值的平均值
stddev():计算聚合分组中所有数值的标准差
stdvar():计算聚合分组中所有数值的标准方差
count():计算聚合分组中所有序列的总数 计算序列的总数,要和sum取分开
count_values():计算具有相同样本值的元素数量
bottomk(k, ...):计算按样本值计算的最小的 k 个元素
topk(k,...):计算最大的 k 个元素的样本值
quantile(φ,...):计算维度上的 φ-分位数(0≤φ≤1)
group(...):只是按标签分组,并将样本值设为 1。
练习:
1.按 job 分组聚合,计算我们正在监控的所有进程的总内存使用量(process_resident_memory_bytes 指标):
sum by(job) (process_resident_memory_bytes)
2.计算 demo_cpu_usage_seconds_total 指标有多少不同的 CPU 模式:
count (group by(mode) (demo_cpu_usage_seconds_total))
3.计算每个 job 任务和指标名称的时间序列数量:
count by (job, __name__) ({__name__ != ""})