尝试以更简化的方式理解普罗米修斯数据模型以及速率函数如何工作

nad*_*gam 2 time-series prometheus

我正在尝试了解 Prometheus 的基础知识,在阅读了官方文档和一些博客后,我仍然不确定数据模型的核心是什么。现在我只指计数器

我的理解

  • 时间序列由数据类型(现在假设它的计数器)和标签定义
  • 例如,如果我们有两个标签,标签A和标签B,那么不同时间序列的数量将是A可以拥有的值的数量是B可以拥有的数量的倍数(简而言之|A|x|B|)
  • 这些时间序列的一种视图是即时向量
    • 如果 Prometheus 每小时采样一次,每小时都会有一个向量,向量大小将为 |A|x|B| 或|B| 如果我们为标签 A 设置一个值
    • 我们可以说它是一个“向量的时间序列”?
  • 另一种视图是范围向量
    • 现在每个向量更像是一个矩阵?(时间范围内的样本数)* |A|x|B| 的大小?
    • 速率函数采用该范围内的最新样本,减去第一个样本并除以该时间范围内的秒数?

这就是的理解,我确信它不准确:/所以如果有人能够对这些主题有所启发,我会很高兴。

val*_*ala 6

让我们从基础开始。

时间序列

在普罗米修斯中,时间序列是一系列(timestamp, value)按 排序的对timestamp。只能value包含数值(整数或小数)。

普罗米修斯中的每个时间序列都有一个名称。例如,temperaturerequests_total。此外,每个时间序列都可以有一组{key="value"}标签。例如,temperature{city="Paris"}requests_total{instance="host123",job="foo_app"}

时间序列由其名称及其标签唯一标识。例如,temperature{city="Paris"}temperature{city="London"}两个不同的时间序列,因为它们的标签值不同city

旁注:时间序列名称在 Prometheus 中可以称为__name__伪标签。所以,temperature{city="Paris"}{__name__="temperature",city="Paris"}参考同一时间序列。

系列选择器

Prometheus 允许使用例如系列选择器来选择与这些选择器匹配的时间序列。例如,temperature选择器选择所有名称为 的时间序列temperature,而{city=~"London|Paris"}选择所有标签city包含LondonParis值的时间序列。

柜台

计数器是一个从零开始并包含随时间非递减的值序列的时间序列。唯一的例外是服务重新启动后计数器重置为零。计数器通常用于对某些事件进行计数,例如已处理的请求。例如,计算路径上服务的请求http_requests_total{method="GET",path="/foo/bar"}数。GET/foo/bar

Prometheus 为计数器指标提供了有用的函数,例如rate()increase()

  • increase(m[d])m计算在给定的后视窗口上匹配系列选择器的计数器的增加d。例如,increase(http_requests_total[1h])返回名称为 的时间序列在过去一小时内的请求数http_requests_total。它针对每个时间序列匹配单独返回结果m

  • rate(m[d])m计算给定lookbehind window 上与系列选择器匹配的计数器指标的平均每秒增长率d。例如,rate(http_requests_total[1h])计算名称为 的时间序列在过去一小时内的平均每秒请求率http_requests_total

重要提示:increase()rate()函数仅期望计数器作为其输入。如果您将非计数器时间序列传递给这些函数,那么它们可能会返回意外(也称为垃圾)结果。

其他指标类型

Prometheus 支持其他度量类型。查看支持的指标类型列表

附加信息

以下文章包含对 Prometheus 新手有用的其他信息:

PS Prometheus 等概念range vector非常instant vector混乱。这就是为什么我不建议使用它们。有关详细信息,请参阅此答案