PromQL 典型的应用场景就是时序数据的查询和二次计算,这也是 PromQL 的两个核心价值,其中查询操作靠的就是查询选择器。
随便一个公司,时序数据至少都有成千上万条,而每个监控图表的渲染或者每条告警规则的处理,都只是针对有限的几条数据,所以 PromQL 第一个需求就是过滤。
{__name__=~"node_load.*", zone="sh"}[1m]
算术运算符比较简单,就是我们常用的加减乘除、取模之类的符号。
# 计算内存可用率,就是内存可用量除以内存总量,又希望按照百分比呈现,所以最后乘以100 mem_available{app="clickhouse"} / mem_total{app="clickhouse"} * 100 # 计算北京区网口出向的速率,原始数据的单位是byte,网络流量单位一般用bit,所以乘以8 irate(net_sent_bytes_total{zone="beijing"}[1m]) * 8
比较运算符就是大于、小于、等于、不等于之类的,理解起来也比较简单,但是意义重大,告警规则的逻辑就是靠比较运算符来支撑的。
mem_available{app="clickhouse"} / mem_total{app="clickhouse"} * 100 < 20 irate(net_sent_bytes_total{zone="beijing"}[1m]) * 8 / 1024 / 1024 > 700
逻辑运算符有 3 个,and、or 和 unless,用于 instant-vector 之间的运算。and 是求交集,or 是求并集,unless 是求差集。我们来看一个 and 的使用场景。
disk_used_percent{app="clickhouse"} > 70 and disk_total{app="clickhouse"}/1024/1024/1024 < 200
向量之间的操作是想要在右侧的向量中,为左侧向量的每个条目找到一个匹配的元素,匹配行为分为:one-to-one、many-to-one、one-to-many。
mysql_slave_status_slave_sql_running == 0 and ON (instance) mysql_slave_status_master_server_id > 0
聚合运算针对单个指标的多个 series,还会有一些聚合需求。比如说,我想查看 100 台机器的平均内存可用率,或者想要排个序,取数值最小的 10 台。这种需求可以使用 PromQL 内置的聚合函数来实现。
# 求取 clickhouse 的机器的平均内存可用率 avg(mem_available_percent{app="clickhouse"}) # 把 clickhouse 的机器的内存可用率排个序,取最小的两条记录 bottomk(2, mem_available_percent{app="clickhouse"})
PromQL 的两个核心价值,一个是筛选,一个是计算。筛选是靠查询选择器,查询分为即时查询和范围查询。计算部分内容较多,有算术、比较、逻辑、聚合运算符,还有向量匹配逻辑,特别是 group_left 和 group_right。