函数

一些函数具有默认参数,例如 year(v=vector(time()) instant-vector)。这意味着有一个参数 v 是一个瞬时向量,如果未提供,则默认为表达式 vector(time()) 的值。

关于实验性原生直方图的说明

  • 摄取原生直方图必须通过功能标志启用。只要没有原生直方图被摄取到 TSDB 中,所有函数的行为都将像往常一样。
  • 在其文档中没有明确提及原生直方图的函数(见下文)将忽略直方图样本。
  • 已经作用于原生直方图的函数在未来仍可能改变其行为。
  • 如果一个函数需要它所作用的多个原生直方图之间具有相同的桶布局,它将自动进行相应的转换。(使用当前支持的桶模式,这是始终可能的。)

abs()

abs(v instant-vector) 返回输入向量,其中所有样本值都转换为其绝对值。

absent()

absent(v instant-vector) 如果传递给它的向量有任何元素(浮点数或原生直方图),则返回一个空向量;如果传递给它的向量没有元素,则返回一个值为 1 的 1 元素向量。

这对于在给定指标名称和标签组合不存在时间序列时发出警报非常有用。

absent(nonexistent{job="myjob"})
# => {job="myjob"}

absent(nonexistent{job="myjob",instance=~".*"})
# => {job="myjob"}

absent(sum(nonexistent{job="myjob"}))
# => {}

在前两个示例中,absent() 试图智能地从输入向量派生 1 元素输出向量的标签。

absent_over_time()

absent_over_time(v range-vector) 如果传递给它的范围向量有任何元素(浮点数或原生直方图),则返回一个空向量;如果传递给它的范围向量没有元素,则返回一个值为 1 的 1 元素向量。

这对于在给定的指标名称和标签组合在一定时间内不存在时间序列时发出警报非常有用。

absent_over_time(nonexistent{job="myjob"}[1h])
# => {job="myjob"}

absent_over_time(nonexistent{job="myjob",instance=~".*"}[1h])
# => {job="myjob"}

absent_over_time(sum(nonexistent{job="myjob"})[1h:])
# => {}

在前两个示例中,absent_over_time() 试图智能地从输入向量派生 1 元素输出向量的标签。

ceil()

ceil(v instant-vector)v 中所有元素的样本值向上舍入到大于或等于 v 的最接近的整数值。

  • ceil(+Inf) = +Inf
  • ceil(±0) = ±0
  • ceil(1.49) = 2.0
  • ceil(1.78) = 2.0

changes()

对于每个输入时间序列,changes(v range-vector) 返回其值在提供的时间范围内更改的次数,作为瞬时向量。

clamp()

clamp(v instant-vector, min scalar, max scalar)v 中所有元素的样本值钳制为下限 min 和上限 max

特殊情况

  • 如果 min > max,则返回空向量
  • 如果 minmaxNaN,则返回 NaN

clamp_max()

clamp_max(v instant-vector, max scalar)v 中所有元素的样本值钳制为上限 max

clamp_min()

clamp_min(v instant-vector, min scalar)v 中所有元素的样本值钳制为下限 min

day_of_month()

day_of_month(v=vector(time()) instant-vector) 返回 UTC 中每个给定时间对应的月份中的日期。返回值从 1 到 31。

day_of_week()

day_of_week(v=vector(time()) instant-vector) 返回 UTC 中每个给定时间对应的星期几。返回值从 0 到 6,其中 0 表示星期日等。

day_of_year()

day_of_year(v=vector(time()) instant-vector) 返回 UTC 中每个给定时间对应的年份中的日期。对于非闰年,返回值从 1 到 365;对于闰年,返回值从 1 到 366。

days_in_month()

days_in_month(v=vector(time()) instant-vector) 返回 UTC 中每个给定时间对应的月份中的天数。返回值从 28 到 31。

delta()

delta(v range-vector) 计算范围向量 v 中每个时间序列元素的第一个值和最后一个值之间的差值,返回带有给定增量和等效标签的瞬时向量。增量被外推以覆盖范围向量选择器中指定的整个时间范围,因此即使样本值都是整数,也可能获得非整数结果。

以下示例表达式返回当前时间和 2 小时前的 CPU 温度差

delta(cpu_temp_celsius{host="zeus"}[2h])

