(译) 理解 Prometheus 的范围向量 (Range Vector)

Prometheus 中 Range Vector 的概念是有一点不直观的,除非你彻底阅读并理解了官方提供的文档。谁会这样做呢,去读官方文档?大多的人应该会花些错误的时间去做了一些错误的事情,然后随机去寻找一篇像本文一样的文章去理解这个概念,不是吗?

什么是 Vector

由于 Prometheus 是一个时序型的数据库,所以所有的数据都在基于时间戳的上下文中被定义。由时间戳到记录数据的映射(map)序列(series)被称之为时间序列(timeseries)。在 Prometheus 的术语中,关于时间序列的集合(即一组时序数据)被称之为 vector。让我们用一个示例去更好的说明这一点。

假设 http_requests_total 是一个表示服务受到的 http 请求总量的 vector。Vectors 允许我们更进一步的使用被称为 “labels” 的东西多维度去表示数据。 例:

// the set of timeseries representing the number of requests with a `200` HTTP response code.
// HTTP 状态码为 200 的请求数的一组时间序列
http_requests_total{code="200"}

// the set of timeseries representing the number of requests served by the `/api/v1/query` handler.
// 表示' /api/v1/query '处理程序处理的请求数的一组时间序列
http_requests_total{handler="/api/v1/query"}

这样,我们就拥有了所有与所服务的 HTTP 请求数量相关的细粒度的信息,同时还可以在需要时选择聚合这些信息。从语法上讲,http_requests_total 指的是命名为它的整个时间序列集。通过添加 {code="200"}{handler="/api/v1/query"},我们选择了一个子集。

Vectors 的类型

Prometheus 进一步定义了两种类型的 vector,取决于时间戳(timestamps)被映射为什么:

  • Instant vector-一组时间序列,其中每个时间戳都映射到“瞬间(instant)”的单个数据点。在下面的响应中,我们可以看到在时间戳 1608481001 处记录的单个值。
curl 'http://localhost:9090/api/v1/query' \
  --data 'query=http_requests_total{code="200"}' \
  --data time=1608481001

{
  "metric": {"__name__": "http_requests_total", "code": "200"},
  "value": [1608481001, "881"]
}

Instant vector

  • Range vector-一组时间序列,其中每个时间戳映射到一个数据点的“范围(range)”,记录到过去的一段持续时间。如果没有称为 “range” 的指定持续时间,则这些值不能存在,该持续时间用于构建每个时间戳的值列表。 在下面的示例中,请注意带有时间戳的值列表,从 1608481001 到过去最多 30s
curl 'http://localhost:9090/api/v1/query' \
  --data 'query=http_requests_total{code="200"}[30s]' \
  --data time=1608481001

{
  "metric": {"__name__": "http_requests_total", "code": "200"},
  "values": [
    [1608480978, "863"],
    [1608480986, "874"],
    [1608480094, "881"]
  ]
}

Range vector

基于此,我们可以建立关于这两个 vector 类型的两个概念(ideas):

  1. Instant vectors 可以用直接被绘制; Range vectors 则不能。这是因为绘制图表需要在 y 轴上为 x 轴上的每个时间戳显示一个数据点。Instant vectors 的每个时间戳只有一个值,而 Range vectors 有很多。为了绘制指标(metric)图表,对于在时间序列中显示单个时间戳的多个数据点是没有被定义的。

  2. Instant vectors 可以进行比较和运算; Range vectors 不能。这也是由于比较运算符和算术运算符的定义方式。对于每个时间戳,如果我们有多个值,我们不知道如何添加[1]或将它们与另一个性质类似的时间序列进行比较。

为什么我们还需要 Range Vectors

我们现在知道,Range Vectors 不能直接用于图表或聚合。因此,很自然地要问它们为什么会存在? 答案很简单: counter。 counter 是监控系统的基本类型之一,除了 gauges 和 timings。我们将继续前面的示例,去试图理解 counters 和 range vectors 是如何相互作用的。

假设我们想知道我们的服务现在正在处理多少请求。我们的度量指标 http_requests_total{code="200",handler="/api/v1/query"} 是一个 instant vector,其值代表一个单调递增的 counter [2]。这个 counter 用于度量我们的服务接收到的请求总数。我们知道 Prometheus 在过去的不同时间里 “爬取(scraped)” 了这个 counter,所以我们可以简单地从请求 counter 的值开始:

curl 'http://localhost:9090/api/v1/query' \
  --data 'query=http_requests_total{code="200",handler="/api/v1/query"}'

{
  "metric": {"__name__": "http_requests_total", "code": "200", "handler":"/api/v1/query"},
  "value": [1608437313, "881"]
}

但从响应中可以看到,这样做会得到我们不感兴趣的请求的总数,我们关注的是它在过去的有限时间内收到的请求的数量(上面表示的是过去所有时间的请求总量),例如,最近十五分钟。当我们只有一个不断增长的 counter 时,我们如何得到这个数字?

