PromQL全解析

PromQL(Prometheus Query Language)为Prometheus tsdb的查询语言。是结合grafana进行数据展示和告警规则的配置的关键部分。

本文默认您已了解Prometheus的四种指标类型:

counter(计数器)

gauge (仪表类型)

histogram(直方图类型)

summary (摘要类型)

便于读者实践,本文大部分样本数据target:

Prometheus

node_exporter

表达式数据类型

PromQL查询语句即表达式,实现的四种数据类型:

Instant vector

Instance vector(瞬时向量)表示一个时间序列的集合,但是每个时序只有最近的一个点,而不是线。

image-20220306234734684

Range vector

Range vector(范围向量)表示一段时间范围里的时序,每个时序可包含多个点

image-20220306234624646

sources:Understanding Prometheus Range Vectors

Scalar

Scalar(标量)通常为数值,可以将只有一个时序的Instance vector转换成Scalar。

String

简单字符串值,目前未被使用。

选择器 标签选择器

查询Prometheus http状态码为400的请求数量。

prometheus_http_requests_total{code="400"}

image-20220304143538179

标签匹配运算符:

=:与字符串匹配

!=:与字符串不匹配

=~:与正则匹配

!~:与正则不匹配

查询Prometheus http状态码为4xx或5xx并且handler为/api/v1/query的请求数量

prometheus_http_requests_total{code=~"4.*|5.*",handler="/api/v1/query"}

内部标签__name__用来匹配指标名称,下面的表达式与上一条等价

{code=~"4.*|5.*",handler="/api/v1/query",__name__="prometheus_http_requests_total"} 范围选择器

查询过去5分钟Prometheus健康检查的采样记录。

prometheus_http_requests_total{code="200",handler="/-/healthy"}[5m]

image-20220304164256208

单位:ms、s、m、h、d、w、y

时间串联:[1h5m]一小时5分钟

时间偏移 通过offset

通过offset将时间倒退5分钟,即查询5分钟之前的数据。

prometheus_http_requests_total{code="200"} offset 5m

image-20220304212139634

同样支持查询range vector

prometheus_http_requests_total{code="200"}[3m] offset 5m @修饰符

还可以通过@ 直接跳转到某个uinx时间戳,需开启启动参数--enable-feature=promql-at-modifier

prometheus_http_requests_total{code="200"} @ 1646089826 运算符

Prometheus中的运算符与各类编程语言中的基本一致。

数学运算符

Prometheus 中存在以下数学运算符:

+(加法)

-(减法)

*(乘法)

/(除法)

%(取模)

^(幂)

两个标量之间的计算

10/3

image-20220305003059797

瞬时向量与标量计算,由于计算后值意义与原指标名有差异,Prometheus很贴心的帮我们移除了指标名称。

prometheus_http_response_size_bytes_sum / 1024

image-20220305005645428

两个瞬时向量间的计算,如下计算node的内存使用率

( 1 - node_memory_MemAvailable_bytes{job="node",instance="localhost:9100"} / node_memory_MemTotal_bytes{job="node",instance="localhost:9100"} ) * 100

image-20220305135606398

如果两个瞬时向量标签不一致可通过ignoring忽略多余标签

输入示例:

method_code:http_errors:rate5m{method="get", code="500"} 24 method_code:http_errors:rate5m{method="post", code="500"} 6 method:http_requests:rate5m{method="get"} 600 method:http_requests:rate5m{method="post"} 120

查询示例:

method_code:http_errors:rate5m{code="500"} / ignoring(code) method:http_requests:rate5m

结果示例:

{method="get"} 0.04 // 24 / 600 {method="post"} 0.05 // 6 / 120

如果两个瞬时向量数量不一致时可通过group_left、group_right指定以那一侧为准

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzjdys.html