delta 通过计算一个新的直方图来对原生直方图起作用,其中每个分量(观测值的总和和计数,桶)是 v 中第一个和最后一个原生直方图中的相应分量之间的差异。但是,v 中在范围内包含浮点数和原生直方图样本混合的每个元素,将从结果向量中丢失。

delta 应该仅与仪表和原生直方图一起使用,其中分量的行为类似于仪表(所谓的仪表直方图)。

deriv()

deriv(v range-vector) 使用简单线性回归计算范围向量 v 中时间序列的每秒导数。范围向量必须至少有两个样本才能执行计算。当在范围向量中找到 +Inf-Inf 时,计算出的斜率和偏移值将为 NaN

deriv 应该仅与仪表一起使用。

exp()

exp(v instant-vector) 计算 v 中所有元素的指数函数。特殊情况是

  • Exp(+Inf) = +Inf
  • Exp(NaN) = NaN

floor()

floor(v instant-vector)v 中所有元素的样本值向下舍入到小于或等于 v 的最接近的整数值。

  • floor(+Inf) = +Inf
  • floor(±0) = ±0
  • floor(1.49) = 1.0
  • floor(1.78) = 1.0

histogram_avg()

此函数仅作用于原生直方图,原生直方图是一项实验性功能。此函数的行为在未来的 Prometheus 版本中可能会发生变化,包括从 PromQL 中移除。

histogram_avg(v instant-vector) 返回原生直方图中存储的观测值的算术平均值。非原生直方图的样本将被忽略,并且不会显示在返回的向量中。

如下所示使用 histogram_avg 来计算原生直方图中 5 分钟窗口内的平均请求持续时间

histogram_avg(rate(http_request_duration_seconds[5m]))

这等效于以下查询

  histogram_sum(rate(http_request_duration_seconds[5m]))
/
  histogram_count(rate(http_request_duration_seconds[5m]))

histogram_count()histogram_sum()

这两个函数仅作用于原生直方图,原生直方图是一项实验性功能。这些函数的行为在未来的 Prometheus 版本中可能会发生变化,包括从 PromQL 中移除。

histogram_count(v instant-vector) 返回原生直方图中存储的观测次数。非原生直方图的样本将被忽略,并且不会显示在返回的向量中。

类似地,histogram_sum(v instant-vector) 返回原生直方图中存储的观测值的总和。

使用以下方式的 histogram_count 从原生直方图中计算观测值的速率(在此示例中对应于“每秒请求数”)

histogram_count(rate(http_request_duration_seconds[10m]))

histogram_fraction()

此函数仅作用于原生直方图,原生直方图是一项实验性功能。此函数的行为在未来的 Prometheus 版本中可能会发生变化,包括从 PromQL 中移除。

对于原生直方图,histogram_fraction(lower scalar, upper scalar, v instant-vector) 返回提供的下限值和上限值之间的观测值的估计分数。非原生直方图的样本将被忽略,并且不会显示在返回的向量中。

例如,以下表达式计算过去一小时内耗时 200 毫秒或更短的 HTTP 请求的比例

histogram_fraction(0, 0.2, rate(http_request_duration_seconds[1h]))

估计的误差取决于底层原生直方图的分辨率以及提供的边界与直方图中的桶边界的对齐程度。

+Inf-Inf 是有效的边界值。例如,如果上述表达式中的直方图包含负观测值(请求持续时间不应该出现这种情况),则包含所有小于或等于 0.2 的观测值的适当下限值应为 -Inf 而不是 0

提供的边界是包含还是排除,仅当提供的边界与底层原生直方图中的桶边界精确对齐时才相关。在这种情况下,其行为取决于直方图的架构定义。当前支持的架构都具有正值的包含上限和排除下限(负值则相反)。如果没有精确的边界对齐,该函数将使用线性插值来估计分数。由于由此产生的不确定性,边界是包含还是排除变得无关紧要。

histogram_quantile()

histogram_quantile(φ scalar, b instant-vector)经典直方图或原生直方图中计算 φ 分位数(0 ≤ φ ≤ 1)。(有关 φ 分位数的详细解释和(经典)直方图指标类型的一般用法,请参阅直方图和摘要。)

请注意,原生直方图是一项实验性功能。当处理原生直方图时,此函数的行为在未来的 Prometheus 版本中可能会发生变化。

b 中的浮点样本被认为是每个经典直方图中每个桶的观测计数。每个浮点样本必须有一个标签 le,其中标签值表示桶的包含上限。(没有此类标签的浮点样本将被静默忽略。)其他标签和指标名称用于识别属于每个经典直方图的桶。直方图指标类型自动提供具有 _bucket 后缀和适当标签的时间序列。

