原文:https://prometheus.io/docs/prometheus/latest/querying/basics/
Prometheus提供了一种称为PromQL(Prometheus查询语言)的功能查询语言,使用户可以实时选择和汇总时间序列数据。表达式的结果可以显示为图形,可以在Prometheus的表达式浏览器中显示为表格数据,也可以由外部系统通过HTTP API使用。
例子
本文档仅供参考。为了学习,从几个示例开始可能会更容易。
表达语言数据类型
在Prometheus的表达语言中,一个表达式或子表达式可以计算为以下四种类型之一:
- 即时向量 -一组时间序列,每个时间序列包含一个样本,所有样本共享相同的时间戳
- 范围向量 -一组时间序列,其中包含每个时间序列随时间变化的一系列数据点
- 标量 -一个简单的数字浮点值
- 字符串-一个简单的字符串值;目前未使用
根据用例(例如,在绘制图形或显示表达式的输出时),由于用户指定的表达式的结果,其中只有某些类型是合法的。例如,返回即时向量的表达式是唯一可以直接绘制图形的类型。
文字
字符串文字
可以在单引号,双引号或反引号中将字符串指定为文字。
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`
浮点文字
标量浮点值可以从字面上写为以下形式的数字 [-](digits)[.(digits)]
。
-2.43
时间序列选择器
即时向量选择器
即时矢量选择器允许在给定的时间戳(即时)下选择一组时间序列和每个样本的单个样本值:以最简单的形式,仅指定指标名称。这将导致一个即时向量,其中包含具有该指标名称的所有时间序列的元素。
本示例选择所有具有http_requests_total指标
名称的时间序列:
http_requests_total
可以通过在大括号({}
)中添加一组匹配的标签来进一步过滤这些时间序列。
本示例仅选择那些具有http_requests_total
指标名称的时间序列,这些时间序列也将job
标签设置为prometheus
并将其 group
标签设置为canary
:
http_requests_total{job="prometheus",group="canary"}
也可以否定地匹配标签值,或将标签值与正则表达式匹配。存在以下标签匹配运算符:
=
:选择与提供的字符串完全相同的标签。!=
:选择与提供的字符串不同的标签。=~
:选择与提供的字符串进行正则表达式匹配的标签。!~
:选择不与提供的字符串进行正则表达式匹配的标签。
例如,此选择所有http_requests_total
的时间序列staging
, testing
以及development
环境和HTTP的非GET方法
。
http_requests_total{environment=~"staging|testing|development",method!="GET"}
匹配空标签值的标签匹配器还会选择所有根本没有设置特定标签的时间序列。正则表达式匹配完全锚定。同一标签名称可能有多个匹配器。
向量选择器必须指定一个名称或至少一个与空字符串不匹配的标签匹配器。以下表达式是非法的:
{job=~".*"} # Bad!
相反,这些表达式都是有效的,因为它们都具有与空标签值不匹配的选择器。
{job=~".+"} # Good!
{job=~".*",method="get"} # Good!
通过与内部__name__
标签匹配,标签匹配器也可以应用于指标名称 。例如,该表达式http_requests_total
等效于 {__name__="http_requests_total"}
。其他的匹配器=
(!=
,=~
,!~
)也可以使用。以下表达式选择名称以开头的所有度量job:
:
{__name__=~"job:.*"}
Prometheus中的所有正则表达式都使用RE2语法。
范围向量选择器
范围向量文字的工作方式与即时向量文字相同,不同之处在于它们从当前即时选择回采样范围。从语法上讲,
在向量选择器的末尾,方括号[ ]中会附加一个范围持续时间,以指定应为每个结果范围向量元素提取多远的时间值。
持续时间以数字指定,后面紧跟以下单位之一:
s
-秒m
- 分钟h
- 小时d
- 天w
-周y
-年
在此示例中,我们选择所有时间序列在过去5分钟内记录的所有值,这些时间序列的指标名称http_requests_total
和job
标签设置为prometheus
:
http_requests_total{job="prometheus"}[5m]
Offset修饰符
offset修饰符
可以为查询中的个别时刻和范围矢量改变偏移时间。
例如,以下表达式返回http_requests_total
相对于当前查询评估时间的过去5分钟的值 :
http_requests_total offset 5m
请注意,offset
修饰符始终需要立即跟随选择器,即以下内容将是正确的:
sum(http_requests_total{method="GET"} offset 5m) // GOOD.
虽然以下是不正确的:
sum(http_requests_total{method="GET"}) offset 5m // INVALID.
范围向量的工作原理相同。这将返回http_requests_total
一周前的5分钟费率 :
rate(http_requests_total[5m] offset 1w)
子查询
子查询允许您针对给定的范围和resolution(
分辨率)运行即时查询。子查询的结果是范围向量。
句法: <instant_query> '[' <range> ':' [<resolution>] ']' [ offset <duration> ]
<resolution>
是可选的。默认值为全局评估间隔。
运算符
Prometheus支持许多二进制和聚合运算符。这些在表达式语言运算符页面中进行了详细描述。
函数
Prometheus支持多种对数据进行操作的函数。这些在表达语言功能页面中进行了详细描述。
注释
PromQL支持以#开头的注释行。例:
# This is a comment
陷阱
陈旧性
运行查询时,将选择采样数据的时间戳,而不依赖于实际的当前时间序列数据。这主要是为了支持诸如聚合(sum
,avg
等)的情况,其中多个聚合时间序列在时间上不完全一致。由于它们的独立性,Prometheus需要为每个相关时间序列在那些时间戳上分配一个值。只需在此时间戳之前获取最新样本即可。
如果目标抓取或规则评估不再返回先前存在的时间序列的样本,则该时间序列将被标记为陈旧。如果删除了目标,则其先前返回的时间序列将在不久后标记为陈旧。
如果在某个时间序列标记为陈旧后以采样时间戳评估查询,则该时间序列不会返回任何值。如果随后在该时间序列中摄取了新样本,则它们将照常返回。
如果在采样时间戳记之前5分钟未找到样本(默认情况下),则该时间序列在此时间点不会返回任何值。这实际上意味着,在最新采集的样本超过5分钟或标记为陈旧之后,时间序列会从图表中“消失”。
对于在抓取中包含时间戳的时间序列,不会标记为陈旧。在这种情况下,仅会应用5分钟的阈值。
避免慢查询和重载
如果查询需要处理大量数据,则对其进行图形化处理可能会超时或使服务器或浏览器超载。因此,在对未知数据构建查询时,请始终开始在Prometheus表达式浏览器的表格视图中构建查询,直到结果集看起来合理为止(最多数百个而不是数千个时间序列)。仅当您充分过滤或汇总了数据后,才切换到图形模式。如果该表达式仍无法花费很长时间来绘制临时图形,请通过记录规则对其进行预记录。
这对于Prometheus的查询语言尤其重要,在该语言中,像这样的裸指标名称选择器api_http_requests_total
可以扩展到成千上万个具有不同标签的时间序列。还请记住,即使输出只是少量时间序列,在多个时间序列上聚合的表达式也会在服务器上产生负载。这类似于将关系数据库中的列的所有值相加会很慢,即使输出值只是一个数字也是如此。