本节重点介绍 :
downsample降采样可以降低查询数据量
prometheus原生不支持downsample 实时查询/聚合 VS 预查询/聚合的优缺点
实时查询/聚合条件随意组合,性能差 预查询/聚合 性能好,聚合条件需要提前定义 prometheus的预查询/聚合配置举例
downsample降采样可以降低查询数据量
prometheus原生不支持downsample
还有个原因是prometheus原生不支持downsample,所以无论grafana上面的step随时间如何变化,涉及到到查询都是将指定的block解压再按step切割 所以查询时间跨度大对应消耗的cpu和内存就会暴增,同时原始点的存储也浪费了,因为grafana的step会随时间跨度变大变大
实时查询/聚合 VS 预查询/聚合
prometheus的query都是实时查询的/聚合
实时查询的优点很明显
查询/聚合条件随意组合,比如 rate后再sum然后再叠加一个histogram_quantile
实时查询的缺点也很明显
实时查询的优缺点反过来就是预查询/聚合的优缺点
一个预聚合的例子请看我写的falcon组件监控聚合器系列之: open-falcon新聚合器polymetric 所有的聚合方法提前定义好,并定时被计算出结果 查询时不涉及任何的聚合,直接查询结果 比如实时聚合需要每次加载10万个series,预聚合则只需要查询几个结果集
那么问题来了prometheus有没有预查询/聚合呢
prometheus的预查询/聚合
prometheus record 记录规则允许您预先计算经常需要或计算量大的表达式,并将其结果保存为一组新的时间序列 查询预先计算的结果通常比每次需要时执行原始表达式要快得多 这对于仪表板特别有用,仪表板每次刷新时都需要重复查询相同的表达式
record生产实例讲解
groups :
- name : my_record
interval : 30s
rules :
- record : hke: heavy_expr: 0211d8a2fcdefee8e626c86ba3916281
expr : sum(delta(kafka_topic_partition_current_offset{ instance=~'1.1.1.1: 9308', topic=~".+"} [ 5m] )/5) by (topic)
name代表 这个预聚合组的名字 interval: 30s代表 每30秒执行一次预聚合 rules代表规则 record代表聚合之后的metrics 名字,prometheus推荐使用 :代表聚合的的metrics expr 代表要执行的promql ,和alert不同就是不用加阈值
配置一个预聚合
avg( 1 - avg( rate( node_cpu_seconds_total{ job=~ "node_exporter" ,mode= "idle" } [ 2m] )) by ( instance)) * 100
cat << EOF > /opt/app/prometheus/record.yml
groups:
- name: example
rules:
- record: node_avg_cpu_usage
expr: avg(1 - avg(rate(node_cpu_seconds_total{job=~"node_exporter",mode="idle"}[2m])) by (instance)) * 100
EOF
[ root@prome-master01 prometheus]
Checking record.yml
SUCCESS: 1 rules found
修改主配置文件加入record 查询数据
本节重点总结 :
downsample降采样可以降低查询数据量
prometheus原生不支持downsample 实时查询/聚合 VS 预查询/聚合的优缺点
实时查询/聚合条件随意组合,性能差 预查询/聚合 性能好,聚合条件需要提前定义 prometheus的预查询/聚合配置举例
灵魂拷问