更好的方法是用 counter 的当前值减去 15 分钟前看到的 counter 值。这样我们就可以得到实例在这段时间内接收到的确切请求数。为了在 PromQL 中表示这一点,我们给 instant vector 附加持续时间 [15m]。这部分叫做 range selector,它把 instant vector 转换成 range vector。然后,我们使用像increase 这样的函数,它有效地[3]从 range 开始处的数据点减去 range 结束处的数据点。

curl 'http://localhost:9090/api/v1/query' \
  --data 'query=increase(http_requests_total{code="200",handler="/api/v1/query"}[15m])'

{
  "metric": {"__name__": "http_requests_total", "code": "200", "handler":"/api/v1/query"},
  "values": [
    [1608437313, "18.4"]
  ]
}

上面查询语句的解释:它表示过去 15 分钟内请求总数的增长量。上面的响应包含了我们想要拿到的期望之内的答案。结果以 instant vector 的形式出现,现在可以用于进一步绘制图表或汇总(aggregated)。

用于 Range Vector 的函数

类似于 increase(range-vector),下面的 PromQL 函数只可用于 range vectors:

  • changes(range-vector)
  • absent_over_time(range-vector)
  • delta(range-vector)
  • deriv(range-vector)
  • holt_winters(range-vector, scalar, scalar)
  • idelta(range-vector)
  • irate(range-vector)
  • predict_linear(range-vector, scalar)
  • rate(range-vector)
  • resets(range-vector)
  • 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)
  • stddev_over_time(range-vector)
  • stdvar_over_time(range-vector)

上述的函数的计算结果返回都为 instant vector。因此,我们可以得出这样的结论: range vector 作为这些以 “range vector” 为输入值的函数是有用的。

除了上面的函数和 curls[^1],还有更多关于 range vectors 的内容,我们将在另一篇博文中介绍。

脚注

[1] 未定义的行为并不意味着不可能定义一种使这些操作可以工作的方式。这意味着实现选择避免支持这一点。这样做可以简化实现,或者因为可能没有一种方法使它在各种情况 (cases)之间一致地工作。

[2] 单调递增 counter 的值永不减少;它要么增加要么保持不变。Prometheus 只允许一种 counter 减少的情况,即在目标重启期间。如果 counter 值低于之前记录的值,则 rateincrease 等 range vector 函数将假定目标重新启动并将整个值添加到它所知道的现有值。这也是为什么我们应该总是先 rate 后 sum,而不是先 sun 后 rate。Rate then sum, never sum then rate

[3] “有效(effectively)”是这里的关键词。increase 实际上也可以进行外推,因为所请求的持续时间可能没有在范围(range)的“开始”和“结束”处精确对齐的数据点。

原文:https://satyanash.net/software/2021/01/04/understanding-prometheus-range-vectors.html 作者:Satyajeet Kanetkar 本文由博客群发一文多发等运营工具平台 OpenWrite 发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/433005.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024年Java者未来的出路在哪里,java多线程面试

重要 大环境对于我们能力要求越来越高,医学专家又说今年冬天新冠肺炎将“席卷重来”。 如果疫情再次爆发,势必将再次影响企业的正常运作,一波裁员浪潮你又能否抗住? 不管如何,明年金三银四又是一波跳槽时机&#xf…

AbaqusCST仿真软件功能对比简介

一、功能对比 支持维度CST:用于设计、分析和优化电磁部件及系统。适用于整个 EM 范围内各类应用领域的电磁场解算。Abaqus:ABAQUS 是一套功能强大的工程模拟的有限元软件,其解决问题的范围从相对简单的线性分析到复杂的非线性问题。 ABAQUS 包…

基于springboot+vue的精简博客系统

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…

flutter弹窗动画,2024年上半年最接地气的Android面经

正文 腾讯研发人数将近 2 万人,T4 级别的人数大概也不超过 500 人,这还是在近两年 T3 到 T4 级别人数增多的情况下。 该资料一共有五大章节,452页,是这位腾讯T4大佬耗时半个月熬夜整理出来的。 目录 第一章 深入解析 Binder. …

Java面试题【必知必会】Mybatis常见面试题(2024)

