Prometheus PromQL入门使用指南
源自专栏《docker常用命令系列&&k8s系列目录导航》
查询Prometheus
示例
Prometheus提供了一种名为PromQL(Prometheus Query Language)的功能性查询语言,使用户能够实时选择和聚合时间序列数据。表达式的结果可以显示为图形,可以在Prometheus的表达式浏览器中查看为表格数据,也可以通过HTTP API被外部系统消费。
表达语言数据类型
在Prometheus的表达语言中,表达式或子表达式可以评估为以下四种类型之一:
- Instant vector:包含每个时间序列的单个样本,所有样本共享相同的时间戳
- Range vector:包含每个时间序列随时间变化的一系列数据点
- Scalar:简单的数值浮点值
- String:简单的字符串值,目前未使用
根据用例(例如绘制图形与显示表达式的输出),只有一些类型作为用户指定表达式的结果是合法的。例如,仅返回即时向量的表达式是唯一可以绘制的类型。
字面量
字符串字面量
字符串字面量使用单引号、双引号或反引号指定。
PromQL遵循与Go相同的转义规则。在单引号或双引号中的字符串字面量中,反斜杠开始一个转义序列,然后可能跟着a、b、f、n、r、t、v或\。可以使用八进制(\nnn)或十六进制(\xnn、\unnnn和\Unnnnnnnn)记法提供特定字符。
相反,反引号指定的字符串字面量中不解析转义字符。重要的是,与Go不同,Prometheus不会丢弃反引号内的换行符。
示例:
"this is a string"
'these are unescaped: \n \\ \t'
`these are not unescaped: \n ' " \t`
浮点数字面量
标量浮点值可以以整数或浮点数的文字形式编写,格式为(空格仅用于更好的可读性):
[-+]?(
[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?
| 0[xX][0-9a-fA-F]+
| [nN][aA][nN]
| [iI][nN][fF]
)
示例:
23
-2.43
3.4e-9
0x8f
-Inf
NaN
时间序列选择器
时间序列选择器负责选择时间序列和原始或推断的样本时间戳和值。
时间序列选择器不应与较高级别的即时查询和范围查询概念混淆,这些查询可以执行时间序列选择器。即时查询将在某一时间点评估给定的选择器,但范围查询将在最小时间戳和最大时间戳之间的多个不同时间点评估选择器。
即时向量选择器
即时向量选择器允许选择一组时间序列,并在给定时间戳(时间点)上为每个时间序列选择单个样本值。在最简单的形式中,仅指定一个指标名称,这会导致包含具有此指标名称的所有时间序列的即时向量元素。
此示例选择所有具有http_requests_total指标名称的时间序列:
http_requests_total
可以进一步通过在花括号({})中附加逗号分隔的标签匹配器列表来对这些时间序列进行筛选。
此示例仅选择具有http_requests_total指标名称且作业标签设置为prometheus以及组标签设置为canary的时间序列:
http_requests_total{job="prometheus",group="canary"}
还可以对标签值进行负匹配或根据正则表达式匹配标签值。存在以下标签匹配操作符:
- =:选择与提供的字符串完全相等的标签。
- !=:选择与提供的字符串不相等的标签。
- =~:选择与提供的字符串进行正则匹配的标签。
- !~:选择与提供的字符串不进行正则匹配的标签。
- 正则表达式完全锚定。对于env="foo"的匹配,将被视为env=“^foo$”。
例如,此选择所有属于staging、testing和development环境以及非GET方法的http_requests_total时间序列。
http_requests_total{environment=~"staging|testing|development",method!="GET"}
还匹配空标签值的标签匹配器也会选择所有未设置特定标签的时间序列。可以为同一标签名称设置多个匹配器。
例如,给定数据集:
http_requests_total
http_requests_total{replica="rep-a"}
http_requests_total{replica="rep-b"}
http_requests_total{environment="development"}
查询http_requests_total{environment=“”}将匹配并返回:
http_requests_total
http_requests_total{replica="rep-a"}
http_requests_total{replica="rep-b"}
并排除:
http_requests_total{environment="development"}
可以为同一标签名称使用多个匹配器;它们都必须通过才能返回结果。
查询:
http_requests_total{replica!="rep-a",replica=~"rep.*"}
然后将匹配:
http_requests_total{replica="rep-b"}
向量选择器必须指定名称或至少一个不匹配空字符串的标签匹配器。以下表达式是非法的:
{job=~".*"} # 错误!
相反,这些表达式是有效的,因为它们都具有不匹配空标签值的选择器。