b 中的原生直方图样本被分别视为单独的直方图,以从中计算分位数。

只要不发生命名冲突,b 可以包含经典直方图和原生直方图的混合。

使用 rate() 函数指定分位数计算的时间窗口。

示例:一个名为 http_request_duration_seconds 的直方图指标(因此经典直方图的桶的指标名称为 http_request_duration_seconds_bucket)。要计算过去 10 分钟内请求持续时间的第 90 个百分位数,如果 http_request_duration_seconds 是一个经典直方图,请使用以下表达式

histogram_quantile(0.9, rate(http_request_duration_seconds_bucket[10m]))

对于原生直方图,请改为使用以下表达式

histogram_quantile(0.9, rate(http_request_duration_seconds[10m]))

分位数是为 http_request_duration_seconds 中的每个标签组合计算的。要聚合,请在 rate() 函数周围使用 sum() 聚合器。由于 histogram_quantile() 需要 le 标签来处理经典直方图,因此它必须包含在 by 子句中。以下表达式按经典直方图的 job 聚合第 90 个百分位数

histogram_quantile(0.9, sum by (job, le) (rate(http_request_duration_seconds_bucket[10m])))

当聚合原生直方图时,表达式简化为

histogram_quantile(0.9, sum by (job) (rate(http_request_duration_seconds[10m])))

要聚合所有经典直方图,请仅指定 le 标签

histogram_quantile(0.9, sum by (le) (rate(http_request_duration_seconds_bucket[10m])))

对于原生直方图,聚合所有内容像往常一样工作,而无需任何 by 子句

histogram_quantile(0.9, sum(rate(http_request_duration_seconds[10m])))

在(常见)分位数的值与桶边界不一致的情况下,histogram_quantile() 函数在分位数所在桶内插值分位数的值。对于经典直方图、具有自定义桶边界的原生直方图以及其他原生直方图的零桶,它假设桶内的观测值均匀分布(也称为线性插值)。对于具有标准指数分桶架构的原生直方图的非零桶,插值是在假设桶内的样本以均匀填充具有更高分辨率的假设直方图中的桶的方式分布的情况下完成的。(这也称为指数插值。)

如果 b 有 0 个观测值,则返回 NaN。对于 φ < 0,返回 -Inf。对于 φ > 1,返回 +Inf。对于 φ = NaN,返回 NaN

经典直方图的特殊情况

  • 如果 b 包含少于两个桶,则返回 NaN
  • 最高的桶必须具有 +Inf 的上限。(否则,将返回 NaN。)
  • 如果分位数位于最高的桶中,则返回次高桶的上限。
  • 如果最低桶的上限大于 0,则假定最低桶的下限为 0。在这种情况下,在该桶内应用通常的线性插值。否则,将返回位于最低桶中的分位数的最低桶的上限。

原生直方图的特殊情况(与零桶内发生的精确插值相关)

  • 如果直方图在正桶中有观测值,但在负桶中没有观测值,则假定具有有限宽度的零桶不包含负观测值。
  • 如果直方图在负桶中有观测值,但在正桶中没有观测值,则假定具有有限宽度的零桶不包含正观测值。

您可以使用 histogram_quantile(0, v instant-vector) 来获取存储在直方图中的估计最小值。

您可以使用 histogram_quantile(1, v instant-vector) 来获取存储在直方图中的估计最大值。

经典直方图的桶是累积的。因此,以下情况应始终成立

  • 桶中的计数单调递增(严格非递减)。
  • 两个连续桶的上限之间缺少观测值会导致这两个桶中的计数相等。

但是,浮点精度问题(例如,通过使用 sum(rate(...)) 计算桶引入的小差异)或无效数据可能会违反这些假设。在这种情况下,histogram_quantile 将无法返回有意义的结果。为了缓解此问题,histogram_quantile 假设连续桶之间发生的微小相对差异是由于浮点精度误差造成的,并忽略它们。(忽略两个桶之间差异的阈值是两个桶之和的万亿分之一 (1e-12)。)此外,如果即使在进行此调整后仍存在非单调桶计数,则它们会增加到先前桶的值,以强制单调性。后者证明输入数据存在实际问题,因此会用信息性注释 input to histogram_quantile needed to be fixed for monotonicity 标记。如果遇到此注释,则应查找并删除无效数据的来源。

