PromQL(Prometheus Query Language)为Prometheus tsdb的查询语言。是结合grafana进行数据展示和告警规则的配置的关键部分。
本文默认您已了解Prometheus的四种指标类型:
counter(计数器)
gauge (仪表类型)
histogram(直方图类型)
summary (摘要类型)
便于读者实践,本文大部分样本数据target:
Prometheus
node_exporter
表达式数据类型PromQL查询语句即表达式,实现的四种数据类型:
Instant vector
Instance vector(瞬时向量)表示一个时间序列的集合,但是每个时序只有最近的一个点,而不是线。
Range vector
Range vector(范围向量)表示一段时间范围里的时序,每个时序可包含多个点
sources:Understanding Prometheus Range Vectors
Scalar
Scalar(标量)通常为数值,可以将只有一个时序的Instance vector转换成Scalar。
String
简单字符串值,目前未被使用。
选择器 标签选择器查询Prometheus http状态码为400的请求数量。
prometheus_http_requests_total{code="400"}标签匹配运算符:
=:与字符串匹配
!=:与字符串不匹配
=~:与正则匹配
!~:与正则不匹配
查询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]单位:ms、s、m、h、d、w、y
时间串联:[1h5m]一小时5分钟
时间偏移 通过offset通过offset将时间倒退5分钟,即查询5分钟之前的数据。
prometheus_http_requests_total{code="200"} offset 5m同样支持查询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瞬时向量与标量计算,由于计算后值意义与原指标名有差异,Prometheus很贴心的帮我们移除了指标名称。
prometheus_http_response_size_bytes_sum / 1024两个瞬时向量间的计算,如下计算node的内存使用率
( 1 - node_memory_MemAvailable_bytes{job="node",instance="localhost:9100"} / node_memory_MemTotal_bytes{job="node",instance="localhost:9100"} ) * 100如果两个瞬时向量标签不一致可通过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指定以那一侧为准