近期一直在准备面试,所以为了巩固知识,也为了梳理,整理了一些java的基础面试题!同时也希望各位英雄和女侠能够补充!不胜荣幸!!! 名称地址Java面试题【必知必会】基础(202…

Web3 赛道屠夫:「铁顺」是谁?

撰文:Terry 加密世界从不缺传奇故事,从不会编程的「失业青年」Hayden Adams 一入 Web3 便推出巅峰之作 Uniswap(《交易平台搅局者「Uniswap 之父」,不会编程的「失业青年」,出手即巅峰》),到 An…

VMware虚拟机安装linux教程

CentOS7下载 下载 (centos.org)https://www.centos.org/download/新建虚拟机 选择自定义安装 这里要注意兼容性,如果是VMware12创建的虚拟机复制到VM11、10或者更低的版本会出现一不兼容的现象。如果是用VMware10创建的虚拟机在VMware12中打开则不会出现兼容性问题…

二,几何相交----2.线段相交测试----(1)bruteforce

将与X轴平行的线段扩展到一般平面上的线段。 则可以使用burteforce两两测试,使用四次toleft即可。比如,线段(a,b)和线段(c,d)相交,必然线段的两个端点在另一个线段的两侧。这样时间复杂度就是成为了o(n2) 其实,时间复杂度可以降低…

半导体分析实验常用清洗器皿特氟龙塑料PFA实验室耗材

晶圆是一种用于制造集成电路和其他半导体器件的基础材料,通常是由单晶硅制成的圆形薄片,随着半导体行业的兴起,其作为行业内常用元件的基础材料,为了保证它可以正常工作,晶圆表面要保持洁净,无不相关的颗粒…

酷开科技以酷开系统为媒介,打造欢乐生活场景

家人相聚在一起的时光总是那么美好,在欢聚的日子里,我们也总是希望能够让时间变得慢一点,再慢一点,但是随着春节假期的结束,很多人已经开始了新一年的忙碌,大家纷纷回到工作、学习岗位,回归之前…

自动驾驶预测与决策规划(nuplan数据集)

欢迎大家关注我的B站: 偷吃薯片的Zheng同学的个人空间-偷吃薯片的Zheng同学个人主页-哔哩哔哩视频 (bilibili.com) 目录 1.概述 2 数据采集 3.开环与闭环仿真 4.数据注释 5.场景 6.规划框架 6.1Train 6.2Simulation 6.3Metric 6.4Visualization 7.下载…

如何使用DS file+cpolar内网穿透实现远程访问本地群晖NAS传输文件

文章目录 1. 群晖安装Cpolar2. 创建TCP公网地址3. 远程访问群晖文件4. 固定TCP公网地址5. 固定TCP地址连接 DS file 是一个由群晖公司开发的文件管理应用程序,主要用于浏览、访问和管理存储在群晖NAS(网络附加存储)中的文件。这个应用程序具有…

阿里云2024年有什么优惠活动?阿里云30个热门优惠活动汇总

对于想要购买阿里云各种云产品的用户来说,不管是新用户还是老用户,最为关心的是阿里云当下有哪些优惠活动,本文汇集了2024年阿里云官方目前正在进行中的所有优惠活动,其中优惠券和代金券活动4个,官方精选活动10个&…

鹅厂打工8年,我为啥突然裸辞?

公众号:程序员白特,欢迎一起交流学习~ 原文:以下文章来源于沐洒 ,作者ASCII26 今天跟大家分享一个重磅消息,沐洒终于从腾讯离职了! 不知不觉已经在鹅厂打了8年工,如果说在大厂里工作如同在高校…

基于 HBase Phoenix 构建实时数仓(1)—— Hadoop HA 安装部署

目录 一、主机规划 二、环境准备 1. 启动 NTP 时钟同步 2. 修改 hosts 文件 3. 配置所有主机间 ssh 免密 4. 修改用户可打开文件数与进程数(可选) 三、安装 JDK 四、安装部署 Zookeeper 集群 1. 解压、配置环境变量 2. 创建配置文件 3. 创建新…

各中间件性能、优缺点对比

参考资料: Kafka、ActiveMQ、RabbitMQ、RocketMQ 有什么优缺点?

【VTKExamples::PolyData】第四十八期 ShrinkPolyData

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 前言 本文分享VTK样例ShrinkPolyData,并解析接口vtkShrinkPolyData,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~YO 1. ShrinkPol…

外汇天眼:阳光男网友邀请投资全是假,2位女性受害者遭诈2400万

随着线上投资风气日渐兴盛,各种国际外汇与加密货币的投资诈骗也层出不穷。 2月下旬,台湾刑事警察局指出近期有2位女性受害者就因误信假网友的话术,结果总共损失超过76万颗USDT,总价值约新台币2400万。 第一位受害者林小姐是在脸书…

rocketmq Listener 消费消息的优雅方式(基于SPEL)

DefaultMQPushConsumer 配置 package repayment.config;import cn.itcast.wanxinp2p.repayment.message.diy.DefaultMessageListenerConcurrently; import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer; import org.apache.rocketmq.client.exception.MQClient…

【C++】类和对象(中)一篇文章带你学会六大默认成员函数

目录 一、类的6个默认成员函数二、 构造函数2.1 概念2.2 特征 三、析构函数3.1 概念3.2 特性 四、拷贝构造函数4.1 概念4.2 特征 五、赋值运算符重载5.1 运算符重载5.2 赋值运算符重载5.3 前置和后置重载 六、日期类的实现七、const成员八、取地址及const取地址操作符重载结尾 …