写点什么

Prometheus 内置函数(三)

用户头像
耳东@Erdong
关注
发布于: 刚刚

histogram_quantile()

histogram_quantile(φ float, b instant-vector)bucket 类型的向量 b 中计算 φ (0 ≤ φ ≤ 1) 分位数(百分位数的一般形式)的样本的最大值。(有关 φ 分位数的详细说明以及直方图指标类型的使用,请参阅直方图和摘要)。向量 b 中的样本是每个 bucket 的采样点数量。每个样本的 labels 中必须要有 le 这个 label 来表示每个 bucket 的上边界,没有 le 标签的样本会被忽略。直方图指标类型自动提供带有 _bucket 后缀和相应标签的时间序列。


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


例如,一个直方图指标名称为 employee_age_bucket_bucket,要计算过去 10 分钟内 第 90 个百分位数,请使用以下表达式:


histogram_quantile(0.9, rate(employee_age_bucket_bucket[10m]))
复制代码


返回:


{instance="10.0.86.71:8080",job="prometheus"} 35.714285714285715
复制代码


这表示最近 10 分钟之内 90% 的样本的最大值为 35.714285714285715。


这个计算结果是每组标签组合成一个时间序列。我们可能不会对所有这些维度(如 job、instance 和 method)感兴趣,并希望将其中的一些维度进行聚合,则可以使用 sum() 函数。例如,以下表达式根据 job 标签来对第 90 个百分位数进行聚合:


# histogram_quantile() 函数必须包含 le 标签histogram_quantile(0.9, sum(rate(employee_age_bucket_bucket[10m])) by (job, le))
复制代码


如果要聚合所有的标签,则使用如下表达式:


histogram_quantile(0.9,sum(rate(employee_age_bucket_bucket[10m])) by (le))
复制代码


histogram_quantile 这个函数是根据假定每个区间内的样本分布是线性分布来计算结果值的(也就是说它的结果未必准确),最高的 bucket 必须是 le="+Inf" (否则就返回 NaN)。


如果分位数位于最高的 bucket(+Inf) 中,则返回第二个最高的 bucket 的上边界。如果该 bucket 的上边界大于 0,则假设最低的 bucket 的的下边界为 0,这种情况下在该 bucket 内使用常规的线性插值。


如果分位数位于最低的 bucket 中,则返回最低 bucket 的上边界。

holt_winters()

holt_winters(v range-vector, sf scalar, tf scalar) 函数基于区间向量 v,生成时间序列数据平滑值。平滑因子 sf 越低, 对旧数据的重视程度越高。趋势因子 tf 越高,对数据的趋势的考虑就越多。其中,0< sf, tf <=1


holt_winters 仅适用于 Gauge 类型的时间序列。

hour()

hour(v=vector(time()) instant-vector) 函数返回被给定 UTC 时间的当前第几个小时,时间范围:0~23。

idelta()

idelta(v range-vector) 的参数是一个区间向量, 返回一个瞬时向量。它计算最新的 2 个样本值之间的差值。


这个函数一般只用在 Gauge 类型的时间序列上。

increase()

increase(v range-vector) 函数获取区间向量中的第一个和最后一个样本并返回其增长量, 它会在单调性发生变化时(如由于采样目标重启引起的计数器复位)自动中断。由于这个值被外推到指定的整个时间范围,所以即使样本值都是整数,你仍然可能会得到一个非整数值。


例如,以下表达式返回区间向量中每个时间序列过去 5 分钟内 HTTP 请求数的增长数:


increase(http_requests_total{job="apiserver"}[5m])
复制代码


increase 的返回值类型只能是计数器类型,主要作用是增加图表和数据的可读性。使用 rate(v) 函数记录规则的使用率,以便持续跟踪数据样本值的变化。

irate()

irate(v range-vector) 函数用于计算区间向量的增长率,但是其反应出的是瞬时增长率。irate 函数是通过区间向量中最后两个两本数据来计算区间向量的增长速率,它会在单调性发生变化时(如由于采样目标重启引起的计数器复位)自动中断。这种方式可以避免在时间窗口范围内的“长尾问题”,并且体现出更好的灵敏度,通过 irate 函数绘制的图标能够更好的反应样本数据的瞬时变化状态。


例如,以下表达式返回区间向量中每个时间序列过去 5 分钟内最后两个样本数据的 HTTP 请求数的增长率:


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


irate 只能用于绘制快速变化的计数器,在长期趋势分析或者告警中更推荐使用 rate 函数。因为使用 irate 函数时,速率的简短变化会重置 FOR 语句,形成的图形有很多波峰,难以阅读。


