Lookback delta, Staleness and NaN in Prometheus
Lookback delta
Lookbackdelta是可以修改的,默认是5分钟
当必须定义“最新”样本时,就会出现棘手的情况。Prometheus 没有样本之间固定间隔的概念,因此很难绝对地说给定series是否存在“当前”最新样本。如果series的最新样本已经有一周了,您可能不希望将其包含在当前时间戳的即时向量选择器的结果中(这将导致图表中出现许多过时的系列“扁平化”)。另一方面,您也不能期望series与评估时间戳完全匹配,因为 Prometheus TSDB 中的样本在某些时间网格上未对齐,并且可以具有任意时间戳。
因此需要某种中间立场。为了选择既不太过时、也不需要超快抓取间隔甚至网格对齐样本时间戳的最新样本,即时向量选择器相对于评估时间戳最多回溯 5 分钟。时间戳早于 5 分钟的样本将从结果中删除。
Staleness
上面的 5 分钟规则是排除旧数据和包含足够新的样本之间的一个很好的折衷方案。然而,在某些情况下,系列在即时向量选择器结果中停留的时间比严格需要的时间长是令人烦恼的。例如,如果您在 Kubernetes 上运行服务并跟踪标签值中的 Pod 名称,则当您重新部署该服务时,所有系列标识(标签集)都会发生变化(因为 Pod 名称发生变化)。您将拥有具有一组 Pod 名称的旧系列和具有一组新名称的新系列。然而,在 5 分钟的时间内,您将在图表中同时看到新系列和旧系列,这可能会令人困惑。如果您基于这些数据进行聚合,那就更令人困惑了。如果您计算所有 Pod 的内存使用量总和,那么在 5 分钟内您将看到您应该看到的总使用量翻倍!
为了解决这个问题,Prometheus 支持将系列标记为显式陈旧:当 Prometheus 检测到一个系列将要灭绝时(因为它的目标已经消失,或者它不再在其目标的抓取中返回,或者因为记录规则停止返回它),普罗米修斯为本系列写下了明确的过时标记。在幕后,过时标记只是 TSDB 中该系列的正常样本,但具有一种特殊的NaN样本值来表示过时。
当即时向量选择器在评估时间戳之前遇到陈旧标记作为最后看到的样本值时,相应的系列将不会包含在结果中。这可以更快地解决“重复计数”和“扁平化”问题。
NaN
在幕后,过时标记只是 TSDB 中该系列的正常样本,但具有一种特殊的NaN样本值来表示过时文章来源:https://www.toymoban.com/news/detail-500528.html
源码里对NaN的定义:文章来源地址https://www.toymoban.com/news/detail-500528.html
const (
// NormalNaN is a quiet NaN. This is also math.NaN().
NormalNaN uint64 = 0x7ff8000000000001
// StaleNaN is a signaling NaN, due to the MSB of the mantissa being 0.
// This value is chosen with many leading 0s, so we have scope to store more
// complicated values in the future. It is 2 rather than 1 to make
// it easier to distinguish from the NormalNaN by a human when debugging.
StaleNaN uint64 = 0x7ff0000000000002
)
// IsStaleNaN returns true when the provided NaN value is a stale marker.
func IsStaleNaN(v float64) bool {
return math.Float64bits(v) == StaleNaN
}
到了这里,关于【博客673】Lookback delta, Staleness and NaN in Prometheus的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!