ToB企服应用市场:ToB评测及商务社交产业平台

标题: (译) 理解 Prometheus 的范围向量 (Range Vector) [打印本页]

作者: 惊雷无声    时间: 2024-5-13 07:37
标题: (译) 理解 Prometheus 的范围向量 (Range Vector)
Prometheus 中 Range Vector 的概念是有一点不直观的,除非你彻底阅读并理解了官方提供的文档。谁会这样做呢,去读官方文档?大多的人应该会花些错误的时间去做了一些错误的事情,然后随机去寻找一篇像本文一样的文章去理解这个概念,不是吗?
什么是 Vector

由于 Prometheus 是一个时序型的数据库,以是所有的数据都在基于时间戳的上下文中被定义。由时间戳到记载数据的映射(map)序列(series)被称之为时间序列(timeseries)。在 Prometheus 的术语中,关于时间序列的集合(即一组时序数据)被称之为 vector。让我们用一个示例去更好的阐明这一点。
假设 http_requests_total 是一个表现服务受到的 http 请求总量的 vector。Vectors 允许我们更进一步的使用被称为 “labels” 的东西多维度去表现数据。 例:
  1. // the set of timeseries representing the number of requests with a `200` HTTP response code.
  2. // HTTP 状态码为 200 的请求数的一组时间序列
  3. http_requests_total{code="200"}
  4. // the set of timeseries representing the number of requests served by the `/api/v1/query` handler.
  5. // 表示' /api/v1/query '处理程序处理的请求数的一组时间序列
  6. http_requests_total{handler="/api/v1/query"}
复制代码
这样,我们就拥有了所有与所服务的 HTTP 请求数量相关的细粒度的信息,同时还可以在需要时选择聚合这些信息。从语法上讲,http_requests_total 指的是命名为它的整个时间序列集。通过添加 {code="200"} 或 {handler="/api/v1/query"},我们选择了一个子集。
Vectors 的类型

Prometheus 进一步定义了两种类型的 vector,取决于时间戳(timestamps)被映射为什么:
  1. curl 'http://localhost:9090/api/v1/query' \
  2.   --data 'query=http_requests_total{code="200"}' \
  3.   --data time=1608481001
  4. {
  5.   "metric": {"__name__": "http_requests_total", "code": "200"},
  6.   "value": [1608481001, "881"]
  7. }
复制代码

  1. curl 'http://localhost:9090/api/v1/query' \
  2.   --data 'query=http_requests_total{code="200"}[30s]' \
  3.   --data time=1608481001
  4. {
  5.   "metric": {"__name__": "http_requests_total", "code": "200"},
  6.   "values": [
  7.     [1608480978, "863"],
  8.     [1608480986, "874"],
  9.     [1608480094, "881"]
  10.   ]
  11. }
复制代码

基于此,我们可以建立关于这两个 vector 类型的两个概念(ideas):
为什么我们还需要 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 的值开始:
  1. curl 'http://localhost:9090/api/v1/query' \
  2.   --data 'query=http_requests_total{code="200",handler="/api/v1/query"}'
  3. {
  4.   "metric": {"__name__": "http_requests_total", "code": "200", "handler":"/api/v1/query"},
  5.   "value": [1608437313, "881"]
  6. }
复制代码
但从响应中可以看到,这样做会得到我们不感爱好的请求的总数,我们关注的是它在已往的有限时间内收到的请求的数量(上面表现的是已往所有时间的请求总量),例如,最近十五分钟。当我们只有一个不断增长的 counter 时,我们如何得到这个数字?
更好的方法是用 counter 的当前值减去 15 分钟前看到的 counter 值。这样我们就可以得到实例在这段时间内接收到的确切请求数。为了在 PromQL 中表现这一点,我们给 instant vector 附加连续时间 [15m]。这部分叫做 range selector,它把 instant vector 转换成 range vector。然后,我们使用像increase 这样的函数,它有用地[3]从 range 开始处的数据点减去 range 结束处的数据点。
  1. curl 'http://localhost:9090/api/v1/query' \
  2.   --data 'query=increase(http_requests_total{code="200",handler="/api/v1/query"}[15m])'
  3. {
  4.   "metric": {"__name__": "http_requests_total", "code": "200", "handler":"/api/v1/query"},
  5.   "values": [
  6.     [1608437313, "18.4"]
  7.   ]
  8. }
复制代码
上面查询语句的解释:它表现已往 15 分钟内请求总数的增长量。上面的响应包含了我们想要拿到的盼望之内的答案。结果以 instant vector 的形式出现,现在可以用于进一步绘制图表或汇总(aggregated)。
用于 Range Vector 的函数

雷同于 increase(range-vector),下面的 PromQL 函数只可用于 range vectors:
上述的函数的计算结果返回都为 instant vector。因此,我们可以得出这样的结论: range vector 作为这些以 “range vector” 为输入值的函数是有用的。
除了上面的函数和 curls[^1],还有更多关于 range vectors 的内容,我们将在另一篇博文中先容。
脚注

[1] 未定义的行为并不意味着不可能定义一种使这些操作可以工作的方式。这意味着实现选择避免支持这一点。这样做可以简化实现,或者由于可能没有一种方法使它在各种情况 (cases)之间一致地工作。
[2] 单调递增 counter 的值永不减少;它要么增加要么保持稳定。Prometheus 只允许一种 counter 减少的情况,即在目标重启期间。如果 counter 值低于之前记载的值,则 rate 和 increase 等 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 发布

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4