prometheus如何选择数据点以及处理counter跳变
1、prometheus如何选择数据点
时间是怎么进来的?范围和即时查询!
您可能已经注意到,PromQL 查询中对时间的唯一引用是相对引用(例如[5m],回顾 5 分钟)。那么如何指定绝对图形时间范围或在表中显示查询结果的时间戳呢?在 PromQL 中,此类时间参数与表达式分开发送到Prometheus 查询 API,确切的时间参数取决于您发送的查询类型。Prometheus 知道两种类型的 PromQL 查询:即时查询和范围查询。
1-1、即时查询
即时查询用于类表视图,您希望在其中显示单个时间点的 PromQL 查询结果。
即时查询具有以下参数:
- PromQL 表达式。
- 评估时间戳。
即时查询示例:让我们看一个即时查询示例,看看它的评估是如何工作的
http_requests_total想象一下在给定时间戳评估表达式。http_requests_total是一个即时向量选择器,它为具有度量名称 的任何时间序列选择最新样本http_requests_total。更具体地说,“最新”意味着相对于评估时间戳“最多 5 分钟旧且不陈旧”。因此,此选择器只会为在评估时间戳之前最多 5 分钟具有样本的系列生成结果,并且评估时间戳之前的最后一个样本不是过时标记(将系列标记为在某个时间点终止的显式方法) Prometheus TSDB 中的特定时间)。
如果我们在有最近样本的时间戳运行此查询,结果将包含两个系列,每个系列一个样本:
请注意,每个返回样本的输出时间戳不再是原始样本时间戳,而是设置为评估时间戳。
想象一下在某个时间戳执行相同的查询,其中该时间戳之前的数据有 >5m 的间隙:
在这种情况下,查询将返回空结果,因为所有匹配样本都太旧而无法包含在内。
1-2、范围查询
范围查询主要用于图形,您希望在其中显示给定时间范围内的 PromQL 表达式。范围查询的工作方式与许多完全独立的即时查询完全相同,这些查询在给定时间范围内的后续时间步长进行评估。当然,这是在幕后高度优化的,在这种情况下,Prometheus 实际上并没有运行许多独立的即时查询。
范围查询具有以下参数:
- PromQL 表达式。
- 一个开始时间。
- 结束时间。
- resolution step
在开始时间和结束时间之间的每个解析步骤评估表达式后,单独评估的时间片将缝合在一起形成单个范围向量。范围查询允许传入即时向量类型或标量类型表达式,但始终返回范围向量(标量或即
时向量在一定时间范围内求值的结果)。
范围查询示例:
如果我们将上面的示例表达式作为范围查询进行计算,它将如下所示(示例查询的解析步骤为 2.5 分钟):
请注意,每个评估步骤的行为与独立即时查询完全相同,并且每个独立即时查询没有查询总体范围的概念。另请注意,当原始样本恰好仍然是这两个步骤的最新样本(且不早于 5 分钟)时,某些后续解析步骤最终如何选择相同的基础原始样本作为其输出样本值。
在这种情况下,最终结果将是一个范围向量,其中包含一定时间范围内两个选定序列的样本,但也包含某些时间步长的序列数据中的间隙。
2、prometheus处理counter跳变
场景:
某个counter值对应的exporter重启了,导致counter重新计数,但是我们不希望因此在计算速率的时候出现负速率等异常结果
解决方法:发现并处理counter跳变
以下示例图显示了rate()计算如何处理在提供的窗口下发生的计数器重置。您可以将其想象为rate()从底层“真实”样本创建一组“虚拟”样本。然后根据虚拟样本计算最终速率,就好像从未发生过重置一样:
实际解决原理:
尽管counter一般只会叠加,但是当追踪它们的过程重置时,它们也会重置为0 。为了不把这些重置解释成实际的负rate,和counter相关的函数具有检测和处理这些重置的逻辑:如当在提供的时间窗口下迭代样本时,函数会检查是否有任何样本的值比前一个低,并将这种情况解释为counter重置。Counter在重置后总是从0开始,那么根据这个假设,这些函数只是将新的采样值加到之前看到的采样值上,以补偿重置。
counter重置处理并非万能和无损的:
注意:当counter重置时,数据有可能在Prometheus最后一次拉取之后,重置之前增加。这些增量会被Prometheus永远丢失,且无法找回。为了尽量减少这种影响,重置应该只在一段时间内发生一次,而且要比Prometheus拉取目标数据的频率低。