histogram_stddev()histogram_stdvar()

这两个函数仅作用于原生直方图,原生直方图是一项实验性功能。这些函数的行为在未来的 Prometheus 版本中可能会发生变化,包括从 PromQL 中移除。

histogram_stddev(v instant-vector) 返回原生直方图中观测值的估计标准偏差,该标准偏差基于观测值所在的桶的几何平均值。非原生直方图的样本将被忽略,并且不会显示在返回的向量中。

类似地,histogram_stdvar(v instant-vector) 返回原生直方图中观测值的估计标准方差。

double_exponential_smoothing()

必须通过功能标志 --enable-feature=promql-experimental-functions 启用此功能。

double_exponential_smoothing(v range-vector, sf scalar, tf scalar) 基于 v 中的范围生成时间序列的平滑值。平滑因子 sf 越低,旧数据就越重要。趋势因子 tf 越高,数据中的趋势就越被考虑。sftf 都必须介于 0 和 1 之间。有关更多详细信息,请参阅NIST 工程统计手册。在 Prometheus V2 中,此函数称为 holt_winters。这引起了混淆,因为 Holt-Winters 方法通常指三指数平滑。此处实现的双指数平滑也称为“霍尔特线性”。

double_exponential_smoothing 只能与仪表一起使用。

hour()

hour(v=vector(time()) instant-vector) 返回 UTC 中给定时间的每天小时数。返回的值从 0 到 23。

idelta()

idelta(v range-vector) 计算范围向量 v 中最后两个样本之间的差值,返回一个具有给定增量和等效标签的瞬时向量。

idelta 只能与仪表一起使用。

increase()

increase(v range-vector) 计算范围向量中时间序列的增量。单调性中断(例如,由于目标重启而导致的计数器重置)会自动进行调整。增量被外推以覆盖范围向量选择器中指定的整个时间范围,因此即使计数器仅按整数增量增加,也可能会得到非整数结果。

以下示例表达式返回在过去 5 分钟内测量的 HTTP 请求数,每个时间序列在范围向量中

increase(http_requests_total{job="api-server"}[5m])

increase 作用于原生直方图,它会计算一个新的直方图,其中每个组件(观测值的总和和计数,以及桶)是 v 中第一个和最后一个原生直方图中相应组件之间的增量。但是,v 中在范围内包含浮点数和原生直方图样本混合的每个元素,都将从结果向量中缺失。

increase 应该仅用于计数器和组件行为类似于计数器的原生直方图。它是 rate(v) 乘以指定时间范围窗口下的秒数的语法糖,主要用于提高人类可读性。在记录规则中使用 rate,以便以每秒为单位持续跟踪增量。

info() (实验性)

info 函数是一项旨在改进围绕包含来自 info 指标的标签的用户体验的实验。此函数的行为可能会在 Prometheus 的未来版本中更改,包括从 PromQL 中删除。必须通过 功能标志 --enable-feature=promql-experimental-functions 启用 info

info(v 即时向量, [data-label-selector 即时向量]) 查找 v 中每个时间序列的所有具有匹配标识标签(稍后会详细介绍)的 info 系列,并将它们的数据(即非标识)标签的并集添加到时间序列。第二个参数 data-label-selector 是可选的。它不是真正的即时向量,而是使用其语法的子集。它必须以花括号 ({ ... }) 开始和结束,并且只能包含标签匹配器。标签匹配器用于约束要考虑哪些 info 系列以及要将哪些数据标签添加到 v

info 系列的标识标签是唯一标识 info 系列的标签子集。其余标签被视为数据标签(也称为非标识)。(请注意,Prometheus 的时间序列标识概念始终包含所有标签。为了 info 函数的目的,我们以与传统 Prometheus 视图不同的方式“逻辑地”定义 info 系列标识。)info 系列的标识标签用于将其与常规(非 info)系列连接,即那些与 info 系列的标识标签具有相同标签的系列。数据标签是 info 函数添加到常规系列中的标签,它们有效地编码了元数据键值对。(这意味着,在传统 Prometheus 视图中,数据标签的更改构成一个 info 系列的结束和一个新 info 系列的开始,而 info 函数的“逻辑”视图是,同一个 info 系列仍然存在,只是具有不同的“数据”。)

添加数据标签的传统方法有时被称为“连接查询”,如下例所示

  rate(http_server_request_duration_seconds_count[2m])
