配置乱序样本摄取
如果由于您的架构或您正在观察的系统的特性而存在乱序样本,则可以配置 Grafana Mimir,设置一个乱序时间窗口阈值,控制可摄取的样本的最大旧度。
作为一项**实验性**功能,Mimir 允许您摄取乱序样本。因此,如果样本在配置的时间窗口内,则不会被丢弃。
实例范围配置乱序样本摄取
要配置 Mimir 接受乱序样本,请参阅以下配置片段
limits:
# Allow ingestion of out-of-order samples up to 5 minutes since the latest received sample for the series.
out_of_order_time_window: 5m
按租户配置乱序样本摄取
如果您的 Mimir 启用了多租户功能,您仍然可以使用前述方法为所有租户设置默认的乱序时间窗口阈值。如果特定租户需要自定义阈值,您可以使用运行时配置设置每个租户的覆盖。
- 启用运行时配置。
- 为需要自定义乱序时间窗口的租户添加覆盖配置
overrides:
tenant1:
out_of_order_time_window: 2h
tenant2:
out_of_order_time_window: 30m
将 out_of_order_time_window
设置为 0s
将禁用乱序摄取,但您仍然可以继续查询已摄取的乱序样本。
启用乱序摄取时的查询缓存
一旦查询被缓存,稍后摄取的乱序样本可能会改变这些查询结果。
为了解决这个问题,我们建议您将相同的限制配置传递给 query-frontend 组件。它将为落在乱序样本摄取窗口内(即时间戳在 now
减去 out_of_order_time_window
之后)的任何查询缓存条目设置较低的 TTL(存活时间)为 10 分钟。
如果您完全不想缓存此时间窗口内的任何查询,可以将 -query-frontend.max-cache-freshness
设置为与 out_of_order_time_window
相匹配,这样您就不会缓存仍在预期样本到达的时间窗口内的查询。这样做可能会根据查询特性增加您的 Mimir 集群负载。
启用乱序摄取时的记录规则
与上面的查询缓存问题类似,通过记录规则记录的样本可能会因新的乱序样本摄取而过时。因此,如果您运行记录规则的原始查询,应该会看到结果有所差异。差异大小很大程度上取决于您的乱序摄取模式。
如果您恰好有一个较短的 out_of_order_time_window
,例如小于 10 分钟,则可以使用 -ruler.evaluation-delay-duration
将规则评估延迟到该时间。
理解乱序
之前,Mimir 和 Prometheus TSDB 对接受的时间戳有一些规则。
当新的序列样本到达时,Mimir 需要确定该序列是否已存在,以及该样本是否过旧。
- 如果序列存在于 TSDB 的 Head 块中,则传入样本的时间戳必须比该序列存储的最新样本的时间戳新。否则,ingester 会将其视为乱序样本。
- 如果序列不存在,则样本必须在界限内,该界限从 TSDB 的 Head 块最大时间回溯 1 小时(使用 2 小时块范围时)。如果不在界限内,则 ingester 会将其视为越界样本。
实验性的乱序摄取有助于解决这两个问题。
注意
如果您使用 Prometheus 远程写入或 Grafana Agent 写入指标,则不应出现乱序样本。
Prometheus 和 Grafana Agent 保证同一序列的样本按顺序写入。