当将 irate() 函数与聚合运算符(例如 sum())或随时间聚合的函数(任何以 _over_time 结尾的函数)一起使用时,必须先执行 irate() 函数,然后再进行聚合操作,否则当采样目标重新启动时 irate() 无法检测到计数器是否被重置。

label_join()

该函数允许你将标签纸连接在用,类似于在重新标记时处理souce_lables方法,同样该函数也不会删除指标名称。


语法格式是 label_join(v instant-vector, dst_label string, separator string, src_label_1 string, src_label_2 string, ...)


函数可以将时间序列 v 中多个标签 src_label 的值,通过 separator 作为连接符写入到一个新的标签 dst_label 中。可以有多个 src_label 标签。


例如,以下表达式返回的时间序列多了一个 foo 标签,标签值为 etcd,etcd-k8s


up{endpoint="api",instance="192.168.123.248:2379",job="etcd",namespace="monitoring",service="etcd-k8s"}==> up{endpoint="api",instance="192.168.123.248:2379",job="etcd",namespace="monitoring",service="etcd-k8s"} 1 label_join(up{endpoint="api",instance="192.168.123.248:2379",job="etcd",namespace="monitoring",service="etcd-k8s"}, "foo", ",", "job", "service")==> up{endpoint="api",foo="etcd,etcd-k8s",instance="192.168.123.248:2379",job="etcd",namespace="monitoring",service="etcd-k8s"} 1
复制代码


再看一个简单例子:


go_info{job="LocalServer"}   ==> go_info{instance="localhost:9090", job="LocalServer", version="go1.16.4"} 1
label_join(go_info{job="LocalServer"},"newlable",'|',"job","version") ==> go_info{instance="localhost:9090", job="LocalServer", newlable="LocalServer|go1.16.4", version="go1.16.4"} 1
复制代码

label_replace()

该函数允许你对标签值进行正则表达式替换。与大多数函数不同的是,该函数不会删除指标名称。


为了能够让客户端的图标更具有可读性,可以通过 label_replace 函数为时间序列添加额外的标签。label_replace 的具体参数如下:


label_replace(v instant-vector, dst_label string, replacement string, src_label string, regex string)
复制代码


该函数会依次对 v 中的每一条时间序列进行处理,通过 regex 匹配 src_label 的值,并将匹配部分 relacement 写入到 dst_label 标签中。如下所示:


label_replace(up, "host", "$1", "instance", "(.*):.*")label_replace(up{job="api-server",service="a:c"}, "foo", "$1", "service", "(.*):.*")
复制代码


函数处理后,时间序列将包含一个 host 标签,host 标签的值为 Exporter 实例的 IP 地址:


up{host="localhost",instance="localhost:8080",job="cadvisor"} 1up{host="localhost",instance="localhost:9090",job="prometheus"} 1up{host="localhost",instance="localhost:9100",job="node"} 1
复制代码


再看一个简单的例子


up{job="LocalServer"}==> up{instance="localhost:9090", job="LocalServer"}
label_replace(up{job="LocalServer"}, "instance", "$1:9200", "job", "(.*)")==> up{instance="LocalServer:9200", job="LocalServer"}
复制代码

ln()

ln(v instant-vector) 计算瞬时向量 v 中所有样本数据的自然对数。特殊情况:


  • ln(+Inf) = +Inf

  • ln(0) = -Inf

  • ln(x < 0) = NaN

  • ln(NaN) = NaN

log2()

log2(v instant-vector) 函数计算瞬时向量 v 中所有样本数据的二进制对数。特殊情况:


  • ln(+Inf) = +Inf

  • ln(0) = -Inf

  • ln(x < 0) = NaN

  • ln(NaN) = NaN


比如:


log2(vector(2)) # {} 1 
复制代码

log10()

log10(v instant-vector) 计算瞬时向量 v 中所有样本数据的十进制对数。特殊情况:


  • ln(+Inf) = +Inf

  • ln(0) = -Inf

  • ln(x < 0) = NaN

  • ln(NaN) = NaN 比如:


log10(vector(10)) # {} 1 
复制代码


发布于: 刚刚阅读数: 2
用户头像

耳东@Erdong

关注

还未添加个人签名 2020.05.24 加入

主要研究分享运维技术,专注于监控、CICD、操作系统、云原生领域,公众号【耳东学堂】,知识星球同名,坚持原创,希望能和大家在运维路上结伴而行 邮箱:erdong@mail.erdong.site

评论

发布
暂无评论
Prometheus 内置函数(三)