* on (job, instance) group_left (k8s_cluster_name)
  target_info

查询的核心是表达式 rate(http_server_request_duration_seconds_count[2m])。但是,要从 info 指标添加数据标签,用户必须使用复杂的(并且不是很明显的)语法来指定要使用哪个 info 指标 (target_info),标识标签是什么 (on (job, instance)),以及要添加哪些数据标签 (group_left (k8s_cluster_name))。

此查询不仅冗长且难以编写,而且还可能遇到“身份危机”:如果 target_info 的任何数据标签发生更改,Prometheus 会将其视为系列更改(如上所述,Prometheus 只是没有非标识标签的原生概念)。如果旧的 target_info 系列没有被正确标记为过时(这可能会发生在某些摄取路径中),则上面的查询将最多失败 5 分钟(回溯增量),因为它会发现旧版本和新版本的 target_info 都有冲突的匹配项。

info 函数不仅解决了对较新系列有利的这种冲突,而且还简化了语法,因为它知道可用的 info 系列及其标识标签。使用 info 函数的示例查询如下所示

info(
  rate(http_server_request_duration_seconds_count[2m]),
  {k8s_cluster_name=~".+"}
)

通过完全省略 info 函数的第二个参数,可以实现添加所有数据标签的常见情况,从而进一步简化示例

info(rate(http_server_request_duration_seconds_count[2m]))

虽然 info 通常会自动查找所有匹配的 info 系列,但可以通过提供 __name__ 标签匹配器来限制它们,例如 {__name__="target_info"}

限制

在其当前迭代中,info 默认仅考虑名称为 target_info 的 info 系列。它还假设标识 info 系列标签是 instancejob。但是,info 通过 __name__ 标签匹配器支持其他 info 系列名称。例如,可以明确地说明同时考虑 target_infobuild_info,如下所示:{__name__=~"(target|build)_info"}。但是,标识标签必须始终是 instancejob

这些限制部分破坏了 info 函数的目的。在当前阶段,这是一个实验,旨在了解这种方法在实践中有多有用。info 函数的最终版本确实会考虑所有匹配的 info 系列及其相应的标识标签。

irate()

irate(v 范围向量) 计算范围向量中时间序列的每秒瞬时增长率。这基于最后两个数据点。会自动调整单调性中断(例如,由于目标重启导致的计数器重置)。

以下示例表达式返回 HTTP 请求的每秒速率,该请求查找范围向量中每个时间序列的两个最新数据点,最长可回溯 5 分钟

irate(http_requests_total{job="api-server"}[5m])

仅当绘制波动剧烈的快速移动计数器时,才应使用 irate。对于警报和缓慢移动的计数器,请使用 rate,因为速率的短暂变化可能会重置 FOR 子句,并且完全由罕见峰值组成的图形很难读取。

请注意,当将 irate()聚合运算符(例如 sum())或随时间聚合的函数(任何以 _over_time 结尾的函数)组合使用时,始终首先使用 irate(),然后进行聚合。否则,当目标重启时,irate() 无法检测到计数器重置。

label_join()

对于 v 中的每个时间序列,label_join(v 即时向量, dst_label 字符串, separator 字符串, src_label_1 字符串, src_label_2 字符串, ...) 使用 separator 连接所有 src_labels 的所有值,并返回带有包含连接值的标签 dst_label 的时间序列。此函数中可以有任意数量的 src_labels

label_join 以相同的方式作用于浮点数和直方图样本。

此示例将返回一个向量,其中每个时间序列都有一个 foo 标签,该标签的值为 a,b,c

label_join(up{job="api-server",src1="a",src2="b",src3="c"}, "foo", ",", "src1", "src2", "src3")

label_replace()

对于 v 中的每个时间序列,label_replace(v 即时向量, dst_label 字符串, replacement 字符串, src_label 字符串, regex 字符串)正则表达式 regex 与标签 src_label 的值进行匹配。如果匹配,则返回的时间序列中标签 dst_label 的值将是 replacement 的扩展,以及输入中的原始标签。可以使用 $1$2 等引用正则表达式中的捕获组。可以使用 $name 引用正则表达式中的命名捕获组(其中 name 是捕获组名称)。如果正则表达式不匹配,则返回的时间序列保持不变。

label_replace 以相同的方式作用于浮点数和直方图样本。

此示例将返回标签 service 的值为 a:c 和标签 foo 的值为 a 的时间序列

label_replace(up{job="api-server",service="a:c"}, "foo", "$1", "service", "(.*):.*")

第二个示例与第一个示例具有相同的效果,并说明了如何使用命名捕获组: label_replace(up{job="api-server",service="a:c"}, "foo", "$name", "service", "(?P<name>.*):(?P<version>.*)")

ln()

ln(v 即时向量) 计算 v 中所有元素的自然对数。特殊情况是

  • ln(+Inf) = +Inf
  • ln(0) = -Inf
  • ln(x < 0) = NaN
  • ln(NaN) = NaN

log2()

log2(v 即时向量) 计算 v 中所有元素的二进制对数。特殊情况与 ln 中的情况相同。

log10()

log10(v 即时向量) 计算 v 中所有元素的十进制对数。特殊情况与 ln 中的情况相同。

minute()

minute(v=vector(time()) 即时向量) 返回 UTC 中每个给定时间的小时中的分钟数。返回值从 0 到 59。

month()

month(v=vector(time()) 即时向量) 返回 UTC 中每个给定时间的年份中的月份数。返回值从 1 到 12,其中 1 表示 1 月等等。

predict_linear()

predict_linear(v 范围向量, t 标量) 基于范围向量 v,使用简单线性回归,预测时间序列 t 秒后的值。范围向量必须至少有两个样本才能执行计算。如果在范围向量中找到 +Inf-Inf,则计算的斜率和偏移值将为 NaN

predict_linear 应该仅与仪表一起使用。

rate()

rate(v range-vector) 计算范围向量中时间序列每秒的平均增长率。它会自动调整单调性中断(例如由于目标重启导致的计数器重置)。此外,该计算会推断到时间范围的末尾,从而允许遗漏抓取或抓取周期与时间范围不完全对齐的情况。

以下示例表达式返回过去 5 分钟内测量的每秒 HTTP 请求速率,按范围向量中的每个时间序列计算。

rate(http_requests_total{job="api-server"}[5m])

rate 通过计算一个新的直方图来作用于原生直方图,其中每个分量(观测值的总和和计数,桶)是 v 中第一个和最后一个原生直方图中相应分量之间的增长率。但是,v 中包含范围内的浮点数和原生直方图样本混合的每个元素将从结果向量中缺失。

rate 应该仅用于计数器和行为类似于计数器的原生直方图。它最适合用于警报和绘制缓慢移动的计数器的图表。

请注意,当将 rate() 与聚合运算符(例如 sum())或随时间聚合的函数(任何以 _over_time 结尾的函数)结合使用时,始终先执行 rate(),然后再聚合。否则,当目标重启时,rate() 无法检测到计数器重置。

resets()

对于每个输入时间序列,resets(v range-vector) 返回提供的的时间范围内计数器重置的次数,作为一个瞬时向量。两个连续的浮点样本之间的值减少会被解释为计数器重置。原生直方图中的重置以更复杂的方式检测:任何桶(包括零桶)或观测计数的减少都构成计数器重置,但任何先前填充的桶的消失、桶分辨率的增加或零桶宽度的减少也构成计数器重置。

resets 应该仅用于计数器和类似于计数器的原生直方图。

如果范围向量包含同一序列的浮点数和直方图样本的混合,则会分别检测计数器重置,并将其数量相加。从浮点数到直方图样本的更改不被视为计数器重置。每个浮点数样本都与下一个浮点数样本进行比较,每个直方图都与下一个直方图进行比较。

round()

round(v instant-vector, to_nearest=1 scalar)v 中所有元素的样本值四舍五入到最接近的整数。通过向上取整来解决平局。可选的 to_nearest 参数允许指定样本值应四舍五入到的最接近的倍数。此倍数也可以是分数。

scalar()

给定一个单元素输入向量,scalar(v instant-vector) 返回该单元素的样本值作为标量。如果输入向量不正好有一个元素,则 scalar 将返回 NaN

sgn()

sgn(v instant-vector) 返回一个向量,其中所有样本值都转换为其符号,定义如下:如果 v 为正数则为 1,如果 v 为负数则为 -1,如果 v 等于零则为 0。

sort()

sort(v instant-vector) 返回按其样本值升序排序的向量元素。原生直方图按其观测值的总和排序。

请注意,sort 仅影响即时查询的结果,因为范围查询结果始终具有固定的输出顺序。

sort_desc()

sort 相同,但以降序排序。

sort 一样,sort_desc 仅影响即时查询的结果,因为范围查询结果始终具有固定的输出顺序。

sort_by_label()

必须通过功能标志 --enable-feature=promql-experimental-functions 启用此功能。

sort_by_label(v instant-vector, label string, ...) 返回按给定标签的值升序排序的向量元素。如果这些标签值相等,则元素按其完整的标签集排序。

请注意,按标签排序函数仅影响即时查询的结果,因为范围查询结果始终具有固定的输出顺序。

此函数使用自然排序

sort_by_label_desc()

必须通过功能标志 --enable-feature=promql-experimental-functions 启用此功能。

sort_by_label 相同,但以降序排序。

请注意,按标签排序函数仅影响即时查询的结果,因为范围查询结果始终具有固定的输出顺序。

此函数使用自然排序

sqrt()

sqrt(v instant-vector) 计算 v 中所有元素的平方根。

time()

time() 返回自 1970 年 1 月 1 日 UTC 以来的秒数。请注意,这实际上并不返回当前时间,而是表达式要评估的时间。

timestamp()

timestamp(v instant-vector) 返回给定向量的每个样本的时间戳,作为自 1970 年 1 月 1 日 UTC 以来的秒数。它也适用于直方图样本。

vector()

vector(s scalar) 返回标量 s 作为没有标签的向量。

year()

year(v=vector(time()) instant-vector) 返回 UTC 中给定时间中的每一年。

<aggregation>_over_time()

以下函数允许随时间聚合给定范围向量的每个序列,并返回一个包含每个序列聚合结果的瞬时向量。

  • avg_over_time(range-vector):指定间隔中所有点的平均值。
  • min_over_time(range-vector):指定间隔中所有点的最小值。
  • max_over_time(range-vector):指定间隔中所有点的最大值。
  • sum_over_time(range-vector):指定间隔中所有值的总和。
  • count_over_time(range-vector):指定间隔中所有值的计数。
  • quantile_over_time(scalar, range-vector):指定间隔中值的 φ 分位数 (0 ≤ φ ≤ 1)。
  • stddev_over_time(range-vector):指定间隔中值的总体标准偏差。
  • stdvar_over_time(range-vector):指定间隔中值的总体标准方差。
  • last_over_time(range-vector):指定间隔中最近的点值。
  • present_over_time(range-vector):指定间隔中任何序列的值 1。

如果设置了功能标志 --enable-feature=promql-experimental-functions,则可以使用以下附加函数。

  • mad_over_time(range-vector):指定间隔中所有点的中值绝对偏差。

请注意,即使值在整个间隔中不是均匀间隔的,指定间隔中的所有值在聚合中也具有相同的权重。

avg_over_timesum_over_timecount_over_timelast_over_timepresent_over_time 会按预期处理原生直方图。所有其他函数都会忽略直方图样本。

三角函数

三角函数以弧度为单位工作。

  • acos(v instant-vector):计算 v 中所有元素的反余弦(特殊情况)。
  • acosh(v instant-vector):计算 v 中所有元素的逆双曲余弦(特殊情况)。
  • asin(v instant-vector):计算 v 中所有元素的反余弦(特殊情况)。
  • asinh(v instant-vector):计算 v 中所有元素的逆双曲正弦(特殊情况)。
  • atan(v instant-vector):计算 v 中所有元素的反正切(特殊情况)。
  • atanh(v instant-vector):计算 v 中所有元素的逆双曲正切(特殊情况)。
  • cos(v instant-vector):计算 v 中所有元素的余弦(特殊情况)。
  • cosh(v instant-vector):计算 v 中所有元素的双曲余弦(特殊情况)。
  • sin(v instant-vector):计算 v 中所有元素的正弦(特殊情况)。
  • sinh(v instant-vector):计算 v 中所有元素的双曲正弦(特殊情况)。
  • tan(v instant-vector):计算 v 中所有元素的正切(特殊情况)。
  • tanh(v instant-vector):计算 v 中所有元素的双曲正切(特殊情况)。

以下函数对于在度数和弧度之间进行转换非常有用。

  • deg(v instant-vector):将 v 中所有元素的弧度转换为度数。
  • pi():返回 pi。
  • rad(v instant-vector):将 v 中所有元素的度数转换为弧度。

此文档是开源的。请通过提交问题或拉取请求来帮助改进它。